[笔记分享] [SD] 块设备驱动学习小结

本文详细介绍了Linux系统中SD卡的块设备驱动,包括块设备与字符设备的区别、主要数据结构如block_device_operations、gendisk、request、request_queue以及bio和bio_vec。讲解了如何注册和注销块设备,以及不使用请求处理函数时的操作,并通过ramdisk为例,展示了块设备驱动的工作流程和关键函数的作用。
摘要由CSDN通过智能技术生成

Chipset: msm8926
OS: Android4.4
Kernel: 3.4.0

相关概念:

块设备与字符设备区别:

  1. 以块传输,字符设备以字节为单位。
  2. 有对应缓冲区。
  3. 可以随机访问。可以不按传输顺序访问,比如访问的是1/10/3/2扇区,可以调整为1/2/3/10扇区。此设计是为了机械类块设备如硬盘设计的,对于SD/EMMC可以直接访问。

Struct block_device_operations:

[blkdev.h]
这里写图片描述
此struct和字符设备的file_operations类似。

需要关注的有open/release/ioctl/getgeo.
Ioctl: 块设备的请求通过此接口。
Getgeo: 根据块设备的信息填充hd_geometry, 里面包含磁头,扇区,柱面,俗称CHS。

Struct gendisk:

[genhd.h]
这里写图片描述
Major: 主设备号。
First_minor: 第一个次设备号。
Minors: 最大支持次设备号数。
Part_tbl: 分区信息。
Part0: 磁盘信息
Fops: 块设备操作函数集。
Queue: 请求队列,用户请求通过队列来处理。

Gendisk相关函数:
1. struct gendisk *alloc_disk(int minors)
分配struct gendisk,驱动不能自己分配,需要调用此接口才行。
Minors表示改磁盘最大能支持多少分区。
2. void add_disk(struct gendisk *disk)
注册disk,在驱动初始化完成之后调用。
3. void del_gendisk(struct gendisk *disk)
4. static inline void set_capacity(struct gendisk *disk, sector_t size)
设置disk容量,以扇区为单位。块设备最小寻址单位是扇区,最常见的是512bytes,还
有其他大小,对于内核,与块设备驱动交互的扇区都以512bytes为单位。
许多块设备一次能传输多个扇区。

Struct request:

[blkdev.h]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值