linux设备驱动归纳总结:内核的相关基础概念.doc_第1页
linux设备驱动归纳总结:内核的相关基础概念.doc_第2页
linux设备驱动归纳总结:内核的相关基础概念.doc_第3页
linux设备驱动归纳总结:内核的相关基础概念.doc_第4页
linux设备驱动归纳总结:内核的相关基础概念.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一.linux设备驱动的作用内核:用于管理软硬件资源,并提供运行环境。如分配4G虚拟空间等。linux设备驱动:是连接硬件和内核之间的桥梁。linux系统按个人理解可按下划分:应用层:包括POSIX接口,LIBC,图形库等,用于给用户提供访问内核的接口。属于用户态,ARM运行在用户模式(usr)或者系统模式(sys)下。内核层:应用程序调用相关接口后,会通过系统调用,执行SWI指令切换ARM的工作模式到超级用户(svc)模式下,根据用户函数的要求执行相应的操作。硬件层:硬件设备,当用户需要操作硬件时,内核会根据驱动接口操作硬件设备图结构如下:举一个相对比较邪恶的类比:在深圳的酒店经常会在门缝看到一些卡片,上面说可以通过打电话送货上门提供某中服务。xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx二.内核代码树介绍linux-2.6.29arch :包含和硬件体系结构相关的代码block :硬盘调度算法,不是驱动firmware :固件,如BOISDocumentation:标准官方文档dirver : linux设备驱动fs :内核所支持的文件体系include:头文件。linux/module.h linux/init.h常用库。init:库文件代码,C库函数在内核中的实现。init/main.c -start_kernel-内核执行第一条代码ipc :进程件通信mm:内存管理kernel :内核核心部分,包括进程调度等net:网络协议sound :所有音频相关其中,跟设备驱动有关并且经常查阅的文件夹有:initinclude : linux, asm-armdrivers:arch:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx三.内核补丁:补丁一般都是基于某个版本内核生成的,用于升级旧内核。打补丁需要注意:1.对应版本的补丁只能用于对应版本的内核。2.如果在已打补丁的内核再打补丁,需要先卸载原来补丁。打补丁的方法:1.制作补丁:diff -Nur linux-2.6.30/ linux-2.6.30.1/ linux-2.6.30.1.patch/N为新加的文件全部修改/linux-2.6.30旧版本/linux-2.6.30.1新版本/目标补丁2.打补丁:cd linux-2.6.30 /!注意在原文件夹的目录中打补丁patch -p1 ./linux-2.6.30.1.patch /-p1是忽略一级目录3.恢复:cd linux-2.6.30 /!注意在原文件夹的目录中打补丁patch -R arch/$(SRCARCH)/Makefile。arch/$(SRCARCH)/Makefile中指定arch/$(SRCARCH)路径下的哪些子目录需要被编译。在arch/arm/Makefile下:95 head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o187 # If we have a machine-specific directory, then include it in the build.188 core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/189 core-y += $(machdirs) $(platdirs)190 core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/191 core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ)192 core-$(CONFIG_VFP) += arch/arm/vfp/193194 drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/195196 libs-y := arch/arm/lib/ $(libs-y)上面看到,指定需要进入arch/arm/kernel/、arch/arm/mm/、arch/arm/common/等目录编译,至于core-y、core-$(CONFIG_FPE_NWFPE)这些是什么东西呢?其中,y表示编译成模块,m表示编译进内核(上面没有,因为默认情况下ARM全部编译进内核),但$(CONFIG_OPROFILE)又是什么呢?这些是根据用户在make menuconfig中设置后,生成的值赋给了CONFIG_OPROFILE。3.那make menuconfig后的配置信息是怎么来的?这是由各子目录下的Kconfig提供选项功用户选择并配置。如arch/arm/Kconfig。所有的配置都是根据arch/$(ARCH)/Kconfig文件通过Kconfig的语法source读取各个包含的子目录Kconfig来生成一个配置界面。每个Makefile目录下都有一个对应的Kconfig文件,用于生成配置界面来给用户决定内核如何配置,配置后会确定一个。CONFIG_XXX的的值(如上面的CONFIG_OPROFILE),来决定编译进内核,还是编译成模块或者不编译。如在arch/arm/Kconfig下:595 source arch/arm/mach-clps711x/Kconfig596597 source arch/arm/mach-ep93xx/Kconfig598599 source arch/arm/mach-footbridge/Kconfig600601 source arch/arm/mach-integrator/Kconfig602603 source arch/arm/mach-iop32x/Kconfig604605 source arch/arm/mach-iop33x/Kconfig这些就是用来指定,需要读取以下目录下的Kconfig文件来生成一个使用make menuconfig时的配置界面。至于子目录下的Kconfig是怎么样的,待会介绍。总结Kconfig的作用:3.1.在make menuconfig下可以配置选项;3.2.在.config中确定CONFIG_XXX的的值。4.只是读取以上的两个Makefile还是不够了,内核还会把包含的子目录一层一层的读取它里面的Makefile和Kconfig。上面啰啰嗦嗦地讲了这么久,无非就是想说,内核的编译并不是一个Makefile搞定的,需要通过根目录下的总Makefile来包含一下子Makefile(不管是根目录下的子目录还是/arch/arm中的子目录)。而Kconfig,为用户提供一个交互界面来选择如何配置并生成配置选项。xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx五、子目录下的Makefile和Kconfig上面我一直介绍的都是两个比较大的Makefile总Makefile和arch/$(ARCH)/Makefile。接下来看一下实例。一、在makefile中,y表示编译进内核,m表示编译成模块,不写代表不编译。所以,配置最简单的方法就是,直接修改子目录的Makefile。先看看arch/arm/Makefile:/*arch/arm/mach-s3c2440/Makefile*/12 obj-$(CONFIG_CPU_S3C2440) += s3c2440.o dsc.o13 obj-$(CONFIG_CPU_S3C2440) += irq.o14 obj-$(CONFIG_CPU_S3C2440) += clock.o /配置2440的时钟进入模块15 obj-$(CONFIG_S3C2440_DMA) += dma.o如果我要取消s3c2440的时钟(当然这是必须要开的,只是举例)。可以直接修改arch/arm/mach-s3c2440/Makefile将obj-$( CONFIG_CPU_S3C2440) += clock.o改为obj- += clock.o如果你想编译成模块也可以修改成:obj-m += clock.o在这里CONFIG_CPU_S3C2440的值默认是y,所以内核是要将时钟编译进内核的。也许有人会问,那我直接修改CONFIG_CPU_S3C2440的值为m不就可以将时钟编译成模块了,何必修改Makefile这么麻烦呢?的确是这样,只要我们通过在”make menuconfig”的界面中配置后就能够改变CONFIG_CPU_S3C2440的值。接下来看看如何实现。二、在一般的编译内核时,我们都是通过”make menuconfig”进入图形界面面配置的,接下来我实现一下如何将一个选项加入到图形配置界面中。看看具体实现的步骤:以下的执行环境是在PC机上,我使用的内核是linux-2.6.29:2.1.进入内核目录cd linux-2.6.292.2.在driver目录下模拟一个名为test1驱动的文件夹mkdir driver/test12.3.在目录下随便些一个C文件,只要不报错。vim test1.c我的test1.c如下:1 void foo()2 3 ;4 2.4vim Makefile /在目录下编写一个简单的MakefileMakefile文件编写如下:obj-$(CONFIG_TEST1) += test1.oCONFIG_TEST1是决定test1是否编译进内核或者编译成模块的。这就是通过同一目录下的Kconfig来在配置界面中生成选项,由用户在make menuconfig中选择。2.5所以还要同一目录下写一个Kconfig:vim KconfigKconfig修改如下:menu test1 driver here /这是在图形配置显示的config TEST1bool xiaobai test1 driver /这同样也是在图形配置显示的helpThis is test1 /这个也是在图形配置显示的。说白了,就是在图形配置的driver下多了一个配置选项,用户配置后将CONFIG_TEST1的值存放在.config中,Makefile通过读取.config的去注释版include/config/auto.conf读取到CONFIG_TEST的值,再进行编译。但是,以上几步还不能达到目的,因为虽然在总Makefile中已经包含了目录driver,但是driver目录的Makefile中并没有包含test目录。因此需要在driver/Makefile中添加:103 obj-$(CONFIG_PPC_PS3) += ps3/104 obj-$(CONFIG_OF) += of/105 obj-$(CONFIG_SSB) += ssb/106 obj-$(CONFIG_VIRTIO) += virtio/107 obj-$(CONFIG_STAGING) += staging/108 obj-y += platform/109 obj-$(CONFIG_TEST1) += test1/ /这是我添加的虽然Makefile中已经包含了,但这样还是不行。因为当需要配置ARM时,ARM结构下的Kconfig并没有包含test的Kconfig。这样的话就不会出现在图形配置界面中,因此在arch/arm/Kconfig中添加:1230 menu Device Drivers /要在Device Drivers这个选项里面添加12311232 source drivers/base/Kconfig12331234 source drivers/connector/Kconfig。1330 source drivers/test/Kconfig /这是我添加的13311332 endmenu大功告成!这样,make menuconfig界面写的Driver Devices下就多了一个test1 friver here的目录,里面有一个配置选项xiaobai test1 driver。Kconfig文件的语法在documentation/kbuild/kconfig-language.txt文件中有详细的讲解,上面我只是简单实现了一下,都是皮毛。xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx六.内核和模块的编译编译内核很简单,只需要配置完毕后执行make命令,将指定的文件编译进内核bzImage或者编译成模块。make = make bzImage + make modules因此如果值编译内核,即只编译配置文件中-y选项,可以直接用命令make bzImage如果值编译模块,即只编译配置文件中的-m选项,可以之直接使用命令make modules模块可以编译当然也可以清除,使用命令make modules clean如果只想单独编译一个模块,可以使用命令make M=drivers/test/ modules /只单独编译drivers/test中的.komake M=drivers/test/ modules clean /清除上面的是在内核目录下的操作,但当我写驱动时,我并不可能在内核目录下编写,但我编译时却要依赖内核中的规则和Makefile,所以就有了以下的方法,同时这也是一般的编写驱动时Makefile的格式。指定内核Makefile并单独编译make -C /root/linux-2.6.29 M=pwd modulemake -C /root/linux-2.6.29 M=pwd module clean/-C指定内核Makefile的路径,可以使用相对路径。/-M指定要编译的文件的路径,同样课使用相对路径。编译生成的模块可以指定存放的目录make -C /root/linux-2.6.29 M=pwd modules_install INSTALL_MOD_PATH=/nfsrootxxxxxxxxxxxxxxxxxxxxxxxxxxx

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论