linux - 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 映射到相同的主设备号。当使用主设备号 0 调用时,分配范围 [1, 254] 中未使用的主设备号的代码register_blkdev
通过查找范围 [1, 254] 中尚未分配的索引来实现。分配未使用的主编号的代码有改进的空间(至少到并包括在撰写本文时最新的内核版本 5.10),因为它只检查未使用的索引。例如,如果未注册主编号 254,但已注册主编号 509,则由于两个主编号映射到相同的索引 254,因此在这种情况下不会动态分配主编号 254,即使它可用。
推荐阅读
- python - Scrapy不会带回元素
- python - 如何将 django 中的用户过滤到多对多字段?
- laravel - 如何在 vue.js 文件中集成 Jetstream 身份验证?
- arrays - 为什么可以使用一个类从 Typescript 中的另一个类继承构造函数
- python - 无法指向 Selenium 中的元素
- opc - 如何获取 OPC UA 服务器的 nodeset.xml?
- python - 如何获取当前登录用户的组
- amazon-web-services - 如何在 AWS Sagemaker 中使用 Tensorboard
- java - Java8:操作地图的有效方法
- php - 最新 Stripe API 中的 Stripe 收费目的地账户