You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux 5.19.8中genhd.h已移除?块设备驱动模块开发该如何处理?

Linux 5.19+ 块设备驱动中 genhd.h 的替代方案

一、genhd.h 的迁移情况

Linux内核5.15之后的版本中,genhd.h 的内容被拆分整合到了两个头文件:

  • linux/blkdev.h:包含块设备核心结构体(如 gendisk、disk_part_t)和核心操作函数(如 alloc_disk()、add_disk()、del_gendisk()),这是块设备驱动开发的核心依赖头文件
  • linux/hdreg.h:保留了磁盘几何参数相关的结构体(如 hd_geometry),仅在需要获取或设置磁盘物理参数时引入

你只需将原来的 #include <linux/genhd.h> 替换为 #include <linux/blkdev.h>,如果涉及磁盘几何参数操作再额外引入 #include <linux/hdreg.h> 即可。

二、无需旧头文件实现块设备驱动的核心步骤

块设备驱动的核心逻辑并未因头文件迁移改变,核心实现流程如下:

  1. 分配并初始化 gendisk 结构体
    使用 alloc_disk() 分配磁盘对象,设置主设备号、次设备号范围、设备名称及操作函数集:
    struct gendisk *disk = alloc_disk(1);
    if (!disk) {
        return -ENOMEM;
    }
    disk->major = MY_BLOCK_MAJOR;
    disk->first_minor = 0;
    disk->fops = &my_block_fops;
    strscpy(disk->disk_name, "mydisk", DISK_NAME_LEN);
    
  2. 设置磁盘容量
    通过 set_capacity() 函数指定磁盘总扇区数:
    set_capacity(disk, TOTAL_SECTOR_COUNT);
    
  3. 注册磁盘到内核
    调用 add_disk() 完成设备注册,此时磁盘可被系统识别:
    add_disk(disk);
    
  4. 实现块设备操作函数集
    核心需实现 open、release、submit_bio 等函数,处理设备的打开、关闭及IO请求:
    static const struct block_device_operations my_block_fops = {
        .owner = THIS_MODULE,
        .open = my_disk_open,
        .release = my_disk_release,
        .submit_bio = my_disk_submit_bio,
    };
    
  5. 卸载时清理资源
    先移除磁盘注册,再释放磁盘对象:
    del_gendisk(disk);
    put_disk(disk);
    

三、注意事项

  • 新版本内核中,alloc_disk()、add_disk() 等核心函数仍保持可用,未被废弃
  • 分区管理相关的结构体和函数也都整合到了 linux/blkdev.h 中,无需额外引入旧头文件

内容的提问来源于stack exchange,提问作者BuBy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:40:56