Chipset: msm8926
OS: Android4.4
Kernel: 3.4.0
相关概念:
块设备与字符设备区别:
- 以块传输,字符设备以字节为单位。
- 有对应缓冲区。
- 可以随机访问。可以不按传输顺序访问,比如访问的是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]