linux内核编译相关
一. 内核编译
1) linux 2.4
make clean/make mrproper
make dep
make zImage
make modules //编译模块
2) linux 2.6
make clean/make mrproper
make // 编译内核同时编译了模块
3) 模块安装
上述步骤完成后,模块分布在各个内核目录下,通过下面命令安装到具体目录下:
make modules_install INSTALL_MOD_PATH=./mod_dir
其中./mod_dir为模块安装目录,禁止为“/”(安装到本机host上)。
注:可通过make help查看make选项。
clean Remove most generated files but keep the config and enough build support to build external modules
mrproper Remove all generated files + config + various backup files
distclean mrproper + remove editor backup and patch files
二. 镜像文件介绍
一般情况下,先编译链接生成顶层目录的vmlinux,再把vmlinux精简压缩成piggy.gz,然后加上自引导程序链接生成arch/$(ARCH)/boot/zImage,这样就得到一个具备自启动能力的linux内核映像。
>>vmlinux 内核在虚拟空间运行时代码真实反应。
不具备引导能力,需要借助其他Bootloader引导启动。
位于顶层目录。
注:linux内核运行在虚拟地址空间
>>Image vmlinux去除调试信息后的镜像
>>vmlinuz 即zImage
可引导的压缩的内核映像。
大多数包含两部分:压缩的vmlinux和自引导程序。
vmlinuz通过自引导程序初始化系统,并且解压启动vmlinux。
vmlinuz采用gzip压缩格式,包含gzip解压缩函数。
>>uImage uboot格式的内核镜像,zImage前增加64字节
>>System.map 一个特定内核的内核符号表,包含内核全局变量和函数的地址信息。
$nm vmlinux >System.map
可提供给klogd/loof/ps等使用。
/proc/ksyms使用
CONFIG_ALLSYMS => 内核映像将包含符号表。
三. 内核补丁
上一个版本的linux内核源码,通过打补丁可以得到下一个版本。
linux-2.6.14 –> linux-2.6.15 =>patch-2.6.14.15
打补丁
bzcat ../patch-2.6.14.15.bz2 | patch –p1
四. 编译内核模块2.6内核
linux2.6内核的模块采用新的加载器,它使用内核编译机制,生成一个*.ko(内核目标文件,kernel object)模块文件,而不是一个*.o模块目标文件。
内核编译系统首先编译这些模块,然后链接上vermagic.o。这样就在目标模块创建了一个特殊区域,用来记录编译器版本号、内核版本号、是否使用内核抢占等信息。
新的内核编译系统如何来编译并加载一个简单的模块呢?举例说明。
#drivers/char/hello/hello.c void init_module(void) { printk( “Hello module!\n”); } void cleanup_module(void) { printk( “Bye module!\n”); }
相应的makefile文件如下:
KERNEL_SRC = ~/linux-2.6.14 SUBDIR = $(KERNEL_SRC)/drivers/char/hello/ all: modules obj-m := hello_mod.o hello-objs := hello.o EXTRA_FLAGS += -DDEBUG=1 modules: $(MAKE) –C $(KERNEL_SRC) SUBDIR=$(SUBDIR) modules
makefile文件使用内核编译机制来编译模块。
新模块要用新的模块工具加载或卸载。原来2.4内核的工具不能再用来加载或卸载2.6内核模块。
五. X86平台编译安装内核
1. 下载内核源文件。
2. 安装开发包组下载。
根据需要安装开发工具,包括gcc、g++等,centos下可通过如下命令安装:yum groupinstall "development tools"。
3. 更新.config文件。
最好拷贝当前系统的配置文件/boot/config-xxx当作默认配置文件,当然不同版本间配置选项可能不同。
若是标准X86版本可拷贝对应版本的配置文件,理论上X86配置文件应该是通用的(如Ubuntu16.04各版本应该相同,Centos7.5各版本应该相同)。
4. make menuconfig。
根据需要更改配置选项。
5. make
根据需要安装缺少的编译工具。
6. make modules_install
默认安装目录为/lib/modules,完成后增加一个新编译系统版本号目录。
7. make install:安装内核相关文件
自动生成三个文件并修改grub相关配置,相关内容均在目录/boot下。
文件包含:initramfs,vmlinuz,System,且相关的系统文件链接到最新文件。
grub文件配置在:/boot/grub2/grub.cfg,新添加了最新内核的配置menuentry。
8. reboot重启后uname查看内核更新。
参考:
1. http://www.arm.linux.org.uk/docs/kerncomp.php