框架: app: open,read,write "1.txt" --------------------------------------------- 文件的读写 文件系统: vfat, ext2, ext3, yaffs2, jffs2 (把文件的读写转换为扇区的读写) -----------------ll_rw_block----------------- 扇区的读写 1. 把"读写"放入队列 2. 调用队列的处理函数(优化/调顺序/合并) 块设备驱动程序 --------------------------------------------- 硬件: 硬盘,flash 分析ll_rw_block for (i = 0; i < nr; i++) { struct buffer_head *bh = bhs[i]; submit_bh(rw, bh); struct bio *bio; // 使用bh来构造bio (block input/output) submit_bio(rw, bio); // 通用的构造请求: 使用bio来构造请求(request) generic_make_request(bio); __generic_make_request(bio); request_queue_t *q = bdev_get_queue(bio->bi_bdev); // 找到队列 // 调用队列的"构造请求函数" ret = q->make_request_fn(q, bio); // 默认的函数是__make_request __make_request // 先尝试合并 elv_merge(q, &req, bio); // 如果合并不成,使用bio构造请求 init_request_from_bio(req, bio); // 把请求放入队列 add_request(q, req); // 执行队列 __generic_unplug_device(q); // 调用队列的"处理函数" q->request_fn(q); 怎么写块设备驱动程序呢? 1. 分配gendisk: alloc_disk 2. 设置 2.1 分配/设置队列: request_queue_t // 它提供读写能力 blk_init_queue 2.2 设置gendisk其他信息 // 它提供属性: 比如容量 3. 注册: add_disk 参考: drivers\block\xd.c drivers\block\z2ram.c 测试3th,4th: 在开发板上: 1. insmod ramblock.ko 2. 格式化: mkdosfs /dev/ramblock 3. 挂接: mount /dev/ramblock /tmp/ 4. 读写文件: cd /tmp, 在里面vi文件 5. cd /; umount /tmp/ 6. cat /dev/ramblock > /mnt/ramblock.bin 7. 在PC上查看ramblock.bin sudo mount -o loop ramblock.bin /mnt 测试5th: 1. insmod ramblock.ko 2. ls /dev/ramblock* 3. fdisk /dev/ramblock