0%

LDD3 study note 1

这是一个什么设备

这是一个内存模拟出来的设备,简单说就是一些内存区域。在用户态,可以对相应的设备
文件read/write,相应的结果是读写这些内存区域中的数据。

这些内存的区域按照下面的数据结构组成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
+-------+         +-------+          +-------+         +-------+   
| list +-------->+ +--------->+ +-------->+ | ....
| | | | | | | |
+---+---+ +-------+ +-------+ +-------+
| ...
+--------+ +-------------------------+
| pointer+----->+ quantum(e.g. 4000) Byte |
+--------+ +-------------------------+
| +-----> ...
+--------+
| |
+--------+
...
+--------+
| |
+--------+
| |
+--------+

可以看到数据只是存在quantum的单元里的,其他的数据结构都是为了索引到这个结构。
这个数据结构的特点是,链表的长度是不固定的(quantum, 指针数组的大小是固定的), 这样
只要一直往这个设备里写数据,链表就不断的加长,同时不断的创建新的quantum, 把数据
存在里面。这个过程可以吃光系统里所有的内存。还有一个特点就是,设备一开始不会分配
quantum, 只有有数据需要写入,又没有quantum时才开始分配。所有分配的quantum在模块
卸载时释放掉。同时,设备的读写函数设计成如果一次读写的数据超过一个quantum的界限,
那么只读写当前一个quantum中的数据。

open/release/read/write的实现

open: 把scull_dev挂成struce file的数据,方便以后其他的操作找到设备
read/write: …
release: 关闭文件的时候要调用到, 对scull_dev不做处理。模块退出的时候, 释放设备对应的
内存, 这个操作应该是在exit函数里,不放到这里。

调试宏

在代码中插入了一些断言的宏,方便调试。

自动创建设备节点

LDD3源代码中是加了一个脚本创建设备节点,这里创建一个class, 然后在class里创建这个
字符设备对应的设备文件。模块加载时会自动在/dev下创建设备文件。