深入浅出驱动开发.docxVIP

  • 2
  • 0
  • 约5.75万字
  • 约 57页
  • 2022-06-30 发布于上海
  • 举报
深入浅出 Linux 设备驱动编程之引言 目前,市面上的 Linux 设备驱动程序参考书籍非常稀缺,少有的经典是由 Linux 社区的三位领导者 Jonathan Corbet、Alessandro Rubini、Greg Kroah-Hartman 编写的《Linux Device Drivers》(目前该书已经出版到第 3 版,中文译本由中国电力出版社出版)。该书将 Linux 设备驱动编写技术进行了较系统的展现,但是该书所列举实例的背景过于复杂,使得读者需要将过多的精力投放于对例子背景的理解上,很难完全集中精力于Linux 驱动程序本身。往往需要将此书翻来覆去地研读许多遍,才能有较深的体会。 目前,Linux 软件工程师大致可分为两个层次: Linux 应用软件工程师(Application Software Engineer):主要利用 C 库函数和 Linux API 进行应用软件的编写; Linux 固件工程师(Firmware Engineer):主要进行 Bootloader、Linux 的移植及 Linux 设备驱动程 序的设计。 一般而言,固件工程师的要求要高于应用软件工程师的层次,而其中的 Linux 设备驱动编程又是 Linux 程序设计中比较复杂的部分,究其原因,主要包括如下几个方面: 设备驱动属于 Linux 内核的部分,编写 Linux 设备驱动需要有一定的 Linux 操作系统内核基础; 编写 Linux 设备驱动需要对硬件的原理有相当的了解,大多数情况下我们是针对一个特定的嵌入式硬件平台编写驱动的; Linux 设备驱动中广泛涉及到多进程并发的同步、互斥等控制,容易出现 bug; 由于属于内核的一部分,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 内核的一个模块可以以两种方式被编译和加载: 直接编译进 Linux 内核,随同 Linux 启动时加载; 编译成一个可加载和删除的模块,使用 insmod 加载(modprobe 和 insmod 命令类似,但依赖于相关的配置文件),rmmod 删除。这种方式控制了内核的大小,而模块一旦被插入内核,它就和内核其他部分一样。 下面我们给出一个内核模块的例子: #include linux/module.h // #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

文档评论(0)

1亿VIP精品文档

相关文档