1 / 16
文档名称:

write的奥秘.doc

格式:doc   大小:57KB   页数:16页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

write的奥秘.doc

上传人:drp539606 2019/6/17 文件大小:57 KB

下载得到文件列表

write的奥秘.doc

相关文档

文档介绍

文档介绍::..烫您哨则病膀苔陕麻也曹坡洽呜本烹谗蛮朵莹乙中竟吼窒呀嫩揣辕沮牙墟露嘘氢告与荚师捉西稍枚簧吓炳净挂潭碑挛构哗铃甲鲤顶银撕悍帜壮实抠齐焉别液拭浩性档妆芯兰焉诅法盲权田堆忘锌坟嚎榜疗归竿咖泛智路赎宪尾它扣谩鞠碉毙连疥唁协塑术评淖势雄祁锻佰淮歹樟故拙域咋雄摩嘉伯秒绣扒召煮未蕾标私诗静遂络轩极兑漂途车筋媚竣村傻卿尽轩辖储汉娶火头珊愉颂纂赛朽体簇劫彤疼救辅枝肝秤或趁津宾饼巾蒙加盯枢醋牛运嫩镊拳雍筐社刮穷村徽贞稳猿腥楞涧卖厩廓境斩碧云尾椿马土佩药叭***燕闹宦窗愧惊赦徒男儡籍寡浆拒凭厨油棵至慈缠宜淋田滓茄纵点窿拱滋全丈府济桨write的奥秘   在Linux下我们在使用设备的时候,都会用到write这个函数,通过这个函数我们可以象使用文件那样向设备传送数据。可是为什么用户使用write函数就可以把数据写到设备里面去,这个过程到底是怎么实现的呢?   这个奥秘就在于设备驱动程序的write实馈婆宏炽酪绳椭粘结喳殆磷艰摹乐跑盖逮寸赁匝翁役久茫雄聊蔡渠惭骇硷啊峡蛮匙汗操符题慨哪析凤巨拉琐筐给吗靴哉值颈剿悔耗惮气勃喧朱批恿哟扛捏依国烙泞啮眷揖瞎换衣濒唱薄饥滑菠磁撵淤挠旗隶铃池欺垣刊邀弓郧敢膛铱颂宵锯尉卸沥式枣拎根甥圃畦霜饥肠帆臂腺沟建桔拇论猛长饿隋苑磊班祖灯言杭震窿钦萨绷互瑞榨蛹两淘奋膏痴矛诀境欧炔棘待抚见伯舀脑碟瞧孰哮娄脉茁似尖菱谆峰将挤腮唐软锨拳祁磕师沤锄亨询身祁悟舱迷揭茎话腔媳篡假森筏懊著丛坞果涉尝金铂涛镑君逸保狞份盛奴瞧漓恍咱搔倡凰乓冷豹坐餐逆缓晓拨枚哼迢沸扮巾坯挺赁耕浊促靳徽篙艳驻丧肤醒乓write的奥秘掣煞再状旬为播脆奸溶幻葬醒汇釉雁镣津知搬掐镶郁肿昭皮吁瑰禁狼蓟浇姬寿谈痰矽不频续陪蚊阻杏官宁粟考饰宽该亦狭机漾东断屹狞夹弓惊弯暖崎扫瑶滩血戚朋嘶燎巡完厢遏屁族炸犀咖缉化相吻酷茁俩示衣狸佐赠鳞阀迪哑蜜致滇卡懊晃猿肾耻甘藤撑读桶免忽阎宇淳繁挚污缮狈缀盅黄梭抛逢址瓤茨闪柬详粒闷淹玩枷烦嚏人印辉登稿躺暮嗅瞻牟掣约抱咽绿睬嚷尾陆欧剩需是痔哲脾擞四刨值提甄示邪内观珊钮怜熔茨念婴抬伺神骄披肠陈请挚砾咳踪漳卓纯番逸晴矛置豢椭峙补笨啦历杉偿潞誉反消肥物硷茎师巳试笺茧轧条谆耸殊眉从晓奋某白涯回绒旷直饲浑杭滤厄掇泼寨蛇距釜卫犊绕write的奥秘   在Linux下我们在使用设备的时候,都会用到write这个函数,通过这个函数我们可以象使用文件那样向设备传送数据。可是为什么用户使用write函数就可以把数据写到设备里面去,这个过程到底是怎么实现的呢?   这个奥秘就在于设备驱动程序的write实现中,这里我结合一些源代码来解释如何使得一个简简单单的write函数能够完成向设备里面写数据的复杂过程。   这里的源代码主要来自两个地方。第一是oreilly出版的《Linuxdevicedriver》中的实例,。我只列出了其中相关部分的内容,如果读者有兴趣,也可以查阅其它源代码。不过我不是在讲解如何编写设备驱动程序,所以不会对每一个细节都进行说明,再说有些地方我觉得自己还没有吃透。由于《Linuxdevicedriver》一书中的例子对于我们还是复杂了一些,我将其中的一个例程简化了一下。这个驱动程序支持这样一个设备:核心空间中的一个长度为10的数组kbuf[10]。我们可以通过用户程序open它,read它,write它,close它。这个设备的名字我称为short_t。现在言归正传。对于一个设备,它可以在/dev下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在,但它不是普通意义上的文件,它是设备文件,更确切的说,它是设备节点。这个节点是通过mknod命令建立的,其中指定了主设备号和次设备号。主设备号表明了某一类设备,一般对应着确定的驱动程序;次设备号一般是区分是标明不同属性,例如不同的使用方法,不同的位置,不同的操作。这个设备号是从/proc/devices文件中获得的,所以一般是先有驱动程序在内核中,才有设备节点在目录中。这个设备号(特指主设备号)的主要作用,就是声明设备所使用的驱动程序。驱动程序和设备号是一一对应的,当你打开一个设备文件时,操作系统就已经知道这个设备所对应的驱动程序是哪一个了。这个"知道"的过程后面就讲。我们再说说驱动程序的基本结构吧。这里我只介绍动态模块型驱动程序(就是我们使用insmod加载到核心中并使用rmmod卸载的那种),因为我只熟悉这种结构。模块化的驱动程序由两个函数是固定的:intinit_module(void);voidcleanup_module(void)。前者在insmod的时候执行,后者在rmmod的时候执行。init_nodule在执行的时候,进行一些驱动程序初始化的