驱动
解决的问题
设备管理框架
如何发现设备-初始化
中断机制
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个槽位发查询请求
获得对应设备类型
如果返回设备类型id是0就是空设备
virtio驱动基本模型
两条路让内核与模拟器进行通信
最常见左边那条路
通过环形队列方式
一系列连续的物理page,可以创建一个环形队列数据结构
在host可以访问,在guest里映射了
通常以互斥方式通过环形队列通信
还有就是中断,中断触发会调用中断响应函数
适合等待读取大块数据的时候
中断机制和初始化
一开始向stvec注册异常中断向量表
具体响应函数在对应响应组件里,中断向量表在drivers里有相应响应函数,注册进去
cpu收到中断调用对应注册的响应函数
有层次结构,cpu里有个根中断控制器
三个来源
外部设备中断
plic,平台级中断控制器
会进一步具体连到具体的设备上
核级别的中断控制器
每个cpu都有一个
时钟中断
ipi中断
ipi负责多核之间的通信
也叫软中断
但其实硬
是软件通过ipi发送一个核间命令
块设备驱动
组件构成,对上面提供的就是文件系统
提供BlockDriverOps trait
所有具体块设备都会实现这个
内部实现
核心是read_block
write_block
一块内容buf,根据block_id写进去
块设备当成连续的块数组
每个块可以根据索引当做操作单位
文件系统-组件构成
app里带个shell,
包含一系列操作文件的字命令
调用文件系统的通用框架
axfs
管理通用的目录和文件对象
再下一层是具体文件系统实现
抽象对象与对应数据结构
都可以设为一棵树
树根可以挂目录或者文件
子树可以mount到父级的目录节点上
形成多级嵌套
核心就是目录和文件
整个数据结构体,对应mount下面的文件系统
目录和文件会关联VfsNodeOps vfs的通用接口
会由具体的文件系统实现来实现它
比如fat32?
vfsops是针对文件系统本身 也是每一种文件系统实现来支撑的
文件系统节点操作流程
root节点开始 还有一种不是从root是从当前目录开始
unikernel没有这种方式
宏内核里有-有改变当前目录的操作
解析路径,通过lookup方法找到下一级
直到目标节点
找到后进行具体操作
文件系统示例-ext2
一开始有引导块 放引导扇区
块组
开头超级块
都是冗余的,都一样,坏了,可以从其他的修补
整个文件系统的元信息
组描述 包含了文件系统里所有的块的描述符,跟超级块一样冗余
块bitmap 每个bit对应数据块是占用了还是未分配
索引bitmap 对应inode,对应索引区,占用还是没有占用
文件系统mount的意义1
文件系统在内存中展开的一种操作
存储的时候一般采用扁平化的结构
使用文件系统,进行转化 unflatten
变成一个立体结构
mount就是把扁平的展开成立体的形式
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