笔记整理—linux驱动开发部分(13)块设备

①首先块设备的访问策略不同于字符设备,一块为单位进行访问;②同一个设备可以同时支持块设备与字符设备驱动;③设备本身物理特性决定了其访问策略何者更合适;④块设备自身驱动层支持缓冲区,字符设备没有缓冲区;⑤块设备驱动更适合存储类设备。

块设备的特性:①字符设备只能顺序访问,不支持随机访问,但块设备支持随机访问;②传统机械式块设备支持随机访问,但连续访问的效率更高,因此碎片整理的连续访问数据效率更高;③Nand SD卡一类电脑设备随机访问效率等同于顺序的效率。

块设备的几个单位:扇区、块、段、页。

扇区(sector):源于磁盘时代,一般为512字节的倍数(硬盘、DVD一类)。

块(black):源于文件系统,是文件系统处理数据的基本单位,一般为512字节的倍数。

段和页都源于内核的段页式访问管理。段(section)源于内核,是内核管理内存的方法管理一个页或部分页;页(page)源于内核,是内核内存映射的基本单位。

块设备对下以sector为单位管理块设备(扇区)<-驱动;对上以block为单位进行文件交互<-文件系统、应用。块设备与字符设备在应用层不同,字符设备一般以(/dev/block/xxx或dev/sdenx)进行操作,但块设备一般通过文件系统进行管理与简洁的操作。

块设备映射为VFS(虚拟文件系统)去使用多种文件系统。

分层理论:

I/O调度算法:电梯算法------多电梯联合算法,电梯的上下<=>R/W。

块设备驱动重要结构体:

复制代码
struct request     //对设备进行一次操作,挂载到请求链
struct request_queue    //请求队列,I/O调度层进行算法调度
struct bio    //如何完成request请求
struct gendisk    //描述一个磁盘分区/一个磁盘设备可用于注册设备

randisk:内存虚拟磁盘,用内存去虚拟一个设备。

一个块设备(LDD3为实例)信息体在/proc/device;/proc/partitions;/dev/;/smod中。

在内核中,磁盘分区与一整个磁盘是平等的,如:

复制代码
cat /proc/partitions

mmcblk0    //主设备

mmcblk0p1    //分区
mmcblk0p2    //分区
mmcblk0p3    //分区

used by被几个使用。

块设备驱动的使用方法:格式化+挂载。mkfs ext2 xxx将一个块设备格式化为ext2格式;mount -t ext2 xxx yyy(挂载点)将一个ext2格式设备进行挂载。umount yyy卸载。

insmod时分配内存,就算反复挂载也是用到同一个内存,除非rmmod。

register_blkdev()注册驱动,kernel/block/genhd.c等同于ewgister_chrdev()的地位,返回主设备号。

alloc_disk(n);n是次设备个数,分区个数+1(通用块层提供)。struct gendisk *xxxxx=alloc_disk(1);表示一个磁盘设备或一个分区,实现不分区,并实例化。

复制代码
struct request_queue *my_queue;等待队列结构体
my_queue=blk_init_queue(do_my_taamblock_request(回调函数),&my_ramblock_lock(自旋锁));

实例化一个等待队列,将来的r/w将会被加入其中,I/O调度会使用回调函数去处理队列中的request,取出一个请求时,会调用这个函数去对操作进行处理。

复制代码
unsigned char *my_ramblock_buf;虚拟块设备内存指针
my_ramblock_buf=kzalloc(大小,分配方式);
add_disk(my_ramblock_buf);
do_my_ramblock_request();处理调度方法
req=blk_fetch_request();从i/o调度层获取请求(已调度过),后依照请求,进行r/w方法rq_data_dir()
相关推荐
万物智能信息科技4 分钟前
MIPI DSI屏幕输出—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
嵌入式硬件·华为·开源·harmonyos·鸿蒙
Mr-Apple6 分钟前
系统找不到指定的文件-CreateInstance/CreateVm/HCS/ERROR_FILE_NOT_FOUND
linux·windows·ubuntu·wsl
2401_862880829 分钟前
嵌入式开发 --- 51单片机与ARM核心知识
arm开发·嵌入式硬件·51单片机
布裘16 分钟前
【银河麒麟】服务器系统开机黑屏故障排查与修复
linux·运维·服务器·银河麒麟·无法启动
Run_Teenage18 分钟前
嵌入式:理解I2C通信基本原理
stm32·单片机·嵌入式硬件
Zenova EdgeOS31 分钟前
Linux iotop:工业边缘 I/O 高级分析实战
linux·运维·服务器
番茄灭世神42 分钟前
汇顶模拟前端GH3220使用备忘录
c语言·单片机·传感器·模拟芯片·电生理信号处理
新兴AI民工1 小时前
【Linux内核三十九】进程管理模块:CFS负载均衡(四):find_busiest_group决策矩阵与calculate_imbalance
linux
LongRunning1 小时前
【linux】RK3568(五)云服务器-视频推流
linux
恒锐丰科技林技术员1 小时前
EG1151 四开关升降压 DC‑DC 芯片:宽压大功率电源解决方案
经验分享·嵌入式硬件·硬件工程