如何解决Linux 块驱动程序中结构 struct blk_major_name { } 中 struct blk_major_name *next 的任务?
我一直在尝试从 https://linux-kernel-labs.github.io/refs/heads/master/labs/block_device_drivers.html 中了解 Linux 块驱动程序
查看register_blkdev()
函数的后台代码,发现
struct blk_major_name{
struct blk_major_name *next;
int major;
char name[16];
} *major_names[BLKDEV_MAJOR_HASH_SIZE];
我从 register_blkdev()
的代码中了解到:
major = major number of block driver,same as index of array `major_names`
name = name of block driver
但我无法理解上述结构中 next 的用法。
这似乎类似于链表节点,但我不确定。请帮忙。如果以上信息不正确,请随时纠正我。
解决方法
主设备号不一定与 major_names
索引相同。索引在 [0,254] ([0,BLKDEV_MAJOR_HASH_SIZE-1
]) 范围内,但主设备号在 [1,511] ([0,BLKDEV_MAJOR_MAX-1
]) 范围内。主设备号通过 index = major_to_index(major);
散列到索引,相当于 index = major % BLKDEV_MAJOR_HASH_SIZE;
。
多个主设备号可以映射到同一个索引。主设备号 1、256 和 511 都映射到 major_names
索引 1。(三个主设备号映射到索引 1 是最坏的情况。除 1 之外的所有索引都由两个主设备号映射。)>
需要使用 next
的 struct blk_major_name
成员来搜索映射到同一 major_names
索引的所有已注册主要设备号。
索引号 1 到 254 由相同的主设备号映射到。当 register_blkdev
以主设备号 0 被调用时,在 [1,254] 范围内分配一个未使用的主设备号的代码是通过查找 [1,254] 范围内尚未分配的索引来实现的.分配未使用的主编号(至少直到并包括撰写本文时的最新内核版本 5.10)的代码还有改进的余地,因为它只检查未使用的索引。例如,如果主编号 254 尚未注册,但主编号 509 已注册,那么由于两个主编号映射到同一个索引 254,在这种情况下,即使主编号 254 可用,也不会动态分配。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。