- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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\
您可能关注的文档
最近下载
- 2023安徽合肥科技农村商业银行员工招聘50人笔试历年典型考题及考点剖析附带答案详解.docx VIP
- 广东省深圳市宝安中学2023-2024学年八年级上学期期中数学试题.docx VIP
- g围绕着我崇拜的人儿 简谱.pdf VIP
- 《中国铁路太原铁路局铁路营业线施工安全管理实施细则》考试题库及答案(共219题).docx VIP
- 武警防暴队形ppt课件.pptx
- 2025年工业互联网平台建设案例研究:生态构建与产业生态构建创新实践案例集.docx VIP
- T 0804-1994 无机结合料稳定材料击实试验方法.ppt VIP
- 课前预习主题班会PPT课件.pptx VIP
- 苏教版综合实践活动七年级上册《我是大侦探》.pptx VIP
- 油轮“塞加号”案评介(续).doc VIP
文档评论(0)