🚀 前言
本文首先介绍块设备的概念,其次介绍块设备初始化,初始化部分只是对request数组进行初始化,对应书中第15回。希望各位给个三连,拜托啦,这对我真的很重要!!!
🏆 什么是块设备
块设备(Block Device)承载了文件系统的运行,管理磁盘存储的核心逻辑。其是Linux中用于存储数据的硬件抽象,允许以固定大小的块(512字节或4KB)为单位进行数据读写。区别于字符设备,块设备支持随机访问,适合磁盘存储设备,如硬盘,固态硬盘,U盘,虚拟块设备等,可以通过lsblk
指令查看。
🏆 块设备初始化 blk_dev_init
将硬盘数据读取到内存中,需要块设备驱动程序、文件系统、缓冲区等的支持。这里先来看一下块设备初始化,其代码如下所示:
#define NR_REQUEST 32
void blk_dev_init(void)
{
int i;
for (i=0 ; i<NR_REQUEST ; i++) {
request[i].dev = -1;
request[i].next = NULL;
}
}
做的事情很简单,就是给request
数组的dev
和next
进行初始化。麻烦的是这个request
数组,这个数组是request类型,其定义如下所示:
struct request request[NR_REQUEST];
struct request {
int dev; /* -1 if no request */
int cmd; /* READ or WRITE */
int errors;
unsigned long sector;
unsigned long nr_sectors;
char * buffer;
struct task_struct * waiting;
struct buffer_head * bh;
struct request * next;
};
成员变量 | 含义 |
---|---|
dev | 设备号,-1表示空闲 |
cmd | 命令,表示这次操作是READ还是WRITE |
errors | 操作时产生的错误次数 |
sector | 起始扇区 |
nr_sectors | 扇区数 |
buffer | 数据缓冲区,即读盘后数据放在内存中的什么位置 |
waiting | 一个进程,表示是哪个进程发起了这个请求 |
bh | 缓冲区头指针 |
next | 指向下一个请求(request) |
上面request
结构的成员变量很多,但是我们想想我们的需求,假设这个块设备是硬盘,我们需要操作,首先需要知道是读还是写(cmd
变量),其次得知道要读取或者写入的地址(sector
和nr_sectors
变量),最后得知道读取后存放内存的位置或者写入数据存放内存的位置(buffer
变量)。其他参数都是为了更好地配合对块设备进行操作的,把多个读写块设备的请求组织起来。如下所示:
🎯总结
本文讲的较少,主要就是讲了块设备的初始化,实际上就是初始化request数组,这个结构里面指定了操作是读还是写,从哪里读写,内存里面的位置在哪。
📖参考资料
[1] linux源码趣读
[2] 一个64位操作系统的设计与实现
[3] 块设备 - 想进阶的必经之路!