title | author | date | tags | mathjax | ||
---|---|---|---|---|---|---|
step1 |
66RING |
2022-11-18 |
|
true |
不实现任何逻辑, 只熟悉框架, 流畅触发回调函数打印信息。
- 注册驱动
probe
和remove
方法- 填写
struct virtio_driver
结构体填表, 然后在init()
中使用register_virtio_driver()
注册驱动
- 填写
probe()
中注册设备文件操作方法, 创建设备文件- 驱动注册后会使用
probe()
探测设备, 这时要求注册时的id_table
与底层设备匹配 probe()
中负责创建设备文件, 之类使用misc_register
注册并自动生成设备文件
- 驱动注册后会使用
- 设备使用
probe()
结束后设备文件创建完成- 对设备文件操作会触发绑定的
fops
中的open
,ioctl
,release
- ref
- linux/drivers/nvdimm/virtio_pmem.c
- https://paper.seebug.org/779/
- probe何时调用
- https://www.cnblogs.com/hoys/archive/2011/04/01/2002299.html
- 在总线上驱动和设备的名字匹配,就会调用驱动的probe函数
- 设备id和驱动注册的id:
id_table
中id - 当id被一个驱动占用时就不能被另一个驱动使用
-
struct virtio_device.priv
- probe时初始化, 保存自定义的virtio设备的结构体
-
struct virtqueue
- virtio处理vring的接口
-
virtio_find_single_vq()
- 为virtio设备生成一个
virtqueue
- TODO: 更多细节
- 为virtio设备生成一个
-
ref
-
register_virtio_driver()
- virtio驱动注册接口,
init
时调用, 填表注册 unregister_virtio_driver()
释放,exit
- virtio驱动注册接口,
-
misc_register()
- 在系统创建特殊设备文件, 填表注册
struct file_operations {}
struct miscdevice {}
probe
时刻创建- 注册杂项设备
- 主设备号为10的设备, 次设备号由
.minor
设置 - 注册时自动创建字符设备
misc_deregister()
释放,remove
- 在系统创建特殊设备文件, 填表注册
-
内核态内存申请
kmalloc()
- 线性申请内存, 物理空间连续,
brk()
- 不能超过128KB
kfree()
释放
- 线性申请内存, 物理空间连续,
kzalloc()
kmalloc
后还对申请的内存进行清零kfree()
释放
vmalloc
- 虚拟地址连续, 但物理地址不一定连续
- 对申请大小没有限制
vfree()
释放
QEMU添加虚拟设备, 设备驱动插入后应该能在/dev/vgpu
看到设备。
用户库就是封装与驱动的交互。而最简单的交互就是:
fd = open()
打开设备ioctl(fd)
, 向驱动发送命令
因为用户可能使用库中多条指令, 所以打开设备可以使用单例模式, 当fd已经打开是不再做打开操作。
__builtin_expect(EXP, N)
, 告诉编译器EXP == N
概率很大__builtin_expect(!!(x), 1)
x很可能为真__builtin_expect(!!(x), 0)
x很可能为假