- 博客(289)
- 资源 (5)
- 收藏
- 关注
原创 kdb代码分析(二)
来看另一个函数kdb_init(),显然这个函数就是整个kdb的入口,或者说初始化函数. 12393 + 12394 +/* 12395 + * kdb_init 12396 + * 12397 + * Initialize the kernel debugger environment. 12398 + * 12399 + * Parameters:
2008-02-27 20:28:00 7070
原创 kdb代码分析(一)
这是一个很冷门的话题,它受关注的程度永远也比不上陈冠希老师的摄影作品.不过人在江湖身不由己,因为工作原因我不得不接触它,不得不了解一点kdb的代码.Kdb,也叫kernel debugger.是Linux系统的内核调试器,它是一个开源工具,乃是SGI公司开发的.kdb适用于调试内核空间的程序代码,譬如进行设备驱动程序调试,内核模块的调试.Official的Linux kernel并不包含kdb
2008-02-26 21:07:00 12838 5
原创 比较EHCI和UHCI(一)
摄影艺术家陈冠希老师告诉我们:好的作品,与器材无关,好的作品,与器官无关.有人说,有了EHCI,Intel的上一代USB主机控制器UHCI似乎就将走到被淘汰的边缘.但实际情况是,EHCI和UHCI往往是并存的,它们各有价值,如果说EHCI是一款数码相机,那么UHCI则是陈冠希老师那款记录了无数不朽历史瞬间的手机.中国是摄影大国,大多数摄影爱好者玩着器材,追着器材,一味的追求顶尖的器材,但他们的作品
2008-02-25 19:43:00 11856 6
原创 Linux那些事儿之我是EHCI(5) 2008年的这一场雪
2008年的这一场雪,比以往时候来的要大一些。以前是买不到票,这次有票也走不了了。此时此刻,多少兄弟姐妹被困在路上,饥寒交迫,多少城市停电停水,物价飞涨。我真是忍不住破口大骂,好一个和谐盛世!虽说是天灾,但岂无人祸?直接原因是那该死的冻雨。但我认为罪魁乃是三峡工程,以及所谓南水北调。祝愿那些困在铁路,公路上的人们早日回家团圆,大家过个好年。还是先看看股市,有消息称,"导致大
2008-01-28 21:03:00 7174
原创 闲谈NP
本文扯了扯P,NP,NP-c,NP-hard。作为一个调节,过两天再聊linux。先来看一个小故事,假如老板要你解决一个问题,你绞尽脑汁还是想不出来,叫天天不应,叫地地不灵,这时你走进老板办公室,可以采取3种策略:(1)一副倒霉像,神情ws,可怜巴巴的说:老板,我没做出来,我想我是太蠢了。。。boss:蠢材!滚!(失败。。。)(2)雄赳赳气昂昂跨进老板办公室,大吼一声:
2008-01-19 13:41:00 6908 4
原创 内核中的死锁问题--当UHCI遇上OHCI
上次我上网查资料,突然弹出来一个网页,很黄很暴力,和张殊凡小朋友一样,我赶紧给关了.不过,从此……我天天上网查资料.今天我就给大家介绍一下我的成果.比如有一个网站叫做bugzilla.kernel.org,这是一个Linux hacker云集的网站.这个网站用于汇报Linux内核的那些bug,每当看到这些bug,Linux黑客们就采用各种手段去解决它,包括暴力手段.在2007年的那个枫
2008-01-17 15:47:00 20065 22
原创 Linux那些事儿之我是EHCI(4) data structure of ehci driver and device
阿扁"辞职"了,kde4发布了,更让我激动的是,英雄志过两天又有更新了,这部连载长达8年的小说,终于要进入精彩的大结局。卢云的命运究竟如何?观海云远,四个性格理念完全不同的人,谁是好,谁是坏,谁是对,谁是错?何谓正道?接着上回说,usb_hcd_pci_probe这个函数在"我是UHCI"中也有讨论,不过我想按照我的思路写下去。 46 /**//** 47 * us
2008-01-13 20:55:00 6315 1
原创 Linux那些事儿之我是EHCI(3) pci match 和 probe
pci_bus_type 定义如下, struct bus_type pci_bus_type = ...{ .name = "pci", .match = pci_bus_match, .uevent = pci_uevent, .probe = pci_device_probe, .remove
2008-01-13 15:53:00 5543 1
原创 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-11 15:47:00 8363 2
原创 Linux那些事儿之我是EHCI(2) 套路
子曰:按套路出牌。的确,什么东西都有套路,泡妞有泡妞的套路,花前月下不如花钱日下。打麻将有打麻将的套路,少吃少碰少放炮,多摸多杠多发财。星际有星际的套路,linux也有linux的套路。刘涛姐姐的故事再一次告诉我们,年龄不是问题,身高不是距离,有cai就行。我们不妨看看 modprobe ehci-hcd 之后发生了什么事情。ehci-hcd是一个驱动程序,不知您记不记得我在sysfs中谈论过
2008-01-09 21:31:00 8414 1
原创 Linux那些事儿之我是SCSI硬盘(7)从应用层走来的ioctl
2007年过去了,这一年里明星们一如既往,大牌们继续做领军人物,而希望上位的小辈也使尽手段.该恋爱的恋爱,该炒作的炒作,该整容的整容.功成名就的就做慈善,有待提高的就造绯闻.而我该做的,是继续写我的blog,继续说Linux那些鸟事儿,继续说那些无聊的函数,在说完了sd_probe之后,我们要接触一些新的函数了,首先推出的是ioctl,具体到sd模块中就是sd_ioctl.当我们向scsi磁盘
2008-01-03 19:55:00 11046 1
原创 Linux那些事儿之我是EHCI(1) 接口体系
EHCI首先是一个PCI设备,我们可以lspci一下看看。00:1a:7 USB Controller: Intel Corporation USB2 EHCI Controller #1 (rev 03) 我们与外围硬件打交道,可以把数据用in(out)指令传递给外围硬件,还可以把数据传输到cpu和外围硬件共享的内存里面去。这些都是计算机与硬件的接口。(参见ldd3 第9章)那么我们
2008-01-03 18:10:00 8562 2
原创 Linux那些事儿之我是EHCI 引子
转眼之间,到了2008年,先祝大家新年快乐,希望新的一年里好运连连,工资猛涨。好久没有写了,一个原因在于,作为一个PHD学生,难免要做一些读paper写paper的琐事,另一个原因就是自己太懒了。大哥甲一如既往,坚持的写作,着实让人钦佩。此时此刻,我情不自禁,作诗一首,北飘奇男子,江南大丈夫。海上常常生明月,江湖就此一枝花。不服不行。这里主要就linux ehci host controlle
2008-01-02 19:41:00 8694 8
原创 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
2007-12-25 20:04:00 10122
原创 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
2007-12-25 19:58:00 7252
原创 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
2007-12-25 15:19:00 11240
原创 Linux那些事儿之我是Block层(7)scsi命令的前世今生(一)
现在我们块设备也有了,队列也有了,要提交请求也就可以开始提交了.那就让我们来研究一下如何提交请求如何处理请求吧.不过哥们儿有言在先,出错处理的那些乱七八糟的代码咱们就不理睬了.仍然以scsi磁盘举例,最初scsi这边发送的是scsi命令,可是从block走就得变成request,然而走到usb-storage那边又得变回scsi命令.换言之,这整个过程scsi命令要变两次身.首先让我们从s
2007-12-25 15:03:00 10291 2
原创 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
2007-12-20 15:30:00 7973
原创 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
2007-12-19 20:21:00 10910
原创 Linux那些事儿之我是Block层(4)浓缩就是精华?(一)
人,生在床上,死在床上;欲生欲死,还是在床上.这句话非常有道理.有人说它有点俗,但,我并不这么认为.我因为经常坐在床上一边看A片一边看代码,所以对这句话体会颇深,事实上它形象的描述了我坐在床上看代码时复杂的心情,说欲生欲死,一点也不夸张,尤其是当我看到add_disk()这个无比变态的函数的时候.我不禁感慨,上帝欲使人灭亡,必先使其疯狂;上帝欲使人疯狂,必先使其看Linux内核代码.
2007-12-19 15:34:00 9875 3
原创 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
2007-12-19 14:42:00 8259
原创 Linux那些事儿之我是Block层(2)注册一个块设备驱动
看完了block子系统的初始化之后,我曾一度迷茫过,也曾辗转反侧,也曾苦恼万分,我完全不知道下一步该怎么走,几经思索,思索着我和中国的未来,徘徊过后,彷徨过后,终于决定,和scsi disk驱动同步进行往下走,因为scsi disk那边会调用许多block层这边提供的函数,于是我们就在这边来看看这些函数究竟是干什么的.第一个函数当然就是register_blkdev(). 55
2007-12-19 14:09:00 7887 1
原创 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
2007-12-12 16:07:00 12587 3
原创 Linux那些事儿之我是SCSI硬盘(6)三座大山(三)
接下来,第三座大山是sd_read_cache_type. 1385 /* 1386 * sd_read_cache_type - called only from sd_revalidate_disk() 1387 * called with buffer of length SD_BUF_SIZE 1388 */ 1389 static voi
2007-12-10 18:55:00 12372 5
原创 Linux那些事儿之我是SCSI硬盘(5)三座大山(二)
第二座大山,sd_read_write_protect_flag. 1327 /* 1328 * read write protect setting, if possible - called only in sd_revalidate_disk() 1329 * called with buffer of length SD_BUF_SIZE 1330
2007-12-10 18:48:00 12106 1
原创 Linux那些事儿之我是Block层(引子)
很久以前,天还是蓝的,水也是绿的,庄稼是长在地里的,猪肉是可以放心吃的,耗子还是怕猫的,法庭是讲理的,上床是先结婚的,理发店是只管理发的,药是可以治病的,医生是救死扶伤的,拍电影是不需要陪导演睡觉的,照相是要穿衣服的,欠钱是要还的,孩子的爸爸是明确的,学校是不图挣钱的,白痴是不能当教授的,卖狗肉是不能挂羊头的,男就是男的女的就是女的.那时候Block层还是一部分附属于drivers/目录下一部分附
2007-12-10 18:31:00 11221 4
原创 Linux那些事儿之我是SCSI硬盘(3)磁盘磁盘你动起来!
首先我们看sd_revalidate_disk(),这个函数很重要,一定程度上来说,正是这个函数从硬件和软件两个方面掀起了我们了解scsi磁盘的性高潮.这个函数它不是一个函数在战斗,它完全是贾宝玉林黛玉方世玉附体,由这一个函数可以牵连出N个函数.而这N个函数中的一些函数本身又有好几百行,所以我们算是陷进去了. 1496 /** 1497 * sd_revalidat
2007-12-07 14:29:00 12183
原创 Linux那些事儿 之 我是PCI(5)初始化(二)
.initcall2.init子节中的两个函数已经见识过了,该轮到.initcall3.init子节里的了,就是上边儿表中的acpi_pci_init和pci_access_init,这两个又是谁先谁后那?acpi_pci_init在drivers/pci/pci-acpi.c文件里,而pci_access_init 在arch/i386/pci/init.c文件里,它俩根本就不在同一个目录下面,
2007-12-05 18:43:00 14766 13
原创 Linux那些事儿之我是SCSI硬盘(2)依然probe
虽然scsi disk不难,但是如果你以为scsi disk这个模块每个函数都像init_sd()一样简单,那么我只能说你属于那种被蜘蛛咬了就以为自己是蜘蛛侠,被雷电劈了就以为自己是闪电侠,摸了一次高压电就以为自己是沈殿霞.你不服?咱们来看sd_probe,这个函数就不是那么简单. 1566 /** 1567 * sd_probe - called during d
2007-12-04 21:25:00 9947 3
原创 Linux那些事儿 之 我是PCI(4)初始化(一)
解析完了PCI的那些内核参数,再翻过多少座山跨过多少条河,内核就会遇到init/main.c里一个名叫do_initcalls的函数。do_initcalls对内核来说只不过是漫长冒险旅程中的一个驿站,对PCI这个故事来说却是命运转轮的开始,内核在它里边完成了对.initcall.init节里各种xxx_initcall函数的执行,PCI的那些自然也包括在内。你不用像新东方老罗“我走来走去,为中国
2007-12-01 23:41:00 12377 1
原创 Linux那些事儿之我是SCSI硬盘(1)简简单单初始化
在那茫茫人海中,我找到了这两行, 1886 module_init(init_sd); 1887 module_exit(exit_sd);不要问我它们来自哪里,咱们整个故事就是围绕着drivers/sd.c这么一个文件展开,所以除非特别声明的之外,都是来自这个文件. 1831 /** 1832 * init_sd - entry point f
2007-11-30 17:53:00 9589 2
原创 Linux那些事儿之我是SCSI硬盘-引子
有一天身子问心:"我要是痛了,医生会给我治,你痛了谁给你治啊?"于是心说:"我只能自己给自己治."也许因为这样,每个人都有一个治疗自己心中伤痛的方法.喝酒,唱歌,发火,或哭或笑,跟朋友诉苦,共旅行,跑马拉松,最差的一种方法是逃避这种心痛.我的方法是写这种伪技术的文章.但是写些什么呢?既然有人写了USB,既然有人写了PCI,那么如果不写SCSI,恐怕是天理地理都难容了.就说我们公司吧,机
2007-11-29 21:28:00 11570 6
原创 Linux那些事儿 之 我是PCI(3)PCI的那些内核参数
经过上节的头脑风暴,咱们明白了,PCI这边儿入口虽然多,但还是有规律可循有法可依的,内核启动时,得一个一个严格的按照顺序调用它们来完成PCI子系统的初始化,不能乱了章法。这点儿并不是所有人都会明白的,比如前段儿时间厦门那出儿卖房事件里宣称“我海关有人,谁敢动我”的那位海关老婆,她就觉得有法是不如有人的。(背景知识:厦门网11月14日电,06年11月5日,曾先生夫妻向被告购买了香秀里的这套房子,
2007-11-25 22:59:00 8940 3
原创 Linux那些事儿之我是UHCI(大结局)"脱"就一个字
李小璐脱了,周迅脱了,汤唯脱了.下一个脱的是谁?答案不是林志玲,不是徐静蕾,而是QH.我们知道整个故事里我们一直围绕着QH的队列在说来说去,我们不停的进行着队列操作,我们有时候把QH link起来成一个个的队列,而有时候又把QH从队列里给unlink,我所用的盗版的金山词霸2005告诉我,unlink翻译成中文就是解开,拆开,松开.Okay,简洁一点说,一个字,脱!脱就脱,东风吹,战鼓擂,这个
2007-11-24 23:30:00 3130
原创 Linux那些事儿之我是UHCI(29)FSBR
现在让我们来关注一下fsbr.尽管之前就FSBR本身已经说过了,但是代码中出现了很多关于fsbr的变量以及函数.如果不来梳理一下,恐怕你和我一样,仍然感到无限困惑,无限茫然.那么让我们点亮心灵的阿拉丁神灯,共同穿越这代码的迷朦.struct uhci_hcd中有这么几个成员,unsigned int fsbr_is_on,unsigned int fsbr_is_wanted,unsigned
2007-11-24 23:27:00 6813
原创 Linux那些事儿之我是UHCI(27)实战电源管理(三)
接下来剩下两个重要的函数,uhci_suspend和uhci_resume,不过孤立的看这两个函数没有意义,得结合上下文来看,调用它们的分别是usb_hcd_pci_suspend和usb_hcd_pci_resume,所以我们从这两个函数看起.当然单纯的看这些函数也是没有意义的,这个世界上像灰尘一样多的,除了美女,还有Linux内核中的函数;这个世界上像细菌一样多的,除了帅哥,还有Linux内核
2007-11-22 17:29:00 5627 1
原创 Linux那些事儿之我是UHCI(26)实战电源管理(二)
看了suspend自然就要看resume,在电源管理的世界里,挂起和唤醒是永远被相提并论的一对,它们就像天上的雪花,本来互不相识,一旦落在地上,化成水,结成冰,便再也分不开了!沿着上面的线索我们继续玩.现在我们设置断点wakeup_rh.然后我们插入U盘.不出所料,我们又一次进入了kdb.用bt命令看一下调用堆栈,发现调用wakeup_rh的uhci_rh_resume,调用uhci_rh_r
2007-11-22 17:26:00 3012
原创 Linux那些事儿 之 我是PCI(1)PCI,我们来了
现在这段时间最火的工程是什么?当然不会是PCI这个系统工程了,你即使不是党员也总归是个中国人,是中国人都要毫不犹豫的回答“探月工程”。不过,如果你在两年前就这么问我的话,俺会面带羞涩的回答你,是“中国芯工程”,谁让汉芯偏偏就是俺们交大的那,谁让汉芯又偏偏是假的那,俺无法回答你,俺陈进手下的哥们儿也无法回答你。到现在俺还依稀记得,在2002年的那个秋天,俺刚到交大就遇到陈进时的情景,旁边儿一见多识广
2007-11-16 16:51:00 17015 10
原创 Linux那些事儿之我是UHCI(25)实战电源管理(一)
车上的乘客大家请注意,下一站车上将上来几个小偷,大家一定要看管好自己的钱包和随身携带的物品.——东北某报记者在葫芦岛听到公共汽车售票员这样提示.此刻,我也需要预先提示你,关于uhci,我们如果想结束,现在就可以结束,如果不想,那么继续往前走一点也未尝不可.继续走的话我们会关注电源管理的部分,就如同我们在hub驱动中关注的一样.由于这部分代码颇为抽象,我们于是利用kdb,并且以做实验的方
2007-11-15 21:55:00 3739
原创 Linux那些事儿之我是UHCI(24)等时传输
然后我们可以来看等时传输了.由于等时传输的特殊性,很多地方它都被特别的对待了.从usb_submit_urb开始就显示出了它的白里透红与众不同了.该函数中268行, 判断temp是不是PIPE_ISOCHRONOUS,即是不是等时传输,如果是,就执行下面那段代码.278行,int number_of_packets是struct urb的一个成员,它用来指定该urb所处理的等时传输缓冲区的数量
2007-11-15 17:50:00 4704
Linux那些事儿之我是USB Core(v1.0)
2007-11-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人