linix驱动编程深入浅出.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、深入浅出 Linux 设备驱动编程之引言 目前,Linux 软件工程师大致可分为两个层次: (1)Linux 应用软件工程师(Application Software Engineer ):主要利用C 库函数和 Linux API 进行 应用软件的编写; (2 )Linux 固件工程师(Firmware Engineer):主要进行 Bootloader、Linux 的移植及 Linux 设备驱 动程序的设计。 一般而言,固件工程师的要求要高于应用软件工程师的层次,而其中的 Linux 设备驱动编程又是 Linux 程序设计中比较复杂的部分,究其原因,主要包括如下几个方面: (1)设备驱动属于 Linux 内核的部分,编写Linux 设备驱动需要有一定的 Linux 操作系统内核基础; (2 )编写 Linux 设备驱动需要对硬件的原理有相当的了解,大多数情况下我们是针对一个特定的嵌入 式硬件平台编写驱动的; (3 )Linux 设备驱动中广泛涉及到多进程并发的同步、互斥等控制,容易出现 bug; (4 )由于属于内核的一部分,Linux 设备驱动的调试也相当复杂。 目前,市面上的 Linux 设备驱动程序参考书籍非常稀缺,少有的经典是由 Linux 社区的三位领导者 Jonathan Corbet、Alessandro Rubini 、Greg Kroah-Hartman 编写的《Linux Device Drivers》(目前该书 已经出版到第 3 版,中文译本由中国电力出版社出版)。该书将 Linux 设备驱动编写技术进行了较系统的 展现,但是该书所列举实例的背景过于复杂,使得读者需要将过多的精力投放于对例子背景的理解上,很 难完全集中精力于 Linux 驱动程序本身。往往需要将此书翻来覆去地研读许多遍,才能有较深的体会。 (《Linux Device Drivers》中英文版封面) 本文将仍然秉承《Linux Device Drivers》一书以实例为主的风格,但是实例的背景将非常简单,以求 使读者能将集中精力于 Linux 设备驱动本身,理解 Linux 内核模块、Linux 设备驱动的结构、Linux 设备驱 动中的并发控制等内容。另外,与《Linux Device Drivers》所不同的是,针对设备驱动的实例,本文还给 出了用户态的程序来访问该设备,展现设备驱动的运行情况及用户态和内核态的交互。相信阅读完本文将 为您领悟《Linux Device Drivers》一书中的内容打下很好的基础。 本文中的例程除引用的以外皆由笔者亲自调试通过,主要基于的内核版本为 Linux 2.4,例子要在其他 内核上运行只需要做少量的修改。 构建本文例程运行平台的一个较好方法是:在 Windows 平台上安装 VMWare 虚拟机,并在 VMWare 虚拟 机上安装 Red Hat。注意安装的过程中应该选中开发工具和 内核开发二项(如果本文的例程要在特定的 嵌入式系统中运行,还应安装相应的交叉编译器,并包含相应的 Linux 源代码),如下图: 二、深入浅出 Linux 设备驱动编程之内核模块 Linux 设备驱动属于内核的一部分,Linux 内核的一个模块可以以两种方式被编译和加载: (1)直接编译进Linux 内核,随同Linux 启动时加载; (2 )编译成一个可加载和删除的模块,使用 insmod 加载(modprobe 和 insmod 命令类似,但依赖于 相关的配置文件),rmmod 删除。这种方式控制了内核的大小,而模块一旦被插入内核,它就和内核其他 部分一样。 下面我们给出一个内核模块的例子: #include linux/module.h //所有模块都需要的头文件 #include linux/init.h // initexit 相关宏 MODULE_LICENSE(GPL); static int __init hello_init (void) { printk(Hello module init\n); return 0; } static void __exit hello_exit (void) { printk(Hello module exit\

文档评论(0)

zsmfjy + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档