| 驱动
|
| 解决的问题
|
|
| 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