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!
”);
}

void cleanup_module(void)
{
printk( “Bye module!
”);
}

相应的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

2. centos7编译安装内核最新版

3. CentOS 6/7 上编译安装Linux内核

4. https://wiki.centos.org/Sources

5. http://vault.centos.org/centos/7/os/Source/SPackages/

原文地址:https://www.cnblogs.com/embedded-linux/p/6012595.html