ll_rw_block()是块设备驱动层, 向上提供按 block 读写块设备到某个内存地址的 (是以 page 为目标单位) 方法.
bread()是块设备缓冲层, 磁盘上的 block 用页缓存.先从这个缓存里找, 找不到再调用 ll_rw_block()读进来.
各个文件系统, 要向 vfs 层提供 read_inode()这样的接口, 而 read_inode()的内部, 就会用到 bread()这样的函数.
- void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]);
- //rw: 读写标志位, nr:bhs[]长度, bhs[]: 要读写的数据数组
- struct buffer_head {
- unsigned long b_state; // 缓冲区状态标志
- struct buffer_head *b_this_page; // 页面中的缓冲区
- struct page *b_page; // 存储缓冲区位于哪个页面
- sector_t b_blocknr; // 逻辑块号
- size_t b_size; // 块的大小
- char *b_data; // 页面中的缓冲区
- struct block_device *b_bdev; // 块设备, 来表示一个独立的磁盘设备
- bh_end_io_t *b_end_io; //I/O 完成方法
- void *b_private; // 完成方法数据
- struct list_head b_assoc_buffers; // 相关映射链表
- /* mapping this buffer is associated with */
- struct address_space *b_assoc_map;
- atomic_t b_count; // 缓冲区使用计数
- };
摘自(这篇写的特别好): 22.Linux - 块设备驱动之框架详细分析(详解) https://www.cnblogs.com/lifexy/p/7651667.html
来源: http://www.bubuko.com/infodetail-3348617.html