设备文件系统(存在于内存)
devtmps = 存在于内存里的/dev文件系统 + 设备转发器。
devtmps做了三个核心的事情:
1、提供一个/dev目录(在内存中)。
2、/dev下的“文件“既可以是普通内存文件,也可以是设备的代理。
3、把用户程序对/dev/xxx的操作-》转发到真正的device driver。
这里是devtmpfs在vfs里面的文件系统id(fsid)。VFS用它区分”这个node属于那个fs“
mount / unmount 跨fs操作时候使用。

devtmpfs的操作锁

这里是双根目录
fake_devtmpfs_root :系统启动初期临时/dev.
devtmpfs_root: 当真正mount后的/dev.

这里是一个占位函数,用在callback里面。(就是当前系统还不支持。暂时给个空实现)

空实现,因为devtmpfs不需要维护inode引用计数,维护open状态,也不需要私有上下文。

和open一样,devtmpfs没有打开状态(也就是资源无需释放)

第一句的if,判断如果是块设备或者字符设备。就会直接转发到驱动层。
否则就是 ”普通内存文件“。然后去读内存。

这里是devtmpfs_write和read逻辑对称:
设备->device_write.
普通内存文件->写入content,必要时候realloc。(alloc memcpy free)

devtmpfs_readlink(符号链接解读)
从symlink内容中--》解析目标路径--》生成相对路径

这里的devtmpfs_mkdir:简单的设置权限。

这里是创建普通内存文件(使用malloc和alloc_frames_bytes)

创建设备节点(有设备号)
if判断是块设备还是字符设备。else是普通内存文件

symlink的内容就是保存字符串name。(size存放了name的长度。同时继承了目标类型)

这里是把假/dev移到真实/dev上。同时会保护原fsid。可以回滚(unmouont)

反向操作:
把内容merge回fake_devtmpfs_root.
恢复原fsid
devtmpfs_root重置。

这里能看到都是stub。

devtmpfs不处理ioctl,只进行转发。

这里对块设备和字符设备进行device_map。对普通文件使用general_map.

这里也是对poll只进行转发。不处理poll。

这里用于truncate/ftruncate.扩容内存buffer

这就是ls -l 能显示文件大小的来源。

释放handle资源。

这里是devtmpfs挂载到VFS的函数表。

这里是为了去注册到VFS:使得mount成为可能。

从函数名翻译(输入设备事件读),再看参数buf。功能:从输入设备“事件缓冲区”读出事件数据。
cat /dev/input/event0
circular_int_read(这是从缓冲区中读取事件)

这里是todo,输入设备通常不支持写,这里只是为了让用户写的时候不会死掉。

inputdev_ioctl:
这里进行四字段解析(采用linux ioctl 编码格式)
设备类别、输入/输出、命令号、数据长度。

这里针对事件位图进行查询。查支持的按键、支持的事件类型、支持的轴
else if:轴信息

TCFLSH:tty flush

后面是ioctl命令表:
| number | ioctl | 功能 |
|---|---|---|
| 0x01 | EVIOCGVERSION | 版本 |
| 0x02 | EVIOCGID | 设备 ID |
| 0x06 | EVIOCGNAME | 设备名 |
| 0x07 | EVIOCGPHYS | 硬件路径 |
| 0x08 | EVIOCGUNIQ | 唯一序列号 |
| 0x09 | EVIOCGPROP | 属性 |
| 0x03 | EVIOCGREP | 重复延迟 |
| 0x18 | EVIOCGKEY | 按键状态 |
| 0x19 | EVIOCGLED | LED 状态 |
| 0x1b | EVIOCGSW | 开关 |
| 0xa0 | EVIOCSCLOCKID | 设置时钟 |
| 0x91 | VMware 兼容 | |
| default | 打印并返回错误 |
这里是事件轮询,查询是否有可读事件。
如果有数据+用户等待读

设备节点注册:在/dev下创建节点。
1、路径拼接
2、然后建立dev node。
3、块设备,存储分区结构体
4、计算大小(块设备的)

/dev 文件系统初始化。
1、注册devtmpfs
2、创建/dev
3、设置为根
4、标记初始化完成

nulldev_read -》返回 0
nulldev_write -》丢弃
nulldev_ioctl ->no-op
等价于 /dev/null

这里进行控制台链接

标准IO初始化。
注册null设备。
初始化pty、初始化ptmx、初始化pts。

环形缓冲区 = 输入事件的队列。



这里是计算有多少可以读的字节。

把事件塞入buffer。

2895

被折叠的 条评论
为什么被折叠?



