嵌入式Linux内核模块的配置与编译.docx

上传人:安*** 文档编号:19011059 上传时间:2022-06-03 格式:DOCX 页数:23 大小:21.63KB
返回 下载 相关 举报
嵌入式Linux内核模块的配置与编译.docx_第1页
第1页 / 共23页
嵌入式Linux内核模块的配置与编译.docx_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《嵌入式Linux内核模块的配置与编译.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux内核模块的配置与编译.docx(23页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、嵌入式Linux内核模块的配置与编译嵌入式Linux内核模块的配置与编译一、简介随着Linux操作系统在嵌入式领域的快速发展,越来越多的人开场投身到这方面的开发中来。但是,面对庞大的Linux内核源代码,开发者怎样开场本人的开发工作,在完成本人的代码后,该怎样编译测试,以及怎样将本人的代码编译进内核中,所有的这些问题都直接和Linux的驱动的编译以及Linux的内核配置系统相关。内核模块是一些在操作系统内核需要时载入和执行的代码,它们扩展了操作系统内核的功能却不需要重新启动系统,在不需要时能够被操作系统卸载,又节约了系统的资源占用。设备驱动程序模块就是一种内核模块,它们能够用来让操作系统正确识

2、别和使用使用安装在系统上的硬件设备。Linux内核是由分布在全球的Linux喜好者共同开发的,为了方便开发者修改内核,Linux的内核采用了模块化的内核配置系统,进而保证内核扩展的简单与方便。本文通过一个简单的示例,首先介绍了怎样在Linux下编译出一个内核模块,然后介绍了Linux内核中的配置系统,讲述了怎样将一个自定义的模块作为系统源码的一部分编译出新的操作系统,注意,在这里我们介绍的内容均在内核2.6.13.2也是笔者的开发平台的版本上编译运行通过,在2.6.*的版本上基本上是能够通用的。二、单独编译内核模块首先,我们先来写一个最简单的内核模块:#include#include#incl

3、ude#defineDRIVER_VERSIONv1.0#defineDRIVER_AUTHORRF#defineDRIVER_DESCjustfortestMODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE(GPL);staticintrfmodule_init(void)printk(hello,world:modele_init);return0;staticvoidrfmodule_exit(void)printk(hello,world:modele_exit);module_init

4、(rfmodule_init);module_exit(rfmodule_exit);这个内核模块除了在载入和卸载的时候打印2条信息之外,没有任何其他功能,不过,对于我们这个编译的例子来讲,已经足够了。将上述源代码保存到一个test.c文件中,然后开场我们的内核模块的编译工作。内核模块的编译与普通应用程序的编译一样,也使用的GCC,但是内核模块在用GCC编译的时候时需要使用特定的参数并定义一些宏。这是由于在编译普通应用程序的可执行文件和内核模块时,内核头文件起的作用是不同的。在以往的内核版本需要我们去在Makefile中手动设置这些设定,固然这些Makefile都是按目录分层次存放的,但使用维

5、护起来还是比拟伏在。幸运的是,一种称为kbuild的新方法被引入,如今外部的可加载内核模块的编译的方法已经同内核编译统一起来,编译新的内核模块或者将本人的内核模块集成到内核源码中都已经变得非常简单了。如今让我们看一下怎样编译一个名字叫做test.c的模块。首先,我们需要写一个简单的Makefile文件:obj-m+=test.o将test.c和Makefile文件放在同一个目录下,然后就能够开场编译了,使用编译命令:make-C/usr/src/linux-2.6.13.2/SUBDIRS=$PWDmodules回车后,也许你会发现有一堆的报错,请检查如下配置能否正确:1、在/usr/src/

6、下有无放置你需要使用的内核源码树?假如没有,请上网down一个你需要的内核源码版本,解压后放在这里。2、假如你已经将内核源码解压在/usr/src/下了,那么请先使用在内核源码的主目录下,在笔者的系统中就是/usr/src/linux-2.6.13.2/,使用:makeconfig或者makemenuconfig或者makegconfig等命令来配置内核,然后使用makeall将整个内核完好编译一次。3、上述命令中的linux-2.6.13.2是笔者使用的内核源码的目录名,你需要将它改成你本人使用对应版本的的内核源码的目录名。经过上述三步,一般来将,该内核模块都能够编译通过了,生成的test.

7、ko就是我们需要的内核模块的最终版本,你能够使用:insmod./test.ko将该模块载入系统。请注意:假如想将模块载入系统,请保证编译模块使用的内核源码的版本与要载入的系统的版本一致!否则无法载入!嵌入式开发实作Linux内核编译及安装部分内容译自(EmbeddedLinuxkernelanddriverdevelopment)byMichaelOpdenacker刘建文httpdocsj/doc/d3f6157f5acfa1c7aa00ccbc./keminlauKEY:Linux内核编译内核配置嵌入式内核配置KernelconfigurationMakefile版本修改为了区别基于同一

8、源码构建bulid的不内核镜像,可使用变量EXTRAVERSION定义位于makefile的顶部:VERSION=2PATCHLEVEL=6SUBLEVEL=7EXTRAVERSION=-acme1VERSION=2PATCHLEVEL=6SUBLEVEL=7EXTRAVERSION=-acme1VERSION=2PATCHLEVEL=6SUBLEVEL=7EXTRAVERSION=-acme1运行“uname-r会返回:2.6.7-acme12.内核配置先定义内核需要什么特性,并进行配置。内核构建系统Thekernelbuildsystem远不是简单用来构建整个内核和模块,想了解更多的高级内

9、核构建选项,你能够查看Documentation/kbuild目录内的内核文档。可用的配置命令和方式:makexconfigmakemenuconfigmakeoldconfig或者手动编写内核编译的配置文件.config与内核配置的makefile?内核配置文件Makefile语法的保存为内核源代码的顶层目录的.config文件。发行版的内核配置文件通常在/boot/内。命令:makexconfigqconf:全新的基于QT的配置接口,2.6版本内核更易使用切记阅读help-introduction:usefuloptions!具有文件阅读功能,更易的加载配置文件命令:makemenucon

10、fig老式字符界面,仍然很管用。你够自信,完全能够手写配置文件!命令:makeoldconfig用于升级早期发布内核的配置文件对一些绝对符号obsoletesymbols发出警告询问新符号的配置值何为makefile?makefile包含用以构建应用程序的一组规则集setofrules。并且第一条规则是特殊的规则,叫默认规则defaultrule。一条规则由三部分组成:目的target、前提条件prerequisites和命令动作command:target:prereq1prereq2commandstarget:prereq1prereq2commandstarget:prereq1pre

11、req2commands目的是被构建made的文件或其它东西。前提条件或者叫依靠dependents构建目的的“材料。而命令动作是利用前提条件构建目的的shell命令。下面是编译C源码的规则例子:foo.o:foo.cfoo.hlt;tabgcc-cfoo.cfoo.o:foo.cfoo.hlt;tabgcc-cfoo.cfoo.o:foo.cfoo.hgcc-cfoo.c注意格式,冒号前是目的,后是前提条件;命令在第二行,并且开场于一个tab字符。编译内核编译和安装内核编译步骤:$cd/usr/src/linux2.6$make$cd/usr/src/linux2.6$make$cd/usr

12、/src/linux2.6$make安装步骤(loggedasroot!)$makeinstall$makemodules_install$makeinstall$makemodules_install$makeinstall$makemodules_install下面的步骤在2.6版本不再使用:$makedepends$makemodules(donebymake)$makedepends$makemodules(donebymake)$makedepends$makemodules(donebymake)提升编译速度多花一些时间在内核配置上,并且只编译那些你硬件需要的模块。这样能够把编译时

13、间缩短为原来的1/30,并且节省数百MB的空间。另外,你还能够并行编译多个文件:$make-jmake能够并行执行多个目的targetKEMIN:前提是目的规则间没有穿插依靠项,这个怎么做到的?$make-j4即使是在单处理器的工作站上也会很快,读写文件的时间被节省下来了。多线程让CPU保持繁忙。number大于4不见得有效了,由于上下文切换太多反而降低的工作的速度。make-j内核编译tips查看完好的(gcc,ld)命令行:$makeV=1清理所有的生成文件(tocreatepatches.):$makemrproper部分编译:$makeM=drivers/usb/serial单独模块编

14、译:$makedrivers/usb/serial/visor.ko别处编译假设源码在CDROM:$cd/mnt/cdrom/linux-2.6.17.11$makeO=/linux/linux-2.6.17.11最终生成的文件vmlinux原始内核镜像,非压缩的arch/boot/zImagezlib压缩的内核镜像Defaultimageonarmarch/boot/bzImagebzip2压缩的内核镜像。通常很小,足够放入一张软盘Defaultimageoni386安装的文件/boot/vmlinuz-内核镜像;/boot/System.map-保存有内核的符号地址symboladdres

15、ses;/boot/initrd-.imgInitialRAMdisk:保存有你需要在引导时挂接最终根文件系统的模块。安装命令“makeinstall为替你运行“mkinitrd生成initrd;/etc/grub.confor/etc/lilo.confbootloader的配置文件:“makeinstall会为你的新内核更新相应的bootloader的配置文件。假如你使用的是LILO,它会在生成配置文件后,执行/sbin/lilo,让LILO的配置生效。/lib/modules/Kernelmodules+extrasbuild/为本的内核添加模块所需的所有东西:.configfile(b

16、uild/.config),modulesymbolinformation(build/module.symVers),kernelheaders(build/include/)kernel/内核模块文件.ko(KernelObject),目录构造与源代码目的逐一对应。modules.alias模块别名记录用于insmod和modprobe,例如:aliassound-service-?-0snd_mixer_ossmodules.dep模块依靠记录用于insmod和modprobemodules.symbols标识某符号是属于哪个模块的。这个目录的所有文件都是文本文件,能够直接查看。小结编译

17、及安装步骤:编辑Makefile版本信息定义内核特性,生成配置文件.config,用于编译:makexconfig编译内核:make安装内核:makeinstall安装模块:makemodules_install穿插编译内核Makefile修改通常通过修改已有的makefile获得你必须修改目的平台,假设目的平台是ARM,修改下面:ARCH?=armCROSS_COMPILE?=arm-linux-ARCH?=armCROSS_COMPILE?=arm-linux-ARCH?=armCROSS_COMPILE?=arm-linux-或运行带参数的make:$cd/usr/scr/linuxXX

18、$makeARCH=armCROSS_COMPILE=arm-linux-$cd/usr/scr/linuxXX$makeARCH=armCROSS_COMPILE=arm-linux-$cd/usr/scr/linuxXX$makeARCH=armCROSS_COMPILE=arm-linux-内核配置文件配置经过和本地配置一样;能够把生成的配置文件.config共享给其别人,比方像:$cp.configarch/config/acme_defconfig$cp.configarch/config/acme_defconfig$cp.configarch/config/acme_defcon

19、fig这样其他同样开发ACME系统的开发人员能够通过下面命令编译出同样的内核:$makeacme_defconfig$makeacme_defconfig$makeacme_defconfig$建立穿插编译环境Cross-compilingsetup假设你有ARM的穿插编译工具cross-compilingtoolchain在in/usr/local/arm/3.3.2/,你得把它输出到PATH:$exportPATH=/usr/local/arm/3.3.2/bin:$PATH$exportPATH=/usr/local/arm/3.3.2/bin:$PATH$exportPATH=/usr

20、/local/arm/3.3.2/bin:$PATH注意查看内核文档在Documentation/Changes有关最低工具版本要求。编译并安装内核1.$make/假如你修改了Makefile或者1.$makeARCH=armCROSS_COMPILE=arm-linux-2.拷贝arch/boot/zImage到目的系统$makemodules_install3.拷贝/lib/modules/到目的系统你能够通过arch/boot/install.sh自定义安装,让makeinstall“自动代劳。何为穿插编译工具链(cross-compilingtoolchain)?有如任何其它开发活动一

21、般,嵌入式开发的第一步是建立settingup用于构建嵌入式Linux内核当然包括驱动程序及应用程序的工具链toolchains。不过,嵌入式开发需要是跨平台工具链。跨平台是什么意思呢?一般开发活动是在本地编译,使用是本地的工具链;而由于嵌入式的软硬资源内存缺乏、没有本地编译器或操作系统都没有限制等没法进行本地开发。需要在Linux-x86主机HOST开发,使用主机的编译器生成目的TARGET平台代码,这个经过叫穿插编译。我们经常讲的编译器有广义和狭义之分。狭义的编译器只完软件编译或者叫软件构建的第一步;广义的编译器包括了软件编译或者叫软件构建所需要代码库比方libc和其它构建工具比方汇编器和

22、连接器。无论是什么编译器都需要支持的代码库和各种构建工具,穿插编译也不例外。一整套广义的编译器称为穿插编译工具链。何为工具链?Insoftware,atoolchainisthesetofcomputerprograms(tools)thatareusedtocreateaproduct(typicallyanothercomputerprogramorsystemofprograms).Thetoolsmaybeusedinachain,sothattheoutputofeachtoolbecomestheinputforthenext,butthetermisusedwidelytoref

23、ertoanysetoflinkeddevelopmenttools.Asimplesoftwaredevelopmenttoolchainconsistsofatexteditorforeditingsourcecode,acompilerandlinkertotransformthesourcecodeintoanexecutableprogram,librariestoprovideinterfacestotheoperatingsystem,andadebugger.TheGNUtoolchainisablankettermforacollectionofprogrammingtool

24、sproducedbytheGNUProject.Thesetoolsformatoolchain(suiteoftoolsusedinaserialmanner)usedfordevelopingapplicationsandoperatingsystems.ProjectsincludedintheGNUtoolchainare:*GNUmake:Automationtoolforcompilationandbuild;*GNUCompilerCollection(GCC):Suiteofcompilersforseveralprogramminglanguages;*GNUBinutil

25、s:Suiteoftoolsincludinglinker,assemblerandothertools;*GNUBison:Parsergenerator*GNUm4:m4macroprocessor*GNUDebugger(GDB):Codedebuggingtool;*GNUbuildsystem(autotools):oAutoconfoAutoheaderoAutomakeoLibtool参考httpdocsj/doc/d3f6157f5acfa1c7aa00ccbc./index.php/2006/01/05/autotools-tutorial/本文来自CSDN博客,转载请标明出

26、处:httpdocsj/doc/d3f6157f5acfa1c7aa00ccbc./shijizhisheng/archive/2020/09/16/4558107.aspx把设备驱动程序编译进嵌入式linux内核文章来源网络属于linux分类电脑编程网整理2007107简介:这是把设备驱动程序编译进嵌入式linux内核的具体页面,介绍了和linux,有关的知识,参加珍藏请按键盘ctrl+D,谢谢大家的观看!要查看更多有关信息,请点击此处驱动程序的使用能够根据两种方式编译,一种是静态编译进内核,另一种是编译成模块以供动态加载。由于uclinux不支持模块动态加载,而且嵌入式linux不能够象桌

27、面linux那样灵敏的使用insmod/rmmod加载卸载设备驱动程序,因此这里只介绍将设备驱动程序静态编译进uclinux内核的方法。下面以uclinux为例,介绍在一个以模块方式出现的驱动程序test.c基础之上,将其编译进内核的一系列步骤:1改动test.c源带代码第一步,将原来的:#include#includecharkernel_version=uts_release;和把设备驱动程序编译进嵌入式linux内核有关的编程小帖士:strongsession_encodeSession资料编码。语法:booleansession_encode(void);返回值:布尔值内容讲明本函数可将Session资料编码,编码以ZEND引擎做哈稀编码。本函数没有参数。成功则返回true值。改动为:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 培训材料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com