![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux那些事儿之我是Block层
aaronychen
性格适中,爱好运动
展开
-
Linux那些事儿之我是Block层(引子)
很久以前,天还是蓝的,水也是绿的,庄稼是长在地里的,猪肉是可以放心吃的,耗子还是怕猫的,法庭是讲理的,上床是先结婚的,理发店是只管理发的,药是可以治病的,医生是救死扶伤的,拍电影是不需要陪导演睡觉的,照相是要穿衣服的,欠钱是要还的,孩子的爸爸是明确的,学校是不图挣钱的,白痴是不能当教授的,卖狗肉是不能挂羊头的,男就是男的女的就是女的.那时候Block层还是一部分附属于drivers/目录下一部分附转载 2008-01-31 09:08:00 · 1638 阅读 · 0 评论 -
Linux那些事儿之我是Block层(10)scsi命令的前世今生(四)
当然,while循环结束也可能是因为1453行的这两个判断.首先req如果没有了,另一个得看scsi_dev_queue_ready()的返回值,如果返回值为0,那么break也会被执行,从而结束循环. 1270 /* 1271 * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else转载 2008-01-31 09:14:00 · 2301 阅读 · 0 评论 -
Linux那些事儿之我是Block层(7)scsi命令的前世今生(一)
现在我们块设备也有了,队列也有了,要提交请求也就可以开始提交了.那就让我们来研究一下如何提交请求如何处理请求吧.不过哥们儿有言在先,出错处理的那些乱七八糟的代码咱们就不理睬了.仍然以scsi磁盘举例,最初scsi这边发送的是scsi命令,可是从block走就得变成request,然而走到usb-storage那边又得变回scsi命令.换言之,这整个过程scsi命令要变两次身.首先让我们从s转载 2008-01-31 09:13:00 · 1836 阅读 · 1 评论 -
Linux那些事儿之我是Block层(9)scsi命令的前世今生(三)
下一个更为重要的函数是scsi_dispatch_cmd,来自drivers/scsi/scsi.c: 459 /* 460 * Function: scsi_dispatch_command 461 * 462 * Purpose: Dispatch a command to the low-level driver. 4转载 2008-01-31 09:14:00 · 1504 阅读 · 0 评论 -
Linux那些事儿之我是Block层(8)scsi命令的前世今生(二)
一旦这种狼狈为奸的关系建立好了,就可以开始执行请求了.来看blk_execute_rq(),来自block/ll_rw_blk.c: 2605 /** 2606 * blk_execute_rq - insert a request into queue for execution 2607 * @q: queue to insert the re转载 2008-01-31 09:13:00 · 3051 阅读 · 0 评论 -
Linux那些事儿之我是Block层(6)浓缩就是精华?(三)
第三个,blk_register_queue(). 4079 int blk_register_queue(struct gendisk *disk) 4080 { 4081 int ret; 4082 4083 request_queue_t *q = disk->queue; 4084 4085转载 2008-01-31 09:12:00 · 2327 阅读 · 0 评论 -
Linux那些事儿之我是Block层(4)浓缩就是精华?(一)
人, 生在床上,死在床上;欲生欲死,还是在床上.这句话非常有道理.有人说它有点俗,但,我并不这么认为.我因为经常坐在床上一边看A片一边看代码,所以对这 句话体会颇深,事实上它形象的描述了我坐在床上看代码时复杂的心情,说欲生欲死,一点也不夸张,尤其是当我看到add_disk()这个无比变态的函数的 时候.我不禁感慨,上帝欲使人灭亡,必先使其疯狂;上帝欲使人疯狂,必先使其看Linux内核代码.转载 2008-01-31 09:11:00 · 2022 阅读 · 0 评论 -
Linux那些事儿之我是Block层(1)Block子系统的初始化
于是我们从genhd_device_init()开始看起. 350 static int __init genhd_device_init(void) 351 { 352 int err; 353 354 bdev_map = kobj_map_init(base_probe, &block_subsys_loc转载 2008-01-31 09:08:00 · 2419 阅读 · 0 评论 -
Linux那些事儿之我是Block层(2)注册一个块设备驱动
看完了block子系统的初始化之后,我曾一度迷茫过,也曾辗转反侧,也曾苦恼万分,我完全不知道下一步该怎么走,几经思索,思索着我和中国的未来,徘徊过后,彷徨过后,终于决定,和scsi disk驱动同步进行往下走,因为scsi disk那边会调用许多block层这边提供的函数,于是我们就在这边来看看这些函数究竟是干什么的.第一个函数当然就是register_blkdev(). 55转载 2008-01-31 09:10:00 · 1094 阅读 · 0 评论 -
Linux那些事儿之我是Block层(5)浓缩就是精华?(二)
第二个,register_disk,来头不小,它来自遥远的fs/partitions/check.c: 473 /* Not exported, helper to add_disk(). */ 474 void register_disk(struct gendisk *disk) 475 { 476 struct block_devi转载 2008-01-31 09:11:00 · 2686 阅读 · 0 评论 -
Linux那些事儿之我是Block层(3)驱动不过一出戏,内存申请为哪般?
下一个函数,alloc_disk().在sd.c中咱们传递进来的参数是16. 720 struct gendisk *alloc_disk(int minors) 721 { 722 return alloc_disk_node(minors, -1); 723 } 724 725 struct gendisk *al转载 2008-01-31 09:10:00 · 1155 阅读 · 0 评论 -
Linux那些事儿之我是Block层(12)传说中的内存映射(下)
下面我们来看另一个”映射”函数,blk_rq_map_kern().当我们在设备驱动内部或者scsi mid-level要发送scsi命令给设备的时候,我们会调用这个函数.回首往事,当年在讲scsi命令的时候,在scsi_execute_req()调用了scsi_execute()之后,scsi_execute()中就会调用blk_rq_map_kern()函数.正常情况下它应该返回0,在当年的s转载 2008-01-31 09:15:00 · 1670 阅读 · 0 评论