首页 > 解决方案 > 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 的用法。

这似乎类似于链表节点,但我不确定。请帮忙。如果以上信息不正确,请随时纠正我。

标签: linuxlinux-kernellinux-device-driver

解决方案


主设备号不一定与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 映射到相同的主设备号。当使用主设备号 0 调用时,分配范围 [1, 254] 中未使用的主设备号的代码register_blkdev通过查找范围 [1, 254] 中尚未分配的索引来实现。分配未使用的主编号的代码有改进的空间(至少到并包括在撰写本文时最新的内核版本 5.10),因为它只检查未使用的索引。例如,如果未注册主编号 254,但已注册主编号 509,则由于两个主编号映射到相同的索引 254,因此在这种情况下不会动态分配主编号 254,即使它可用。


推荐阅读