内核配置、编译与安装

Linux内核具有可定制的有点,下面讲述内核的配置和编译步骤

通常拿到一个内核系统源码,你不知道具体别人有没有配置过这个系统或做了哪些系统配置文件的修改,你要将系统还原到最初的默认配置状态,则直接进行清除临时文件、中间文件和配置文件。

 
总之,


 疑问:
make menuconfig提示:“recipe for target 'scripts/kconfig/mconf.o' failed…”
原因:缺少字符界面运行库,执行:aptitude install libncurses5-dev或者apt-get install libncurses5-dev
步骤一,内核配置:
执行make menuconfig,进入到内核字符配置界面后,注意看上面的提示!!!
1、当进入到子选项后,要退出可以:
①    连续按两次esc键
②    按x键
2、前面没有中括号的表示系统默认选中,不能配置,前面的有中括号的,有*表示选中,没有表示不选(通过按y/n键来切换);
    其中【M】:只编译不链接,【*】:既编译也链接

疑问:
针对不同的开发板,linux内核如何进行配置呢?
可以参考内核源码中提供的一些默认配置选项:
执行:/usr/src/linux-source-4.4.0/linux-source-4.4.0/arch/arm/configs,其中会有一些参考的配置文件,其中/usr/src/linux-source-4.4.0/linux-source-4.4.0为解压的源码所在路径
利用一些参考配置进行修改,不知道的配置不要动!
执行:ls -a可以看到隐藏的.config文件

步骤二,内核编译:
编译指令:
 
其中加了V=1后,在编译会把编译使用的工具,链接了哪些文件,等信息全部都会列出来,方便编译出错调试找出错误原因。

编译内核提示错误:
 
解决:sudo apt-get install libssl-dev
然后执行make bzImage V=1,等待编译完成,可能时间会有点长!

步骤三,编译内核模块:


因为linux内核有一部分直接被编译到linux Image(内核镜像)中,还有一部分功能是以内核模块的形式存在的,因此我们要把这部分功能编译并安装进内核中。

步骤四,安装内核模块:
 
知识补充:内核模块是一种可被动态加载和卸载的可执行程序,把先可能要用到的模块编译安装好后,方便后面系统正常运行后用户随时动态加载调用(注意先编译内核再编译内核模块,编译后的内核模块会驻留在编译过的内核中,这样才可以动态加载)。通过内核模块可以扩展内核功能,内核模块通常用于设备驱动、文件系统等。如果没有内核模块,需要向内核添加功能就需要自发代码、重新编译内核、安装新内核等步骤。参见http://www.cnblogs.com/zhangchaoyang/articles/1933927.html;后面也讲到这一部分。

步骤五,制作init ramdisk
 
知识补充:RamDisk 就是将内存中的一块区域作为物理磁盘来使用的一种技术。对于用户来说,可以把RAM disk与通常的硬盘分区同等对待来使用。
内存盘对于保存加密数据来说很有用,因为我们如果将加密的文件解密到普通磁盘的话,即使我们随后删除了解密文件,数据仍然会留在磁盘上。这样是非常不安全的。而对于 RamDisk 来说,没有这样的问题。
假设有几个文件要频繁的使用,你如果将它们加到内存当中,程序运行速度会大副提高,因为内存的读写速度远高于硬盘。
像Web服务器,需要大量的读取和交换特定的文件的电脑,在Web服务器上建立RamDisk会大大提高网络读取速度。
注意:在2.6版本后,Ramdisk的这一作用开始被tmpfs(Virtual memory file system support)取代。

步骤六,内核安装(不要和内核模块安装混淆)
 
其中,1是将编译好的内核镜像文件(bzImage文件)cp到/boot/下面,名字有规则的取最好(例如vmlinuz-4.12.23);然后将制作好的ramdisk(这里是$initrd)也cp到/boot/下面;最后修改系统启动配置文件(grub或者lilo文件)。
 
可以看到重启后,可以看到My Linux自己制作的linux系统可以启动了
 
补充:
什么是内核模块?
 
例如:
 
其中,static int hello_init(void)在内核模块加载时由系统自动调用运行,由module_init宏指定初始化函数,static void hello_exit(void)是在内核模块卸载时系统调用运行,由module_exit宏指定卸载函数;在内核调用的中的是prink(..)函数。
1、模块的安装与卸载
 
情况1:
编写makefile文件编译上述中的单个hello.c源文件,makefile文件的编写如下:
 
然后,在makefile所在路径执行:make,得到hello.ko文件,然后执行:insmod(hello.ko)

情况2:
编写makefile文件编译上述中的多个源文件,makefile文件的编写如下:
 
然后,在makefile所在路径执行:make,得到hello.ko文件,然后执行:insmod(hello.ko)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章