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> 即可。
二、无需旧头文件实现块设备驱动的核心步骤
块设备驱动的核心逻辑并未因头文件迁移改变,核心实现流程如下:
- 分配并初始化
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); - 设置磁盘容量
通过set_capacity()函数指定磁盘总扇区数:set_capacity(disk, TOTAL_SECTOR_COUNT); - 注册磁盘到内核
调用add_disk()完成设备注册,此时磁盘可被系统识别:add_disk(disk); - 实现块设备操作函数集
核心需实现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, }; - 卸载时清理资源
先移除磁盘注册,再释放磁盘对象:del_gendisk(disk); put_disk(disk);
三、注意事项
- 新版本内核中,
alloc_disk()、add_disk()等核心函数仍保持可用,未被废弃 - 分区管理相关的结构体和函数也都整合到了
linux/blkdev.h中,无需额外引入旧头文件
内容的提问来源于stack exchange,提问作者BuBy
相关产品推荐
相关产品推荐

