驱动
|
解决的问题
|
|
AllDevices全局变量
|
有一个类型,container有feature来控制以何种方式来控制下面的设备instance
|
默认是static,采用泛型方法
效率高
|
|
每种类型只能管理一个设备
|
就是网络/块设备/显示,都只能对应一个加起来3个
|
|
|
使用dyn就是动态管理,可以管理多个设备
|
效率稍低
|
|
|
|
|
发现与初始化
init_drivers来发现和初始化设备
|
probe基于bus发现设备,逐个匹配驱动初始化
|
两种机制
pci总线
|
x86平台常用方式
|
|
mmio总线
|
适用于嵌入式平台
|
基于设备树方式,目前没有使用FDT设备树解析,直接用配置的方式
|
|
现在走mmio,里面有个for_each_drivers宏来加入设备
|
|
|
以qemu平台为例
用了那个宏 for_each_drivers
|
就是把具体的结构注册到alldevices的结构里
|
宏结束后,alldevices里就包含了具体设备
|
|
|
virtio设备的probe过程
qemu下的一种特殊设备,也是qemu下最常见设备,就是virtio设备
|
那一行-device vir...可以模拟出一个块设备
|
|
也可以如图模拟出virt-net设备
|
会向预先guest里准备好的8个槽位注册
|
|
probe过程就是对8个槽位发查询请求
|
获得对应设备类型
|
|
|
|
|
virtio驱动基本模型
两条路让内核与模拟器进行通信
|
|
最常见左边那条路
|
通过环形队列方式
|
一系列连续的物理page,可以创建一个环形队列数据结构
|
在host可以访问,在guest里映射了
|
通常以互斥方式通过环形队列通信
|
|
|
还有就是中断,中断触发会调用中断响应函数
|
适合等待读取大块数据的时候
|
|
|
|
中断机制和初始化
一开始向stvec注册异常中断向量表
|
具体响应函数在对应响应组件里,中断向量表在drivers里有相应响应函数,注册进去
|
cpu收到中断调用对应注册的响应函数
|
|
三个来源
外部设备中断
|
plic,平台级中断控制器
|
会进一步具体连到具体的设备上
|
|
核级别的中断控制器
|
每个cpu都有一个
|
时钟中断
|
ipi中断
|
|
ipi负责多核之间的通信
|
也叫软中断
|
但其实硬
|
是软件通过ipi发送一个核间命令
|
|
|
|
|
|
块设备驱动
组件构成,对上面提供的就是文件系统
|
提供BlockDriverOps trait
|
所有具体块设备都会实现这个
|
|
|
内部实现
核心是read_block
|
write_block
|
|
|
|
|
|
|
文件系统-组件构成
|
|
抽象对象与对应数据结构
都可以设为一棵树
|
|
树根可以挂目录或者文件
|
子树可以mount到父级的目录节点上
|
形成多级嵌套
|
|
核心就是目录和文件
|
|
整个数据结构体,对应mount下面的文件系统
|
|
目录和文件会关联VfsNodeOps
|
vfs的通用接口
|
vfsops是针对文件系统本身
|
也是每一种文件系统实现来支撑的
|
|
|
文件系统节点操作流程
root节点开始
|
还有一种不是从root是从当前目录开始
unikernel没有这种方式
|
宏内核里有-有改变当前目录的操作
|
|
解析路径,通过lookup方法找到下一级
|
直到目标节点
|
找到后进行具体操作
|
|
|
|
|
文件系统示例-ext2
一开始有引导块
|
放引导扇区
|
块组
|
开头超级块
|
都是冗余的,都一样,坏了,可以从其他的修补
|
整个文件系统的元信息
|
|
组描述
|
包含了文件系统里所有的块的描述符,跟超级块一样冗余
|
块bitmap
|
每个bit对应数据块是占用了还是未分配
|
索引bitmap
|
对应inode,对应索引区,占用还是没有占用
|
|
|
|
文件系统mount的意义1
文件系统在内存中展开的一种操作
|
|
存储的时候一般采用扁平化的结构
|
|
使用文件系统,进行转化
|
unflatten
|
变成一个立体结构
|
|
|
|
|
|
mount的意义2
把另一个文件系统嫁接到当前的文件系统目录下
|
子树会覆盖掉mount的子节点
|
|
|
实现
unikernel比linux实现简单,
|
rootdirectory里保持一个列表mounts
|
mountpoint两个部分构成
一个是path
|
mount到哪个路径哪个节点上
|
另一个是子文件系统树的文件系统
|
|
|
lookup的时候
|
|
|
|
Generated
2025-05-05 04:17:35 +0000
25bcfca-dirty
2025-05-04 14:47:56 +0000