naos-riscv (dev.c)源码分析(devtmpfs)

设备文件系统(存在于内存)

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命令表:

numberioctl功能
0x01EVIOCGVERSION版本
0x02EVIOCGID设备 ID
0x06EVIOCGNAME设备名
0x07EVIOCGPHYS硬件路径
0x08EVIOCGUNIQ唯一序列号
0x09EVIOCGPROP属性
0x03EVIOCGREP重复延迟
0x18EVIOCGKEY按键状态
0x19EVIOCGLEDLED 状态
0x1bEVIOCGSW开关
0xa0EVIOCSCLOCKID设置时钟
0x91VMware 兼容
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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值