Skip to content

Latest commit

 

History

History
107 lines (77 loc) · 3.08 KB

dev_step1.md

File metadata and controls

107 lines (77 loc) · 3.08 KB
title author date tags mathjax
step1
66RING
2022-11-18
gpu
qemu
true

第一阶段开发: 打印机

不实现任何逻辑, 只熟悉框架, 流畅触发回调函数打印信息。

最小qemu虚拟设备

最小virtio设备驱动

  1. 注册驱动proberemove方法
    • 填写struct virtio_driver结构体填表, 然后在init()中使用register_virtio_driver()注册驱动
  2. probe()中注册设备文件操作方法, 创建设备文件
    • 驱动注册后会使用probe()探测设备, 这时要求注册时的id_table与底层设备匹配
    • probe()中负责创建设备文件, 之类使用misc_register注册并自动生成设备文件
  3. 设备使用
    • probe()结束后设备文件创建完成
    • 对设备文件操作会触发绑定的fops中的open, ioctl, release

virtio API

API

  • register_virtio_driver()

    • virtio驱动注册接口, init时调用, 填表注册
    • unregister_virtio_driver()释放, exit
  • misc_register()

    • 在系统创建特殊设备文件, 填表注册
      • struct file_operations {}
      • struct miscdevice {}
    • probe时刻创建
    • 注册杂项设备
    • 主设备号为10的设备, 次设备号由.minor设置
    • 注册时自动创建字符设备
    • misc_deregister()释放, remove
  • 内核态内存申请

    • kmalloc()
      • 线性申请内存, 物理空间连续, brk()
      • 不能超过128KB
      • kfree()释放
    • kzalloc()
      • kmalloc后还对申请的内存进行清零
      • kfree()释放
    • vmalloc
      • 虚拟地址连续, 但物理地址不一定连续
      • 对申请大小没有限制
      • vfree()释放

ref

最小用户库

QEMU添加虚拟设备, 设备驱动插入后应该能在/dev/vgpu看到设备。

用户库就是封装与驱动的交互。而最简单的交互就是:

  1. fd = open()打开设备
  2. ioctl(fd), 向驱动发送命令

因为用户可能使用库中多条指令, 所以打开设备可以使用单例模式, 当fd已经打开是不再做打开操作。

API

  • __builtin_expect(EXP, N), 告诉编译器EXP == N概率很大
    • __builtin_expect(!!(x), 1)x很可能为真
    • __builtin_expect(!!(x), 0)x很可能为假