1、Linux驱动开发常用相关命令和技巧,一个简单的驱动实例 升级内核的一般步骤 Linux最常用的命令 内核编程技巧 资料书籍和工具,一个最简单的Helloworld驱动例子,#include #include #include MODULE_LICENSE(“GPL“); static int _init hello_init(void) printk(“ Hello world!n“);return 0; static int _exit hello_exit(void) printk(“ Bye, cruel worldn“);return 0; module_init(hello_ini
2、t); module_exit(hello_exit);,一个最简单的Helloworld驱动例子,上述是是一个简单Helloworld驱动程序的例子。其中hello_init为驱动加载时执行的函数,即驱动程序的入口;hello_exit为驱动卸载时执行的函数,即驱动程序的出口。在Linux驱动程序中使用printk打印信息,可以看出程序在加载和卸载驱动的时候分别打印两句话。其中printk里面的为日志消息等级,详见帮助。,Makefile文件,obj-m := Helloworld.o KERNELDIR := /lib/modules/$(shell uname -r)/build PWD
3、 := $(shell pwd) modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install clean:rm -rf *.o * core .depend .*.cmd *.ko *.mod.c .tmp_versions $(TARGET),Makefile文件,上述代码是针对于前面简单驱动程序的Makefile文件。Makefile是一个定义程序编译规则的文件。其中第一行表示生成的目标代码,对应于Helloword.c,第
4、二行为头文件路径,后面为生成模块和安装模块的规则,clean为执行make clean时清理代码生成的临时文件。可以看出在Makefile文件中可以嵌入某些shell命令。关于Makefile文件知识可以查阅相关资料。,升级内核的一般步骤,1、make menuconfig 2、make 3、make modules_install 4、mkinitramfs -o /boot/initrd-linux3.2.11.img 3.2.11 5、make install 6、update-grub,升级内核的一般步骤,在执行上述步骤的之前需安装一些工具,执行:apt-get install ini
5、tramfs-tools, module-init-tools(所有操作都是root用户权限下执行) 通过升级Linux内核可以对Linux内核模块的编译有一定的了解,并且通过配置Linux对于Linux某些内核参数也会有所了解。上述升级步骤相对简化,不同发行版本的Linux内核升级所需下载的工具或者步骤可能略有不同,详细参考相关资料。,Linux最常用的命令,在linux操作尤其是驱动开发中常用的命令介绍如下: 1.ls命令(实例如下:)功能:用于列出目录下所有的文件 说明:常用参数:-l 列出文件名称和详细信息。 ls -help 或者 man ls 可以查看更多帮助信息。(类似的方法可以
6、查看相关命令的帮助信息,下面的不再重复),lsls-virtual-machine:$ ls examples.desktop 公共 模板 视频 图片 文档 下载 音乐 桌面,Linux最常用的命令,2. cd命令 (实例如下:)功能:用于进入目标目录 说明:cd 用于进入当前目录的上一级目录;cd /用于进入根目录;cd 用于进入用户目录(即/home),lsls-virtual-machine:$ cd /usr/src lsls-virtual-machine:/usr/src$,Linux最常用的命令,3.cat命令(实例如下:)功能:主要用于在终端中显示文本信息 。 说明: cat命
7、令是Linux驱动编程中很常用的一个命令,常用于打印驱动调试信息或者系统虚拟文件系统/proc中的信息,例如:(类似功能也可以用more命令代替) cat /proc/kallsyms用于查看系统内核符号 cat /proc/timer_list 用于查看系统时钟设备以及定时器,rootls-virtual-machine:/usr/src# cat /proc/interruptsCPU0 CPU1 0: 142 0 IO-APIC-edge timer1: 3384 5 IO-APIC-edge i8042,Linux最常用的命令,4.lsmod 命令(实例如下:)功能:主要用于显示当前L
8、inux系统中已加载的模块。 说明:驱动编程过程中可以查看驱动是否加载成功。,rootls-virtual-machine:/# lsmod Module Size Used by timer 90877 0 rfcomm 37292 0,Linux最常用的命令,5.uname 命令(实例如下:)功能:输出一组系统信息。 说明:如果不跟随选项,则视为只附加-s 选项,通常加选项-a输出系统版本信息。,rootls-virtual-machine:/# uname -a Linux ls-virtual-machine 3.2.7 #1 SMP Thu Apr 12 12:29:39 CST 2
9、012 i686 i686 i386 GNU/Linux,Linux最常用的命令,6.grep 命令(实例如下:)功能:在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。 说明:很多时候grep命令用于配合其他打印命令输出内容中特定的部分。(如上例),rootls-virtual-machine:/# cat /proc/interrupts | grep LOC LOC: 4172425 112446641 Local timer interrupts,Linux最常用的命令,7. dmesg命令 (实例如下:)功能:打印内
10、核日志信息 说明:在驱动编程中经常用到的命令,用于查看驱动程序中“printk”打印语句打印的信息,其中最左边一列是时间信息。, 1422.376851 return of current-cpus_allowed is 2: 1422.376853 return of current_thread_info()-cpu is 1: 1422.376858 return apic_read(APIC_ID) is : 1000000,Linux最常用的命令,8. Insmod命令 (实例如下:)功能:用于加载内核模块 说明:加载驱动程序编译生成的.ko文件,如果在驱动程序中申明了可以结束输入参
11、数,在执行该命令的时候还可以加输入参数。(类似于在普通C程序中的main函数接受命令行参数),rootls-virtual-machine:/home/ls/works/timer# insmod timer.ko,Linux最常用的命令,9. rmmod命令 (实例如下:)功能:用于卸载内核模块 说明:卸载已加载的内核模块,卸载时调用驱动程序中的驱动出口函数,rootls-virtual-machine:/home/ls/works/timer# rmsmod timer.ko,Linux最常用的命令,10. sudo命令(实例如下:)功能:是linux系统管理指令,是允许系统管理员让普通用
12、户执行一些或者全部的root命令的一个工具 说明:通常配合其他命令一起使用,在Linux终端中可以通过 sudo s H 或者 su root切换到root用户下,其中后者需要设置root用户密码,设置方法为 sudo password。注:驱动的加载和卸载都需要在root用户权限下操作,lsls-virtual-machine:/usr/src$ su root,Linux最常用的命令,11. chmod命令(实例如下:)功能:这个命令用于修改目标文件或者目录的读写控制权限,格式为:chmod XXX 文件或目录 说明:其中“XXX”是标识文件权限的掩码,通常777为最高权限表示完全控制。(
13、具体可以看帮助信息),rootls-virtual-machine:/home/ls/works/timer# chmod 777 test.sh,Linux最常用的命令,12. top命令(实例如下:)功能:这个命令相当于Windows下面的任务管理器,打印系统任务相关信息 说明:有很多参数选择,具体可以查看帮助信息。使用top命令以后,按s键可以设置信息的刷新时间,单位为秒;按F键可以选择相关选项,例如选择J,显示各个任务所运行的CPU;按1键可以查看多核处理器下各个处理器各自的使用率等信息。 (ps命令也可以查看任务信息,详细查看相关资料),rootls-virtual-machine:
14、/home/ls/works/timer# top,Linux最常用的命令,13. watch 命令(实例如下:)功能:这个命令在Linux内核编程中也比较常用,用于监控某些命令的打印信息 说明:这个命令通常配合其他打印命令,如上例,默认 watch 会以 2s 的间隔重复运行命令,你也可以用 -n 参数指定时间间隔 。,lsls-virtual-machine:/usr/src$ watch cat /proc/interrupts,Linux最常用的命令,上面简单介绍了一些Linux驱动开发中常用的命令,大多数Linux的发行版本还提供了其他非常多使用的命令,很多命令也提供了很多参数选项,
15、在终端中可以通过加help或者man 命令来查看帮助选项。其他一些常见的命令如:make 根据Makefile文件定义编译规则编译程序pwd 用于查看当前工作路径kill 用于杀死某个进程sleep用来将目前动作延迟一段时间此外,在命令中还可以使用一些循环分支结构,可以将命令写成批处理执行的shell程序,可以查看shell编程相关资料,内核编程技巧,Linux内核编程相对与window环境下的编程,其调试和编译相对都比较麻烦一点。可以根据自己的个人喜好和习惯选择自己的编辑工具和调试方法。最简单的调试即在驱动程序中使用打印语句,将信息打印出来,通过dmesg命令查看打印信息。 还可以使用dgd
16、b、kdb、kprobes等内核调试用具调试内核模块。,内核编程技巧,在Linux系统中proc文件系统是一个虚拟文件系统,是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就可以简单直接的通过echo或cat这样的文件操作命令对系统信息进行查取,在Linux内核编程中,可以从proc文件系统中查看到诸如中断信息、集成信息、处理器信息、内核符号信息等许多重要且实用的信息。,内核编程技巧,Linux内核编程中,内核源码是最好的代码参考资源,涉及到内核功能的函数很多都可以在源码中找到相同和相似的实现,通过参照内和源码中函数的实现而实现自己的
17、功能。并且对于Linux提供的内核API其参数和功能往往比较难查阅到相关说明的资料,可以在内核源码中查看其具体实现,而了解其参数和功能。对于很多内核提供的符号,但未导出为内和API的函数也可以通过查找其在内核中的地址,而参照其源码实现调用。,资料书籍和工具,环境配置: 一般情况下可以使用windows系统vmware虚拟机中安装某一个Linux发行版本的系统来搭建Linux内核编程环境。选用哪一个Linux发行版本都可以,只是在操作上可能有所差别,只要内核版本符合需求即可。也可以安装windows+Linux双系统,涉及到计算机底层硬件的功能时vmware可能并不能完全地模拟出其功能(例如时钟
18、设备的定时精度),所以,使用双系统能够更好地适应一些特殊的内核程序。在双系统的Linux系统中,可以mentohust工具来使用锐捷帐号连接网络,可以使用wine等工具来模拟windows环境使用某些应用程序。,资料书籍和工具,在学习Linux内核编程的过程中最重要的资料是一份比较新的Linux内核源码,可以从http:/www.kernel.org/下载到最新的Linux内核源码。 阅读内核源码的工具,比较常用的是source insight,这是一款非常方便的内核源码阅读工具。还可以使用在线源码参考LXR,网址为:http:/lxr.linux.no/ 当然还有一些其他的源码阅读工具,例如
19、使用Vim编辑器和一些插件配置的源码阅读工具等。,资料书籍和工具,关于Linux内核网上的中文资料的相对较少,最常用的是使用google搜索相关资料。最主要的有以下中文Linux资料网站: ChinaUnix技术社区,ChinaU是中国最大的Linux/Unix技术社区网站,其论坛有大量Linux内核以及Linux驱动开发资料。 CSDN社区Linux内核板块,有一些Linux内核相关的问题以及网友的参考解决方案。 IBM developerWorks,这个网站上有很多专家牛人的技术文章。,资料书籍和工具,Linux内核的书籍非常多,其中有5本非常经典的书籍,其中一本讲驱动开发的。 Linux内核设计与实现简称LKD 深入理解Linux内核简称ULK Linux设备驱动程序简称LDD 深入理解Linux虚拟内存管理简称LVMM 深入理解Linux网络内幕 每一本书的侧重点都不同,可以通过一些资料了解一下这几本经典书籍。,