1、linux设备驱动归纳总结一内核的相关基础概念一.linux设备驱动的作用内核:用于管理软硬件资源,并提供运行环境。如分配4G虚拟空间等。linux设备驱动:是连接硬件和内核之间的桥梁。linux系统按个人理解可按下划分:应用层:包括POSIX接口,LIBC,图形库等,用于给用户提供访问内核的接口。属于用户态,ARM运行在用户模式(usr)或者系统模式(sys)下。内核层:应用程序调用相关接口后,会通过系统调用,执行SWI指令切换ARM的工作模式到超级用户(svc)模式下,根据用户函数的要求执行相应的操作。硬件层:硬件设备,当用户需要操作硬件时,内核会根据驱动接口操作硬件设备图结构如下:举一个
2、相对比较邪恶的类比:在深圳的酒店经常会在门缝看到一些卡片,上面说可以通过打电话送货上门提供某中服务。xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx二.内核代码树介绍linux-2.6.29arch :包含和硬件体系结构相关的代码block :硬盘调度算法,不是驱动firmware :固件,如BOISDocumentation:标准官方文档dirver : linux设备驱动fs :内核所支持的文件体系include:头文件。linux/module.h linux/in
3、it.h常用库。init:库文件代码,C库函数在内核中的实现。init/main.c -start_kernel-内核执行第一条代码ipc :进程件通信mm:内存管理kernel :内核核心部分,包括进程调度等net:网络协议sound :所有音频相关其中,跟设备驱动有关并且经常查阅的文件夹有:initinclude : linux, asm-armdrivers:arch:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx三.内核补丁:补丁一般都是基于某个版本内核生成的,
4、用于升级旧内核。打补丁需要注意: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 /!注意在原文件
5、夹的目录中打补丁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/ ar
6、ch/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)上面看到,指定
7、需要进入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。所有的配
8、置都是根据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 s
9、ource 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,为用户提供一个交互界面来选择如何配置并生成配置选项。xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1