linux设备驱动归纳总结带书签

所需积分/C币:10 2016-04-12 09:32:00 4.13MB PDF
10
收藏 收藏
举报

linux设备驱动归纳总结,简易直接明了的入门教程
三内核补丁: 补丁一般都是基于某个版本内核牛成的,用于升级旧内核。 打补丁需要注意 1对应版本的补丁只能用于对应版本的内核。 2.如果在已打补丁的内核再打补丁,需要先卸载原来补丁。 打补丁的方法: 1制作补丁: diff- Nur linuIx-2630/ linLx-2630. 1/> linL x-2.6.30. 1. patch /N为新加的文件全部修改 /mx-2.6.30版本 /iux-2.6.30.1新版木 |标补丁 2打补丁 selinux-2.6.30/!!注意在原文件夹的目录中打补丁 patch-pl<./inx-2.6.30. I- patch/-pl是忽略一级目录 3恢复 dlinux-2.6.30/!!注意在原文件夹的日录中打补于 patch-R<.lmux-2.6.30.! patch/撒销补丁 四内核中的 Makefile 对于内核, Maker分为5类 Documentation/kbuild/makefiles.w描述如下: 0 The Makefiles have five parts 52 Makefile总 Makefile,控制内核的编译 53cong内核配置文件,配置内核时生成,如 make menuconfig后 54arch$( ARCHMakefle对应休系结构的 Makefile 55 scripts/Makefile. Makefile共用的规则 56 kbuild makefiles各子目录下的 Makefile,被上层的 Makefile调用。 简单米说,编译内核会执行以下两步骤,它们分别干了以下的事情。 1一般的,我们会拷贝一个对应体系结构的配置文件到主目录下并改名为 config,这样就在 mmakemenuconfig生成的图形配置 中已经有了一些默认的配置,减少用户的劳动量。不过这一步不做也没关系的。 2. makerenuconfig 2.1、由总 Makefile决定编译的体系结构(ARCH编译工貝( CROSS COMPILE),并知道需要进去哪些内核根下的哪些日录进 行编译。 22、由 arch/S( ARCH)Makefile,决定 arch/S(ARCH)下还有的哪些目录和文件需要编译。 23、知道了需要编译的目录后,递归的进入哪些日录下,读取每一个 Kconfig的信息,牛成了图形配置的界面。 24、通过我们在图形配置界面中选项为[的]、DM或者囗 2.5、保存并退出配置,会根据配置牛成一份新的配置义什 config,并在同时成 include/config/auto.conf(这是 config的去注 释版)。文件里面保存着 CONFIG XXXX等变量应该取y还是取m make 3.1、根据 Makefile包含的目录和配置文件的要求,进去个子目录进行编译,最后会在各子目录下生成一个.0或者a文件, 然后总 Makefile指定的连接本 arch/s(ARCH)kernelvmlimuxld生成wix,并通过压缩编程 belge,或者按要求在对应的 子目录下编译成模块 但是,具体是怎么生成配置文件的呢? 注:我使用的内核是26.29。 1在总 Makefile中,根据以下语句进入需要编译的目录 470# Objects we will link intovmlinux subdirs we need to visit 471 init -y: init/ 472 drmvers-y: drivers/sound/ firmware/ 473 net-y: net/ 474 lbs-y= lib/ 475 core-y usr 476 endif# KBUILD EXTMOD 639 core-y+ kernel mm/fs/ ipc/ security/ crypto/ block/ 上面说明了,根目录卜的it、 driver、soud、 firmware、net、l、us等目录,在编译时都会进去读取目录下的 Makefile并进 行编译。 2在总 Makefile中包含的目录还是不够的,内核还需要根据对应的CPU秫系架构, 决定还需要将哪些子日录将要编译进内核。在总 Makefile中冇一个语句: 529 includeS( retree/ arch/S( SRCARCH)Makefile在这里,我定义 SRCARCH a 可以看出,在总 Maker进去读取相应体系结构的 Makefile-arhS( SRCARCH/Makefile arch/S( SRCARCH Makefile中指定 arch/$( SRCARCH胳径下的哪些子目录需要被编译 在 archana Makefile下: 95 head-y arch/armkernehheadSMMUEXT) o arch/armkernelnit tasko 187# If we have a machine-specificdirectory, then inchde it in the build 188 core-y+ arch/arm/kernel arch/arm'mmd arch/arm commn/ 189 core-y+=S(machdirs)S(platdirs) 190 core-S(CONFIG FPE NWFPE)+- arch/arm'nwfpe/ 191 core-S(CONFIG FPE FASTFPE)+ S(FASTFPE OBJ) 192 core-S(CONFIG VFP)+-arch/arm'vlfp 194 drivers-S(CONFIG OPROFILE)+arch/armoprofile 196 lbs-y :arch/armlb/S(lbs-y) 上面看到,指定需要进入 arch/armkernel、 arch/arm/mm、 arch/armycommon/等目录编译,至于core-y、coe ( CONFIG FPE NWFPE这些是什么东四呢? 其中,y表示编译成模块,m表示编译进内核(上面没有,因为默认情况下ARM仝部编译进内核) 但$( CONFIG OPROFILE又是什么呢?这些是根据用户在 mmakemenuconfigl中设置后,生成的值赋给 了 CONFIG OPROFILE 3.那 makemenuconfig后的配置信息是怎么来的? 这是由各子目录下的 Kconfig提供选项功用户选择并配置。 如 archarmkconfio。所有的配置都是根据arch( ARCH)Kconfig文件通过 Kconfig的语法suce读取各个包含的子目 录 Configs来生成一个配置界面。每个 Makeni目录下都有一个对应的 Kconfig文件,用于生成配置界面来给用户决定内核如 何配置,配置后会确定个。 CONFIG XXX的的值(如上面的 CONFIG OPROFILE),来决定编译违内核,还是编译成 模块或者不编译 如在 arch/arm/Kconfig下: 595 source"arch/arm/ach-clps711x/Kconfig 596 597 source"arch/arm'mach-ep93xX/Kconfig 599 source"arch- footbridge/Kconfig' 600 601 source"arch/arm'mach- integrator/Kconfig 603 source"arch/arm'mach-iop32x/Kconfig 604 605 source"archarmmach-iop33x/Kconfig 这些就是用来指定,需要读取以下日录下的 Kconfig文件来生成一个使用 makemenuconfig时的配置界面。 至于子目录下的 Kconfig是怎么样的,待会介绍。 总结 Kconfig的作用: 3.1在 makemenuconfig下可以配置选项 32.在 config中确定 CONFIG XXX的的值 4只是读取以上的两个 Makefile还是不够了,内核还会把包含的子目录一层一层的读取它里面的 Makefile和 Kconfig 上面啰啰嗦嗦地讲了这么久,无非就是想说,内核的编译并不是一个 Makefile搞定的,需要通过根目录下的总 Maker来包 含一下子 Makefile(不管是根目录下的子目录还是 archard中的子目录)。而 Config,为用户提供一个交互界面来选择如 何配置并生成配置选项。 五、子日录下的 Makefile和 Kconfig 上面我一直介绍的都是两个比较大的 Makefile总 Makefile和ach( ARCH)Makefile。接下来看一下实例。 、在 nrakefi中,y表示编译进内核,m表示编译成模块,不与代表不绽译。所以,氈置最简单的方法就是,直接修改∫ 目汞的 Makefile 先看看 arch/arm/Makefile: /arch/arm'mach-s3c2440/ Makefile*/ 12 obj-S(CONFIG CPU S3C2440)+=s3c2440o dsc.o 13obj-S(CONFIG CPU S3C2440)+-irq o 140bj-S( CONFIG CPU S3C2440)+ clock0/配置2440的时钟进入模块 15obj-S(CONFIG S3C2440 DMA)+=dma.o 如果我要取消s3c2440的时钟(当然这是必须要开的,只是举例)。可以直接修改 arch/arm'mach3c240 Makefile将ob ( CONFIG CPU S3C2440)+=cck.o改为 obj-+=clock. o 如果你想编译成模块也可以修改成 obj-Im+- clock. o 在这里 CONFIG CPU S32440的值默认是y,所以内核是要将时钟编译进内核的。也许有人会问,那我直接修 改 ONFIG CPU S3C2440的值为m不就可以将时钟编译成模块了,何必修改 Makefile这么麻烦呢?的确是这样,只要我们 通过在” makemenuconfig的界面中配置后就能够改变 CONFIG CPU S3C440的值。接下来看看如何实玩 在一般的编译内核时,我们都是通过” makemenuconfig进入图形界面面配置的,接下来戎实现一下如何将一个选项加入到图形 配置界面中。 看看具体实现的步骤: 以下的执行环境是在PC机上,我使用的内核是ux-26.29: 2.1.进入内核日录 cd linux -2 6.29 2.2.在 driver目录下模拟一个名为tst驱动的文件夹 mkdir driver/testl 23.在目录下随使些个C文件,只要不报错。 vim testl.c 我的test.c如下 I void fooD 2.4 vim Makefile∥在目录下编写一个简单的 Makefile Makefile文件编写如下 obj-(CONFIG TESTI)+testlo CONFIG TEST是决定 testl是否编译进内核或者编译成模块的。这就是通过同一目录下的 Kconfig来在配置界面中生成选 项,由用户在 makemenuconfig中选择。 2.5所以还要同一目求下写一个 Kconfig vim Kconfig Kconfig修改如下 memu" testl driver here"/这是在图形配置显示的 config TEsti bool" xiaobai testl driver"/这同样也是在图形配置显示的 This is testl/这个也是在图形配置显示的 说白了,就是在图形配置的 driver下多了一个配置选项,用户配置后将 CONFIG TES∏的值存放在cong中, Maker通过 读取 config的去注释版 nclude/config/auto.con读取到 CONFIG TEST的值,再进行编译。 但是,以上几步还不能达到目的,因为虽然在总 Makefile中已经包含了目录 driver,但是 driver目录的 Makefile中并没有包 含test目录。因此需要在 driver/ Makefile中添加 103 obj-S(CONFIG PPC PS3)+ps3 104 obj-S(CONFIG OF)+=of 105 obj-S(CONFIG SSB)+= ssb 106 obj-S(CONFIG VIRTIO)+-virtior 107 obj-S(CONFIG STAGING)+=staging 108 obj-y +=platfom/ 109obj-S( CONFIG TESTI)+tet//这是我添加的 虽然 Makefile中已经包含了,但这样还是不行。因为当需要配置ARM时,ARM结构下的 Kconfig并没有包 含ts的 Kconfig。这样的话就不会出现在图形配置界面中,因此在 arch/arm/kconfig中添加 1230mm" Device drivers"要在 Devicedrivers这个选项里面添加 1231 1232 source"drivers/base/Kconfig' 1234 source drivers/connector/Kcon 1330 source drivers/test/kconfig/这是我添加的 1332 endmenu 大功告成 这样, akemenuconfig界面写的 DriverDevices下就多了一个" testl fiver here的目求,里面有一个配置选项" xiaobaitestl driver config. Linux Kernel v2. 6. 29.4 Configuration Device Drivers Arrow keys navigate the menu. <Enter> selects submenus ---> HighLighted letters are hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help, </ for Search. Legend: [*I built-in [I excluded <M> module < <>MMC/SD/SDI0 card support 1 Accessibility support support < Sony Memorystick card support (EXPERIMENTAL)---> I LED Support <i> Real Time Clock DMA Engine support---> I Voltage and Current Regulator Support--> <>Userspace I/0 drivers staging drivers test1 driver here --- <Select> Exit HeLp> Kconfig文件的语法在 documentation/kbuild/kconfig-language txt文件中有详细的讲解,上面我只是简单实现了一下,都是皮 六.内核和模块的编译 编译内核很简单,只需要配置完毕后执行mke命令,将指定的文件编译进内核 blage或者绽译成模块。 make -make bzlmage+make modules 因此如果值编译内核,即只编译配置文件中-y选项,可以直接用命令 makebzlrrage 如果值编译模块,即只编译配置文件中的-n选项,可以之直接使用命令 makemodules 模块可以编译当然也可以清除,使用命令 makemodulles clean 如果只想单独编译一个模块,可以使用命令 mkeM= drivers/test/ modules∥只单独编译 drivers/test中的ko mkeM= drivers/test/ modules clean/清除 上:面的是在内核目录下的操作,但当我写驱动时,我并不可能在内核目录下编 写,但我编译时却要依赖内核中的规则和 Makefile,所以就有了以下的方法 同时这也是般的编与驱动时 Makefile的格式。 指定内核 Makefile并单独编译 make-C /root/linux-2629 Mpwd module ake-C /root/linux- 2.6.29 M pwd module clean C指定内核 Makefile的路径,可以使用相对路径。 ∥-M指定要编译的文件的路径,同样课使用相对路径。 编译生成的模块可以指定存放的目录 mmake-C /root/linux-2 6 29 M pwd modules nstallINSTALL MOD PATH-infsroot 总结 说了这么久估计都说精涂了,其实我只是想表达一下内核编译时大体上究竞是怎么样的一个过程。 我以编译S3(2440的内核为例再说一遍 1般我们会想将份S3C2440的默认配置拷川到内核垠目录卜并改名为.cong 2. akerrenuconfig 21、由总 Makefile决定编译的体系结构(ARCH)编译工具( CROSS COMPILE,并知道需要进去哪些内核根下的哪些日录进 行编译。 22、由 arch/s( ARCHVMakefile,决定 arch/s(ARCH下还有的哪些目录和文件需要编译。 23、知道了需要编译的目录后,递归的进入哪些目录下,读取每一个 Kconfig的信息,牛成了图形配置的界面。 24、通过我们在图形配置界面中选项为[*、M或者囗 2.5、保存并退出配置,会根据配置生成份新的配置文件 config,并在同时生成 inchude/config/auto. cont(这是cong的去注 释版)。文件里面保存着 CONFIG XXXX等变量应该取y是取m lake 3.1、根据 Makefile包含的目录和配置文件的要求,进去个子日录进彳编译,最后会在各子日录下生成一个0或者.a文件, 然后总 Makefile指定的连接本 arch/s( ARCHykemelvmlinux lds生成winx,并道过压缩编程 brimage,或者按要求在对应的 子日录下编译成模块。 源代码:1 st kermel rar 2- linux设备驱动归纳总结(二):模块的相关基础概念 divtvgy-China Unix博客.note i设备驱动归纳总结(二):模块的相关基础概念 系统平台: Ubuntu10.04 开发平台:S3C2440开发板 。初探inu内核模块 内核模块:内核本身是很庞大的一个结构,需要的组件很多。编译内核时,用户可以把所有的代码编译进内核,但是这 样会引起两个问题:一是内核过大;二是当需要添加或者删珎内核时,需要重新再编译内核。所以有了内核模块的概 念。模块并不编译到内核中,编译后存放在指定的目录,当需要使用时动态加载。 1.1下面是一个非常经典的 helloworld代码:目录:lst dule/lst*/ 1# include∥包含了很多装载模块需要的符号和函数的定义 2# include/用于指定初始化函数和清除函数 4 static nt nt test nrt(voi)/内核初始化函数 6 prick" helloworld!n";/印函数,和prin类似 7 return 0 9 10 static void exittest exit( voidy/内核清除函数 printk( good bye! n) 15 module init( test mt);/指定初始化函数 l6 module exit( test exit);/定清除函数 18 MODULE LICENSE("PL;/指定代杩使用的许可证 19 MODULE AUTHOR(" xiaobai;/指定作者 20 MODULE VERSIONG"1.0");/指定代码修订号 1.2再来一个 Makefile 注:如果不知道 make-C.S(KDR)M= pwd modules语句的意思,可以食看im内核驱动归纳总结(-):内核的相关基 础概念的第六小节) obj-m+=test o KDIR: /root/Desktop/drives/nfsroot-29/- 2.6.29 make-C S(KDIR) M pwd odules clean Imake-C S(KDIR) M-pwd modulesclean In-fmodules order 1.3编写完毕后在代码目录下执行“mke命令,就会产 A test ko文件,在开发板上道过命令“ nsmodtest ko;插入模块,通过 命令‘siod'杳看当前的所有装毂上的模块,通过命令“ montes'卸载该模块。并且,加载时会输出‘ helloworld!,卸载时 会输出“ goodbye! root: Ist# mmod test good bve root: Ist# insmod test. ko hello world! root: 1st# lsmod

...展开详情
试读 127P linux设备驱动归纳总结带书签
立即下载 身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
关注 私信
上传资源赚钱or赚积分
最新推荐
linux设备驱动归纳总结带书签 10积分/C币 立即下载
1/127
linux设备驱动归纳总结带书签第1页
linux设备驱动归纳总结带书签第2页
linux设备驱动归纳总结带书签第3页
linux设备驱动归纳总结带书签第4页
linux设备驱动归纳总结带书签第5页
linux设备驱动归纳总结带书签第6页
linux设备驱动归纳总结带书签第7页
linux设备驱动归纳总结带书签第8页
linux设备驱动归纳总结带书签第9页
linux设备驱动归纳总结带书签第10页
linux设备驱动归纳总结带书签第11页
linux设备驱动归纳总结带书签第12页
linux设备驱动归纳总结带书签第13页
linux设备驱动归纳总结带书签第14页
linux设备驱动归纳总结带书签第15页
linux设备驱动归纳总结带书签第16页
linux设备驱动归纳总结带书签第17页
linux设备驱动归纳总结带书签第18页
linux设备驱动归纳总结带书签第19页
linux设备驱动归纳总结带书签第20页

试读结束, 可继续阅读

10积分/C币 立即下载