linux重新编译内核

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Buyi_Shizi/article/details/52045653

    在写驱动程序的过程中,单纯用printk进行前期调试,很是复杂,很难定位错误在什么地方,而内核层的代码是不能像普通程序那样直接利用gdb进行调试的,但是这里说的只是在一台计算机上不能一边运行驱动,一边运行gdb;但是如果有两台计算机,就可以了。一台计算机当作目标机,运行要调试的驱动,另一台计算机当作开发机,运行gdb。

    但是要想目标机支持远程gdb调试,目标机的内核就必须支持这种操作,这就需要重新编译内核,然后把编译好的支持远程gdb调试(kgdb)的内核加载到目标机上,用这个内核来调试驱动程序。

    本文所说的就是上述的第一步:如何编译内核,然后加载到目标机上。

    经过无数次失败的实验:

    

1, 下载的内核编译不通过,有错误,我暂时还不知道什么原因
2, 在开发机上编译好了内核之后,拷贝到目标机的时候,启动直接失败,这样会在下面详述。
   

    首先这里申明我下载的内核版本是4.2.1,在ubuntun14.04上编译完全可以通过,没有问题,gcc的版本是4.4.7。目标机上已经有安装centos6.7系统,内核版本2.6.32(其实目标机上什么系统无所谓,反正都是要重新装载内核的)。

    编译内核分为下面几个步骤:

    1,make menuconfig

    设置编译内核选项,让他支持kgdb远程调试,这里是使用RS232串口线进行远程调试(这里说一下小插曲,由于两个主级之间的串口都是公口,所以我就在网上先买了一个母对母的延长线,回来连接上完全没有反应,才知道运来应该买母对母的交叉线才行,因为母对母的延长线一头的输入到另外一头还是输入,肯定不行的)。

    远程调试的选项设置如下图所示:

       -----〉----〉

    

    在一开始看见网上的介绍说kgdb还支持通过以太网口进行调试,所以一开始就一直在查找如何通过以太网口进行调试,后来看见权威网站上的介绍才知道,以太网口调试的模块在2.6.26之前是以补丁的形式发布的,在2.6.26就没有补丁了,但是也没有并入linux内核开发的主线当中。自己这才死心,走了好多弯路。

    2,make 

    编译内核,第一次编译内核会有点慢,电脑配置好的话,可以开多个线程进行编译,make -j8。

    3,make modules

    这个是编译源码中自带的很多驱动模块,当这个命令执行完毕,在开发机上的工作就全部完毕了,接下来要做的就是把编译好的整个文件拷贝到目标机上,在目标机上安装我们编译好的内核。

    4,make modules_install

    先把编译好的内核模块拷贝到/lib/modules/$(uname-r)中,这些模块是在系统启动的时候会调用的。

    5,make install

    在目标机上安装内核,同时设置grub.config文件,安装完内核之后,vmlinux的压缩文件vmlinuz就会被拷贝到/boot/文件夹下,同时内核的镜像文件initramfs.img也会生成并拷贝到/boot/文件夹下,最后grub.config配置文件中会增加一个新的启动项。

    到此,内核编译安装就完成了。下面说一下,我在编译内核并安装的过程中遇到的问题。

    1,编译好的内核和内核镜像拷贝到/boot/文件夹下,启动一直失败。这个问题出现的时候,我并不是按照上面的步骤来安装的,当我编译完内核之后之后,生成了vnlinuz的压缩文件:/arch/x86_64/boot/bzImage,我直接把他拷贝到目标机的/boot/文件夹下,同时利用mkinitramfs命令生成内核镜像文件,然后把镜像文件也拷贝到/boot/文件夹下,然后修改grub配置文件,就直接重启了,结果重启失败。后来我想可能是我没有安装modules,于是我又利用make moduels命令把modules安装到目标机上,结果重启,还是失败,最后我才利用make install命令,当然是重启成功了,但是如果大神看到我的问题,请告诉我上上面做的哪些地方不对,导致我一次次充启失败?

    2,由于我的工作当中需要USB摄像头,所以USB摄像头的驱动必须安装,在我第一次安装内核成功进入系统之后,却发现/dev/下面没有video*节点,上网查早才知道,手动编译内核默认是没有v4l2框架以及uvcvideo的驱动的,必须在一开始配置的时候选择上,无奈我又要重新编译一次内核,v4l2和uvcvideo的配置如下:

    ----〉----〉

    ----〉

    

    重新编译安装之后,/dev/下面就有video0设备了。

猜你喜欢

转载自blog.csdn.net/Buyi_Shizi/article/details/52045653