linux0.11内核源码修仙传第七章——块设备请求项初始化

🚀 前言

    本文首先介绍块设备的概念,其次介绍块设备初始化,初始化部分只是对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数组的devnext进行初始化。麻烦的是这个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变量),其次得知道要读取或者写入的地址(sectornr_sectors变量),最后得知道读取后存放内存的位置或者写入数据存放内存的位置(buffer变量)。其他参数都是为了更好地配合对块设备进行操作的,把多个读写块设备的请求组织起来。如下所示:

在这里插入图片描述

🎯总结

    本文讲的较少,主要就是讲了块设备的初始化,实际上就是初始化request数组,这个结构里面指定了操作是读还是写,从哪里读写,内存里面的位置在哪。

📖参考资料

[1] linux源码趣读
[2] 一个64位操作系统的设计与实现
[3] 块设备 - 想进阶的必经之路!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值