⑲tiny4412 Linux驱动开发之块设备驱动程序

本文介绍了Linux块设备驱动程序,包括扇区、块和段的概念,强调扇区是硬件设备的最小读写单位,块是虚拟文件系统的基本单位。文章讨论了块设备驱动的框架,涉及I/O调度器的作用和不同调度算法,并提供了一个简单的块设备驱动程序示例,该示例使用RAM模拟硬盘。
摘要由CSDN通过智能技术生成

之前说过了字符设备,网络设备(USB网卡),就差块设备没有说过了,本次就来介绍一下块设备,在Linux里有一种不严谨的说法叫:一切皆文件,实际上比如进程就不是文件,可它却是实实在在存在的东西,而且特别重要,但从这句话中还是可以看出文件是Linux里抽象出来的重要概念,在Linux里的设备主要分为:字符设备,块设备和网络设备,其中,前两种用文件IO操作,后边一种用socket操作,本次说的是块设备,和以往字符设备编程不同的是,在Linux中块设备没有read/write接口,因为市面上很多块设备是不支持按位和随机读写的,比如Nand Flash, HDD硬盘, 它们需要按页操作,当然,现在比较先进的NorFlash是可以按位读写的,但是单片容量太小了(目前国产厂商能做到256M),而且很贵,我是微电子出身,之前看过Nand Flash和NorFlash的原理,Nandflash需要两个逻辑门配合,NorFlash只需要1个就可以了,按说,硬件成本上应该减小好多,为什么反而贵?

反正因为历史原因,Linux上对于块设备不是按位操作的,它操作的最小单位是扇区,进行读写时,则使用块作为单位,说到这里我们来看一下Linux中的一些概念:

1,扇区

磁盘上的每个磁道被分为若干个弧段,这些弧段便是磁盘的扇区.磁盘驱动器再向磁盘读取和写入数据时,要以扇区为单位.至少出于两种原因,必须以扇区为单位进行读写:一是磁盘设备很难对单个字节进行定位;二是为了达到良好的性能,一次传送一组数据的效率比一次传送一个字节的效率要高.

在大多数磁盘设备中,扇区的大小一般是512~4096 byte.注意,即使程序只读取一个字节的数据,也应该传递一个扇区的数据.Linux系统中,扇区的大小历来都是512字节.内核模块中都是以512字节来定义扇区大小的.这就引起了一个问题,目前的很多块设备的扇区也有大于512字节的,Linux的解决方式是,内核依然使用512字节的扇区.例如光盘设备的扇区大小是4096字节,光驱读取一次将返回4096个字节,内核将这4096个字节看成8个连续的扇区.在内核看来,好像读取了8次设备一样.

2,块

扇区是硬件设备传送数据的最小单位,硬件一次传送一个扇区的数据到内存中.与扇区不同,块是虚拟文件系统传送数据的基本单位.在Linux系统中,块的大小必须是2的幂,而且不能超过一个页的大小.此外,块必须还是扇区大小的整数倍,所以一个块可以包含若干个扇区.在x86平台上,页的大小是4096字节,所以快的大小可以是512, 1024, 2048, 4096字节,Linux系统的块大小是可以配置的,默认情况下是1024字节.

3,段

一个段就是一个内存页或者内存页的一部分.例如页的大小是4096字节,块的大小是2个扇区,即1024字节,那么段的大小可以是1024, 2048, 3072, 4096字节.也就是段的大小只与块有关,而且是块的整数倍,且不超过1页.这是因为Linux内核一次读取磁盘的数据是一个块,而不是一个扇区.页中块的开始位置必须是块的整数倍偏移的位置,也就是0, 1024, 2048, 3072.一个大小为1024字节的段可以开始于页的如下位置:

4.扇区,块和段的关系

理解扇区,块和段的概念对驱动开发非常重要.扇区是由物理磁盘的机械特性决定;块缓冲区由内核代码决定;段由块缓冲区决定,是块缓存大小的整数倍,但不超过1页;这三者的关系如下图:

下面,我们来看一下块设备的框架:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值