学习啦>学习电脑>操作系统>Linux教程>

如何将init程序打包进内核

时间: 若木635 分享

  将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就自动连接到编译好的内核映像文件中了。

75406