Linux 设备驱动开发 —— 驱动开发环境建立(二)

来源:互联网 发布:excel数据统计方法 编辑:程序博客网 时间:2024/06/05 09:43
引言
  在《驱动开发环境建立(一)》中讲述的是:
  1. 简要的介绍了 Linux 设备驱动及其与模块的关系?
  2. 如何编写一个简单的设备驱动程序?
  3. 设备驱动程序是如何被编译成模块的及如何构建 Linux OS 官方发行商的环境?
  那么,作为 Linux 爱好者肯定更希望自己到 kernel.org 上 download 一个原始干净的内核来玩、学习,甚至于应用到自己的产品。针对这类情况,我们也应该构建其相应的设备驱动开发环境。本文讲述在 Redhat Enterprise Linux 5.5 32bit 系统上构造 Linux-2.6.24.7 版本内核的开发环境。

编译并安装 Linux-2.6.24.7 内核
一、下载 kernel 源码包

  下载地址:ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.tar.bz2 或者http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.tar.bz2
  说明:我这边比较早的下载到 linux-2.6.24.7.tar.bz2 的版本,目前 kernel 社区已没有该拷贝。但本文依然以 2.6.24.7 版本为例,大家在实际操作过程中留意:)
二、编译内核
  ① 解压 linux-2.6.24.7.tar.bz2 内核包,建议将目录存放于系统的 /usr/src/kernels 目录下,参考命令如清单一:
  清单一、解压内核包参考命令
tar -xjf linux-2.6.24.7.tar.bz2 -C /usr/src/kernels
  ② 编译 linux-2.6.24.7 内核
  a. 配置内核编译选项
  何为配置内核编译选项?简单的说:在我们写C语言的时候,经常会定义一些宏,这些是预定义项的使用,在编译过程的第一个阶段完成。用户源代码可以用这些宏做约束条件,对功能代码在实际使用时进行控制。示例代码如清单二:
清单二、宏定义做功能代码约束条件使用
#include <stdio.h>#define HELLO_PRINTint main(int argc, char *argv[]){#ifdef HELLO_PRINT_1  printf("Hello, World!\n");#else  printf("Goodbye, everybady!\n");#endif  return 0;}
  可通过替换 #ifdef 的预定义项,使用清单二的代码。示例代码将在终端打印 “Goodbye, everybody!” 字样,如果将 “HELLO_PRINT_1” 替换为 “HELLO_PRINT” 则打印 “Hello, World!” 字样。回到内核配置,内核配置就 C 语言和汇编语言而言就是对源码中使用的宏做一个预处理。为了使 linux-2.6.24.7 的内核在 RHEL 5.5 32bit 系统上能够比较好的工作,这里我们引用系统当前的内核配置,它就是 /boot/config-2.6.18-194.el5 文件,配置内核编译参数的参考命令如清单三:
[root@ken linux-2.6.24.7]# pwd/usr/src/kernels/linux-2.6.24.7[root@ken linux-2.6.24.7]# cp /boot/config-2.6.18-194.el5 .config[root@ken linux-2.6.24.7]# make menuconfig# 此时会弹出 Linux Kernel Configuration 文本对话框,之后,按两下 "ESC" 键退出配置。
  b. 编译内核
  编译内核有两个步骤:编译内核二进制文件 vmlinux 和 设备驱动程序,参考命令如清单四:
[root@ken linux-2.6.24.7]# make -j4# -j4 参数表示当前编译多线程编译技术,线程数为 4,在多核的环境下建议大家“-j”参数以缩短编译内核所需的时间。[root@ken linux-2.6.24.7]# make modules# 执行 make 完成后,在执行该条命令,其意为编译系统需要用的设备驱动程序。
  c. 安装内核
  安装内核也有两个步骤:安装编译生成内核的设备驱动和内核,参考命令如清单五:
[root@ken linux-2.6.24.7]# make modules_install# 安装编译生成内核的设备驱动程序,成功后,将在 /lib/modules/2.6.24.7/ 目录下看到一系列相关文件夹和文件。[root@ken linux-2.6.24.7]# make install# 安装内核的二进制文件,成功后,将在 /boot/ 目录下看到 vmlinuz-2.6.24.7、System.map-2.6.24.7、initrd-2.6.24.7.img 等。
  d. 确认启动项为 linux-2.6.24.7 内核,并执行重启使新内核生效
  Linux 系统没新增一个内核,都将在其 grub 选项中新增一条 title。需要确认其 “default” 项是否为 2.6.24-7 版本的内核(即上述过程中编译出来的内核),如清单六:
[root@ken linux-2.6.24.7]# vim /boot/grub/menu.lst# grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE:  You have a /boot partition.  This means that#          all kernel and initrd paths are relative to /boot/, eg.#          root (hd0,0)#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00#          initrd /initrd-version.img#boot=/dev/sdadefault=0timeout=10splashimage=(hd0,0)/grub/splash.xpm.gzhiddenmenutitle Red Hat Enterprise Linux Server (2.6.24.7)    root (hd0,0)    kernel /vmlinuz-2.6.24.7 ro root=/dev/VolGroup00/LogVol00 rhgb quiet crashkernel=128M@16M    initrd /initrd-2.6.24.7.imgtitle Red Hat Enterprise Linux Server (2.6.18-194.el5PAE)    root (hd0,0)    kernel /vmlinuz-2.6.18-194.el5PAE ro root=/dev/VolGroup00/LogVol00 rhgb quiet crashkernel=128M@16M    initrd /initrd-2.6.18-194.el5PAE.imgtitle Red Hat Enterprise Linux Server (2.6.18-194.el5)    root (hd0,0)    kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet crashkernel=128M@16M    initrd /initrd-2.6.18-194.el5.img# “default”的参数代表目标 title,示例中,缺省启动项已经是 linux-2.6.24.7 版本的内核。# title 项的编号是从“0”开始,按照先后顺序递增。[root@ken linux-2.6.24.7]# reboot
三、确认 2.6.24.7 内核正在被使用
  成功重启后,就是新内核在工作了,确认命令如清单七:
[root@ken linux-2.6.24.7]# uname -r2.6.24.7

  出现清单七输出,说明刚编译的内核可用,并已生效。

常见问题:
1. 系统环境缺少编译内核的组件,编译内核起始阶段会做检查,请大家根据提示安装相关组件,一般 DVD 的光盘或者 ISO 文件中含有对应的 RPM 包。找到并安装即可。
2. 在执行 “make modules_install” 时,可能会发生告警,大致信息为 “安装目录无法找到”,根据提示信息,会发现系统在执行内核内核安装之前是不存在 "/lib/modules/2.6.24.7/" 目录的,可自行新建该目录解决,参考命令:mkdir -p /lib/modules/2.6.24.7/。

  希望各位提出宝贵建议和意见,谢谢:)


原创粉丝点击