读书频道 > 系统 > linux > 深度探索Linux操作系统系统构建和原理解析
3.3.7 配置内核支持ELF文件格式
2013-09-29 08:37:32     我来说两句 
收藏    我要投稿   
全书一共8章:第1章介绍了如何准备工作环境。在第2章中构建了编译工具链,这是后面构建操作系统各个组件的基础。在这一章中,不仅详细讲解了工具链的构建过程,而且还通过对编译链接过程的探讨,深入讨论了工具链  立即去当当网订购

在上一节,我们配置了内核支持Ext4文件系统。但是内核从文件系统加载文件,仅支持文件系统还是不够的,内核还要支持具体的文件格式,当前Linux系统使用的标准二进制格式是ELF,因此需要配置Linux支持ELF文件格式。以下是配置内核支持ELF文件格式的步骤。

1)执行make menuconfig,出现如图3-25所示的界面。


 

3)在图3-26中,选中配置项“Kernel support for ELF binaries”。ELF格式支持配置完毕。

 

在配置内核支持ELF文件格式后,我们重新编译内核并使用新编译的内核引导vita系统后,系统的输出如图3-27所示。

根据内核输出的信息可见,内核已经识别出硬盘的分区,也识别出了sda2分区使用的文件系统,并使用Ext4文件系统驱动成功挂载了该分区。但是内核在“报怨”“No init found …”后,依然出现了“panic”。那么,这里的“init”指的是什么呢?我们看一下内核进入用户空间的过程:
linux-3.7.4/init/main.c:

static noinline void __init_refok rest_init(void)
{
    ...
    kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
    ...
}

static int __ref kernel_init(void *unused)
{
    ...
    if (ramdisk_execute_command) {
        if (!run_init_process(ramdisk_execute_command))
            return 0;
        printk(KERN_WARNING "Failed to execute %s\n",
                ramdisk_execute_command);
    }
    ...
    if (execute_command) {
        if (!run_init_process(execute_command))
            return 0;
        printk(KERN_WARNING "Failed to execute %s.  Attempting "
                    "defaults...\n", execute_command);
    }
    if (!run_init_process("/sbin/init") ||
        !run_init_process("/etc/init") ||
        !run_init_process("/bin/init") ||
        !run_init_process("/bin/sh"))
        return 0;

    panic("No init found.  Try passing init= option to kernel. "
          "See Linux Documentation/init.txt for guidance.");
}

函数kernel_init首先尝试执行initramfs中的字符串ramdisk_execute_command代表的命令。目前没有使用initramfs,所以这个字符串为空,于是其继续尝试到根文件系统中寻找程序,首先其将尝试寻找字符串execute_command代表的命令。

根据下面代码:
linux-3.7.4/init/main.c:

static char *execute_command;

static int __init init_setup(char *str)
{
    unsigned int i;

    execute_command = str;
    ...
}
__setup("init=", init_setup);

字符串execute_command代表用户通过内核命令行参数“init”明确指定的程序,形如:
/boot/grub/grub.cfg

menuentry 'vita' {
    set root='(hd0,2)'
    linux   /boot/bzImage root=/dev/sda2 ro init=/bin/bash
}

在上面grub的配置文件中,使用黑体标识的部分就是明确告诉内核,第一个进程直接运行根文件系统中目录/bin下的bash。如果用户没有通过命令行参数“init”指定第一个进程执行的程序,这个进程将依次尝试执行/sbin、/etc、/bin下的init,最后尝试执行/bin/sh。

由于目前根文件系统中除了内核的映像外没有任何文件,因此,内核找不到任何程序,所以在报告“No init found …”后出现“panic”了。为了辅助验证内核的构建,在下一节我们将构建一个基本的根文件系统。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.3.6 配置文件系统
下一篇:3.4.1 根文件系统的基本目录结构
相关文章
图文推荐
3.3.6 GNOME的软件管
3.3.5 GNOME的文件管
3.3.4 GNOME的窗口管
3.3.3 收藏夹和快捷
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站