linux内核树的建立

来源:互联网 发布:gfw屏蔽域名和ip 编辑:程序博客网 时间:2024/06/05 14:52

        哎,首先我要叹下气。因为建立一个linux内核树折腾我快一个礼拜了(当然了一般都是工作之余弄这个东西)。我为什么要去做这个事呢?其实我目的是为了分析openVswitch中的upcall调用;分析这个调用,我首先就要去分析下Netlink运行机制,分析Netlink机制当然得做些实验;因为Netlink机制是linux内核和用户空间的通讯机制,所以要做实验就要做些linux模块编程;所以最终就有了我这几天的折腾和这篇blog(我开始使用的虚拟机前段时间不小心被删掉了,而当时建内核树没做笔记,离现在时间又比较久了)。

        好了,不说废话了,开始建立个linux内核树吧(注:在准备建立内核树之前,请先确认你的系统中没有建立内核树。否则当你折腾完后,发现其实系统里面已经有内核树了,那你不是白费劲了。确认方法请参考第十步)。

        第一、下载个和你现在运行的系统版本号相同的纯净的内核。最好是不要用你运行着的内核做内核树,因为这是发行版本的内核,商家可能做过一些补丁。可以用命令下载,也可以在网上下载后,放到你创建好的目录中去。

查看自己运行系统的内核版本号:uname -r

         

        在你放内核的目录下把下载到的压缩内核解压出来(网上下载来一般都是压缩文件内核),用相应的解压命令解压出来。

        命令:tar -xvf linux-2.6.35.6.tar.bz2

        

        第二、到你运行的系统中拷贝一份.config配置文件到当前目录下(内核解压出来的目录中,我的是linux-2.6.35.6目录下)

        命令:cp /usr/src/kernels/2.6.35.6-45.fc14.i686/.config     ./

        

        第三、make menuconfig命令来定制你的内核,如图:

        在第一级目录中,一般只要修改下 Enable loadable module support选项,因为是要配置模块编程嘛。(前面有个*表示选中了,用空格键来选择)

        

        鼠标放在Enable loadable module support,按下enter进入二级选择目录。和下面选项一样就可以了。

        

        第四、接下来是要编译内核了,但是为了能够一次性成功。希望你有耐心看完下面的友好提示,这都是我自己遇到过的一些问题。首先是检查下你的内存有多大,以及交换内存(swap)有多大;如果你的内存不够大,到时候链接库的时候就会出错,大概就是报这样的错误:ld:final link failed:Memory exhausted;怎么解决呢?可以用命令来查看下当前一些资源的限制,然后调整下就可以了。

        命令:ulimit -a

        

        上面箭头显示的就是要调整的,有数据段大小,内存最大值,栈大小,虚拟内存大小,一般来说就那几个了。下面看看调整

        命令:ulimit -s unlimited;ulimit -m unlimited;ulimit -v unlimited。。。。

        

        最后说下,编译一个内核究竟要多少内存呢?我不知道确切的是多少,但我编译我的内核时,分配了512M的物理内存,和2G的虚拟内存。在链接(就是ld)的时候我查看了下,内存使用率竟然高达92%(链接的时候我的机器内存使用率基本在78%~~92%之间)。所以建议如果是虚拟机上编译,尽量不要少于我这个物理内存和虚拟内存(我设置的是物理内存使用60%的时候就会开始使用虚拟内存)。如果你不知道运行系统上还有多少内存可以用free来查看下;

        命令:free -m

        

        参数-m表示以MB单位显示,主要看下红箭头指向的数据(我的编译时没截图,这是现在运行时截的图)

        第五、开始编译内核了,直接在内核目录下(我的目录为:linux-2.6.35.6)make就可以了,这个一般要等1个多小时,所以如果要重新编译的话,那是有多费时间啊。我折腾这么久的原因也是这个。还有个要说下如果你在编译期间有什么特殊情况,中断了这个编译,只要你不make menuconfig或者修改配置文件,那么还可以继续make进行编译。就像上面提到的内存不足问题,到时候可以调整内存后继续make编译。因为这步要非常久的时间,而且编译的文件比较多,又没有什么特殊的标示。所以就没有截图了。

        命令:make

        如果你在编译的时候,发现有情况不对,或者编译到某个地方时总是出错。那么你可以再开个标签然后监听下是不是你给的资源不够,这样可以方便你找出问题。

        命令:top

        

        这图也是我编译成功后再使用top截取的图。(建议不要全程监听,因为top监听也会用掉一定的资源)

        第六、修改Makefile文件,只要修改EXTRAVERSION选项就可以,如下图:

        

        第七、编译压缩的内核,

        命令:make bzImage

        

        第八、编译模块

        命令:make modules

        

        第九、安装编译

        命令:make modules_install

        

        第十、查看内核树,到/lib/modules目录中选择你安装的代码树目录,然后进去用 ls -l看下

        

        其实我犯了个很大的错误,就是粗心。因为一开始就先入为主以为我安装的系统没有建立内核树,忘记了这个内核镜像是开发板配套的,商家已经在这个内核中建立了代码树。搞得我折腾了这么久,原来是白费功夫。所以在准备建立内核树时,先到/lib/modules下面看看是否建立了内核树。下面看下商家建立的内核树,他们是直接用运行着内核做的内核树。

        

        至此内核树的建立就已经完成了,上面的步骤是我自己亲自实验过了,可能有些地方理解错误,或者有些操作是多此一举的。希望知道的可以指正下,多多交流,一起学习,共同进步。


        ==========================================================================================================

问题:       

        这是后期在编译内核树时遇到的一些问题及解决办法,记录下来希望对大家有用:

        第一个:/usr/src/kernels/下面为空;当你准备从/usr/src/kernels下面拷贝.config到你源代码里编译时,发现里面是个空的文件夹。这是因为你可能是个新安装的系统,里面没有内核源代码包。只要执行下命令:yum install kernel-headers kernel-devel gcc 就可以了。

        第二个:当内核树建立好,准备测试时,发现加载模块时报错:insmod: error inserting 'hello.ko': -1 Invalid module format;不要担心,小问题。这是你的内核树版本和当前你运行的系统版本不一致导致的。修改方法是:在你Makefile文件中把有关内核版本的地方都用当前版本代替;还是举例吧:比如Makefile中有一句,KERDIR=/lib/modules/$(shell uname -r)/build。那么把这句修改为:KERDIR=/lib/modules/当前运行内核版本号。就可以解决了。 

        第三个:    

        HOSTCC  scripts/kconfig/conf.o
        HOSTCC  scripts/kconfig/kxgettext.o
        *** Unable to find the ncurses libraries or the
        *** required header files.
        *** 'make menuconfig' requires the ncurses libraries.
        *** 
        *** Install ncurses (ncurses-devel) and try again.
        *** 
        make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
        make: *** [menuconfig] Error 2
        解决:yum install ncurses-devel.x86_64  -y

        第四个:make[1]: *** No rule to make target `missing-syscalls'.  Stop.这个问题还没有完全解决。错误原因是:你编译的地方只有头文件没有源代码。解决办法:安装个同运行版本的rpm包:rpm -ivh kernel-xxxxx-.src.rpm。我的安装不了,所以就下了个同运行版本的内核源代码,按照上面的建立内核树就可以了。

        ==========================================================================================================

        交叉编译驱动环境搭建:

        我的开发板是mini2440(s3c2440)内核版本是:2.6.32.2;用开发板自带的源码,利用samba服务器把源代码放到宿主机中,然后解压。(操作的都是在宿主机中)编译内核树的步骤和上面的一样,第二步稍微修改下,源码中一般有自带的.config文件,我的是config_mini2440_x35,把该文件拷贝一份为.config就可以了。其他的和上面一样。

        转载请注明作者和原文出处,原文地址:http://blog.csdn.net/yuzhihui_no1/article/details/40185363


1 0