第一章 [转载]写一个块设备驱动.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第1章++|? ?? ?? ?? ?? ???写一个块设备驱动? ?? ?? ?? ?? ?? ?|++| 作者:赵磊? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? || 网名:OstrichFly、飞翔的鸵鸟? ?? ?? ?? ?? ?? ?? ? || email: zhaoleidd@? ?? ?? ?? ?? ?? ?? ? |++| 文章版权归原作者所有。? ?? ?? ?? ?? ?? ?? ?? ?? ? || 大家可以自由转载这篇文章,但原版权信息必须保留。??|| 如需用于商业用途,请务必与原作者联系,若因未取得??|| 授权而收起的版权争议,由侵权者自行负责。? ?? ?? ? |++同样是读书,读小说可以行云流水,读完后心情舒畅,意犹未尽;读电脑书却举步艰难,读完后目光呆滞,也是意犹未尽,只不过未尽的是痛苦的回忆。研究证明,痛苦的记忆比快乐的更难忘记,因此电脑书中的内容比小说记得持久。而这套教程的目的是要打破这种状况,以至于读者在忘记小说内容忘记本文。在这套教程中,我们通过写一个建立在内存中的块设备驱动,来学习linux内核和相关设备驱动知识。选择写块设备驱动的原因是:1:容易上手2:可以牵连出更多的内核知识3:像本文这样的块设备驱动教程不多,所以需要一个好吧,扯淡到此结束,我们开始写了。本章的目的用尽可能最简单的方法写出一个能用的块设备驱动。所谓的能用,是指我们可以对这个驱动生成的块设备进行mkfs,mount和读写文件。为了尽可能简单,这个驱动的规模不是1000行,也不是500行,而是100行以内。这里插一句,我们不打算在这里介绍如何写模块,理由是介绍的文章已经满天飞舞了。如果你能看得懂、并且成功地编译、运行了这段代码,我们认为你已经达到了本教程的入学资格,当然,如果你不幸的卡在这段代码中,那么请等到搞定它以后再往下看:mod.c:#include linux/module.hstatic int __init init_base(void){? ? ? ? printk(Hello. World\n);? ? ? ? return 0;}static void __exit exit_base(void){? ? ? ? printk(Bye\n);}module_init(init_base);module_exit(exit_base);MODULE_LICENSE (GPL);MODULE_AUTHOR(Zhao Lei);MODULE_DESCRIPTION(For test);Makefile:obj-m := mod.oKDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)default:? ? ? ? $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modulesclean:? ? ? ? $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean? ? ? ? rm -rf Module.markers modules.order Module.symvers好了,这里我们假定你已经搞定上面的最简单的模块了,懂得什么是看模块,以及简单模块的编写、编译、加载和卸载。还有就是,什么是块设备,什么是块设备驱动,这个也请自行google吧,因为我们已经迫不及待要写完程序下课。为了建立一个可用的块设备,我们需要做1件事情:1:用add_disk()函数向系统中添加这个块设备? ?添加一个全局的? ?static struct gendisk *simp_blkdev_disk;? ?然后申明模块的入口和出口:? ?module_init(simp_blkdev_init);? ?module_exit(simp_blkdev_exit);? ?然后在入口处添加这个设备、出口处私房这个设备:? ?static int __init simp_blkdev_init(void)? ?{? ?? ? ? ? add_disk(simp_blkdev_disk);? ? ? ? return 0;? ?}? ?static void __exit simp_blkdev_exit(void)? ?{? ?? ? ? ? del_gendisk(simp_blkdev_disk);? ?}当然,在添加设备之前我们需要申请这个设备的资源,这用到了alloc_disk()函数,因此模块入口函数simp_blkdev_init(void)应该是:? ?static int __init simp_blkdev_init(void)? ?{? ? ? ? simp_b

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档