编译进内核的模块能提取吗
‘壹’ 如何把自己的驱动编译进内核或模块
我们知道若要给linux内核添加模块(驱动)有如下两种方式:
(1)动态方式:采用insmod命令来给运行中的linux加载模块。
(2)静态方式:修改linux的配置菜单,添加模块相关文件到源码对应目录,然后把模块直接编译进内核。
对于动态方式,比较简单,下面我们介绍如何采用静态的方式把模块添加到内核。
最终到达的效果是:在内核的配置菜单中可以配置我们添加的模块,并可以对我们添加的模块进行编译。
一. 内核的配置系统组成
首先我们要了解Linux 2.6内核的配置系统的原理,比如我们在源码下运行“make menuconfig ”为神马会出现一个图形配置菜单,配置了这个菜单后又是如何改变了内核的编译策略滴。
内核的配置系统一般由以下几部分组成:
(1)Makefile:分布在Linux内核源代码中的Makefile,定义Linux内核的编译规则。
(2)配置文件(Kconfig):给用户提供配置选项,修改该文件来改变配置菜单选项。
(3)配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释),配置用户界面(提供字符界面和图形界面)。这些配置工具都是使用脚本语言编写的,如Tcl/TK、Perl等。
其原理可以简述如下:这里有两条主线,一条为配置线索,一条为编译线索。配置工具根据kconfig配置脚本产生配置菜单,然后根据配置菜单的配置情况生成顶层目录下的.config,在.config里定义了配置选择的配置宏定义,如下所示:
如上所示,这里定义的这些配置宏变量会在Makefile里出现,如下所示:
然后make 工具根据Makefile里这些宏的赋值情况来指导编译。所以理论上,我们可以直接修改.config和Makefile来添加模块,但这样很麻烦,也容易出错,下面我们将会看到,实际上我们有两种方法来很容易的实现。
二. 如何添加模块到内核
实际上,我们需要做的工作可简述如下:
(1)将编写的模块或驱动源代码(比如是XXOO)复制到Linux内核源代码的相应目录。
(2)在该目录下的Kconfig文件中依葫芦画瓢的添加XXOO配置选项。
(3)在该目录的Makefile文件中依葫芦画瓢的添加XXOO编译选项。
可以看到,我们奉行的原则是“依葫芦画瓢”,主要是添加。
一般的按照上面方式又可出现两种情况,一种为给XXOO驱动添加我们自己的目录,一种是不添加目录。两种情况的处理方式有点儿不一样哦。
三. 不加自己目录的情况
(1)把我们的驱动源文件(xxoo.c)放到对应目录下,具体放到哪里需要根据驱动的类型和特点。这里假设我们放到./driver/char下。
(2)然后我们修改./driver/char下的Kconfig文件,依葫芦添加即可,如下所示:
注意这里的LT_XXOO这个名字可以随便写,但需要保持这个格式,他并不需要跟驱动源文件保持一致,但最好保持一致,等下我们在修改Makefile时会用到这个名字,他将会变成CONFIG_LT_XXOO,那个名字必须与这个名字对应。如上所示,tristate定义了这个配置选项的可选项有几个,help定义了这个配置选项的帮助信息,具体更多的规则这里不讲了。
(3)然后我们修改./driver/char下的Makefile文件,如下所示:
这里我们可以看到,前面Kconfig里出现的LT_XXOO,在这里我们就需要使用到CONFIG_XXOO,实际上逻辑是酱汁滴:在Kconfig里定义了LT_XXOO,然后配置完成后,在顶层的.config里会产生CONFIG_XXOO,然后这里我们使用这个变量。
到这里第一种情况下的添加方式就完成了。
四. 添加自己目录的情况
(1)在源码的对应目录下建立自己的目录(xxoo),这里假设为/drivers/char/xxoo 。
(2) 把驱动源码放到新建的xxoo目录下,并在此目录下新建Kconfig和Makefile文件。然后给新建的Kconfig和Makefile添加内容。
Kconfig下添加的内容如下:
这个格式跟之前在Kconfig里添加选项类似。
Makefile里写入的内容就更少了:
添加这一句就可以了。
(3)第三也不复杂,还是依葫芦画瓢就可以了。
我们在/drivers/char目录下添加了xxoo目录,我们总得在这个配置系统里进行登记吧,哈哈,不然配置系统怎么找到们呢。由于整个配置系统是递归调用滴,所以我们需要在xxoo的父目录也即char目录的Kconfig和Makefile文件里进行登记。具体如下:
a). 在drivers/char/Kconfig中加入:source “drivers/char/xxoo/Kconfig”
b). 在drivers/char/Makefile中加入:obj-$(CONFIG_LT_XXOO) += xxoo/
添加过程依葫芦画瓢就可以了,灰常滴简单。
‘贰’ linux内核配置与编译时,下载来的内核源代码应该放在哪呢
随便就行,/usr/src/linux 放当前运行中的内核源代码的习惯你可以遵守,也可以不遵守。
只不过是一些软件在编译时会固定到这里找内核源代码的相关数据来保证自己的内核模块可以正确编译。不过有些时候 /usr/mole 里面的内核目录里面也有到你的源代码目录的链接。很多软件两个地方找到一个就能继续编译。
反正你安装内核后,最好不要再动这个内核源代码的位置就行了。其实需要内核源代码的软件也没几个。除了 udev ,我也就只能想起还有显卡驱动了。另外你如果用了虚拟机软件,那就还有虚拟机软件运行时需要的内核模块需要。不过也都是在编译时才需要。运行是不需要的(但改了内核版本,肯定是要重新编译内核模块的)。
‘叁’ 弄好的内核模块怎么弄进开发板里面去啊(我已经用交叉编译器德到了.ko文件)
这些是初学者经常遇到的问题。我以前也遇到过,所以还是我来回答你吧。首先rz命令是BusyBox里面是不带的,如果你要用就要另外下载一个rz,然后用arm编译之后再放到开发板/bin目录下面。但是我不推荐用rz,速度很慢的。最方便的还是挂载网络文件系统了,如果使用uboot命令如下:
#setenv bootargs "root=/dev/nfs nfsroot=192.168.0.宿主机文件系统路径:/forlinx/root
ip=192.168.0.开发板:192.168.0.宿主机:255.255.255.0 console=ttySAC0,115200"
#saveenv
使用网络文件系统要确保网卡可用!可以在UBOOT下先PING下主机IP;
我的QQ285226942,还要问题的话咱们可以继续探讨
‘肆’ 如何把自己的驱动编译进内核或模块
2.6内核的源码树目录下一般都会有两个文文:Kconfig和Makefile。分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。在内核编译时,主Makefile调用这个.config,就知道了用户对内核的配置情况。
上面的内容说明:Kconfig就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。
因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)
*Kconfig
*Makefile
要想知道怎么修改这两种文件,就要知道两种文档的语法结构。
First: Kconfig
每个菜单项都有一个关键字标识,最常见的就是config。
语法:
config symbol
options
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
symbol就是新的菜单项,options是在这个新的菜单项下的属性和选项
其中options部分有:
1、类型定义:
每个config菜单项都要有类型定义,bool:布尔类型, tristate三态:内建、模块、移除, string:字符串, hex:十六进制, integer:整型
例如config HELLO_MODULE
bool "hello test mole"
bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.
2、依赖型定义depends on或requires
指此菜单的出现是否依赖于另一个定义
config HELLO_MODULE
bool "hello test mole"
depends on ARCH_PXA
这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA, 该菜单才可见(可配置)。
3、帮助性定义
只是增加帮助用关键字help或---help---
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
更多详细的Kconfigconfig语法可参考:
Second: 内核的Makefile
内核的Makefile分为5个组成部分:
Makefile 最顶层的Makefile
.config 内核的当前配置文档,编译时成为顶层Makefile的一部分
arch/$(ARCH)/Makefile 和体系结构相关的Makefile
s/ Makefile.* 一些Makefile的通用规则
kbuild Makefile 各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。
顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。Arch Makefile则提供补充体系结构相关的信息。 s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。
(其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果)
在linux2.6.x/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。
最后举个例子:
假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:
第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。
第二:修改/driver/mtd/maps目录下的kconfig文档:
config MTD_flashtest
tristate “ap71 flash"
这样当make menuconfig时 ,将会出现 ap71 flash选项。
第三:修改该目录下makefile文档。
添加如下内容:obj-$(CONFIG_MTD_flashtest) += flashtest.o
这样,当您运行make menucofnig时,您将发现ap71 flash选项,假如您选择了此项。该选择就会保存在.config文档中。当您编译内核时,将会读取.config文档,当发现ap71 flash 选项为yes 时,系统在调用/driver/mtd/maps/下的makefile 时,将会把 flashtest.o 加入到内核中。即可达到您的目的。
转载
‘伍’ 请问Linux内核编译为模块的功能怎样使用
编译后的模块放在/lib/moles/对应的内核版本号/kernel目录下,要想使用可以insmod moleName
或在/etc/moles.conf或/etc/modprobe.conf文件中添加相应信息
编译后的模块在/lib/moles下,不是源代码的目录下,楼主是编译的当前内核,不是编译的新内核?
‘陆’ 编译进linux内核中的驱动模块可不可以rmmod
不可以吧,这个还真的不清楚,不过你可以尝试在etc中的modprobe配置文件中把它列入黑名单。
‘柒’ 如何单独编译内核模块
第一点,就是源码树中有相应的头文件和函数的实现,没有源码树,你哪调用去呢?(PC上编译的时候内核有导出符号,系统中有头文件,这样就可以引用内核给你的接口了,但是只能编译你PC上版本的内核可加载的模块)。
第二个,内核模块中会记录版本号的部分,需要记录版本号的原因是不同的内核版本之间,那些接口和调用可能会有比较大的差异,因此必须要保证你的代码和某个特定的内核对应,这样编译出来的模块就可以(也是只能)在运行这个内核版本的Linux系统中加载,否则一个很简单的异常就会导致内核崩溃,或者你的代码根本无法编译通过(接口名变了)。
我上面说的是编译模块的情况,当然如果是把模块直接编译到内核当中去的话,那就不用说了,没有内核源码,你无法编译内核。
‘捌’ 内核编译以及如何得到kernel
注:不仅要对机器本身有了解,还要对Linux系统有一定的了解)有一定的理解——这是一个难题。
因此一个Linux新手是根本不会尝试编译内核的。这篇文章中展示了一些在使用“make xconfig”命令编译内核过程中的截图。
使用这个命令(“make xconfig”),用户可以通过图形用户界面(GUI)和鼠标来对内核进行处理。
这里有差不多40张截图,它们解释了在某种特定的情况下为什么你需要或不能选择某个特定的内核选项(options)。
将这40幅截图逐一讨论看上去似乎有些夸张,但这的确是解释内核的内部工作机理(internal
workings)以及特定内核选项存在的原因和工作原理的比较好的方法。
这些截图是kernel-2.4.6的。最新的内核是2.4.19,但是除去在菜单中有一些新的项目(e.g.对新硬件的支持)以外,
屏幕的显示以及编译的过程应该是一样的。建议你在开始编译前把这篇文章打印出来,这样你就可以随时查找必要的信息!
本文的结构如下。首先讨论你在Internet的什么地方能够找到内核的源码以及如何安装这些源码,
然后通过屏幕截图讨论使用图形界面配置内核。 一旦内核配置完毕,它就需要被编译,但是一个新编译的内核并不能直接使用。
首先,新内核需要和引导程序“lilo”一起安装,然后,在使用lilo前你必须写配置文件“/etc/lilo.conf”。
另外,还有需要指出一些特殊的要点(specific points),比如笔记本电脑需要的PCMCIA支持。
看上去象信用卡的PCMCIA,小型板卡(small inserts)通常负责联网任务,在2.4.x的内核中已经可以直接提供支持。
但之前的内核需要重新编译安装后才能提供PCMCIA支持。SuSE Linux还有一个问题,那就是ALSA声卡驱动程序的音效支持。
这些驱动程序并不是内核的一部分,它们需要被编译进去然后重新安装,因为原始的驱动程序通常没有工作。
更麻烦的是,从一个系列的内核转到另一个系列的内核,比如从2.2.x系列转到2.4.x系列, 可能会由于使用某种(某些)内核工具(kernel
utilities)而产生一些问题。 这就是所谓的“motils”(译者注:可以看为“Moles
Utilities”的所写,这样就不会对这个名称感到费解了),包括代码(code)需要载入(load)的内核模块(kernel
mole):图3解释了什么是内核模块。 有时新内核不知道如何处理老的motils,所以你必须编译和安装更新版本的motils。
这样的问题虽然不多但是它们的确存在,而且目前只能预先指出它们。
但是如果你完全按照本文的步骤进行,几乎不会发生错误。新内核被添加到lilo,或者被复制()到loadlin所在的分区。
因此,在紧急情况下,你仍然可以通过老内核启动机器。然后可以在老内核下试着解决新内核的问题。
即使你遇到motils的问题,你也可以从老内核重新启动计算机,然后通过将它们(内核和motils)分别编译和安装来修复(fix)这个问
题: 所有新版本的motils都对老内核向下兼容,所以新motils在老内核下可以很好的工作。
‘玖’ linux:编译内核或模块(用内核代码的)时用内核源码; 编译普通模块(只用提供的接口)用内核开发包吗
可以的。使用命令 make moles_install
‘拾’ 易语言只调用易模块的一部分资源 会把整个模块编译进程序里吗 还是只会从模块内提取所需的资源编译进程序
会把整个模块都编译进去的