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/xiang-yin/p/12093898.html