ITEEDU

Linux系统学习基础

第一章 开发工具学习

第二章 Linux内核制作

第三章 initramfs制作

第四章 Linux系统制作原理

第五章 文件系统启动方式配制

将init程序打包进内核

我们先写一个简单的C语言init程序,它会在内核的console中打印出经典的hello world信息。

hello.c: 
#include  
#include  
int main(int argc,char argv[]) 
{ 
printf("hello world, from initramfs.\n"); 
sleep(9999999); 
return 0; 
} 

其中的sleep()函数语句是为了避免执行时内核很快打出panic的信息,并非功能上的需要。

接着把hello.c编译成静态连接程序:

 gcc  -o hello_static -static -s hello.c 

命令行中的-s参数表示编译后的程序不包含调试定位信息,目的是减少编译出来的程序文件的大小。

再创建一个initramfs的构建源文件目录image,把hello_static程序拷入这个目录,并改名为init。

在image目录下,创建一个dev/console的设备文件,否init程序无法在内核console中输出信息:

 mknod  -m 600 dev/console c 5 1 

注意,执行这个命令需要有root权限。

好了,现在可以设置内核配置参数,进行initramfs的构建了:

在general setup配置目录下的initramfs sources配置项下输入image的路径名,比如我的路径就是/home/wyk/initramfs-test/image。

因为我们的init程 序是ELF格式的,所以内核需要支持ELF的可执行文件,否则启动这个init程序会失败。

在内核的 Executable file formats配置目录下,选择 kernel support for ELF binaries,则可使内核支持ELF格式的可执行文件。其

他内核配置参数根据实际需要设置即可。

内核配置参数设置完成后,按常规的内核编译方法进行编译,initramfs就自动连接到编译好的内核映像文件中了。