Linux启动内核源代码解析 (linux 启动 内核 源代码)

Linux操作系统在运行时需要启动内核,而启动内核的过程在一些场景下是必不可少的。在这篇文章中,我们将从源代码的角度来了解Linux启动内核的过程。

在Linux启动内核的过程中,其实有两个不同的部分:引导加载程序(bootloader)和内核初始化。在本文中,我们将着重研究引导加载程序(bootloader)。

引导加载程序(bootloader)是一段程序,负责将内核从存储设备(如硬盘)中加载到内存中,并将控制权移交给内核以便开始执行。在Linux系统中广泛使用的引导加载程序是GRUB(GNU GRand Unified Bootloader)。

GRUB启动过程

GRUB启动过程中有两个主要的阶段:步骤一和步骤二。

步骤一

步骤一又称为“阶段1”,主要负责从硬盘上读取阶段二的代码。在这个步骤中,GRUB会执行以下操作:

1. 加载grub.cfg

GRUB的配置文件是grub.cfg,它包含了指示引导加载程序从哪个硬盘分区加载内核的信息。 之一个文件系统在硬盘上的查找可以在任何大小或类型的硬盘中发生,因此GRUB必须先查找grub.cfg。

2. 搜索grub.cfg的信息

一旦找到了grub.cfg,GRUB会搜索里面的信息以找到内核的位置。这是通过读取Linux根文件系统的标识来完成的。这个标识包含在grub.cfg的root行中。

3. 加载文件系统模块

GRUB需要加载文件系统模块以访问硬盘上的文件系统。字母大小写和位数可能会稍有不同,例如ext2.efi、ext4.mod。

4. 加载内核

现在,GRUB已经找到了内核的位置,并加载了文件系统模块,可以开始加载内核了。在这个过程中,GRUB使用multiboot标准中定义的数据结构向内核传递一些重要的信息。例如,GRUB可以将内核放置在内存中的哪个位置,以及内核应该如何访问一个具体的磁盘分区。

步骤二

步骤二又称为“阶段2”,主要负责加载内核以及向内核传递必要的信息,以使其能够正确地启动。在这个步骤中,GRUB会执行以下操作:

1. 加载内核

在之一阶段,GRUB通过multiboot数据结构将内核加载到预定的内存位置。在这一步,GRUB会将它从占用内存中删除。

2. 传递内核命令行和其他参数

GRUB使用multiboot标准来向内核传递一组信息,例如内核命令行参数。这些参数是内核用来初始化和配置系统的命令行参数。

3. 启动内核

GRUB跳转到内核入口点,将控制权移交给内核。

结论

以上就是Linux启动内核的过程及GRUB的启动过程,这些过程是开源Linux操作系统里面至关重要的。显然,这篇文章的范围远不足以涵盖整个Linux启动过程,但是通过阅读GRUB的源代码,我们可以更好地了解引导加载程序的工作方式,从而有助于我们更好地理解Linux操作系统的启动过程。

相关问题拓展阅读:

linux启动时怎么选择新旧内核

1 是手动选择在开机时候按方上下方向键 界面会停留在选择内核的界面

2自动选择 系统默认会选择最新安装的内核.如果要更改谈派斗默认使用的内核则修改配置文件/boot/grub/menu.lst(直接修羡芦改grub.conf同样可行 )下default默认为0是表示之一个菜单选项(开机时的内核含磨选择菜单),改为1就是使用第二个菜单项了。timeout表示菜单等待时间,单位为秒。

已安装内核的新版本(例如,实现 P 支持),那不需要下载任何代码跳过此部分继续下一屏。

您可以在 上找到内核代码。当您进入到那后,您将发现内核的源代码按内核版本(v2.2、v2.3 等),被组织到多个不同的目录中。在每个目录中,您将发现文件被冠以”linux-x.y.z.tar.gz”和”linux-x.y.z.tar.bz2″。这些就是敏枯 Linux 内核的源代码。您也将看到冠以 “patch-x.y.z.gz” 和 “patch-x.y.z.bz2” 的文件。这些是用来更新前面完整的内核源代码的补丁包。如果您希望编译一个新的内核版本,您将需要下载这些”linux”文件其中之一。

内早扰核解包

如果您已从 kernel.org 下载一个新的内核,现在是要将其解包时候了。首先,cd /usr/src。如果这里有一个存在的”linux”目录,将其改名为”linux.old” (“mv linux linux.old”,以 root 权限)。

现在,可以解开新的内核包了。仍然在 /usr/src 目录下,输入 tar xzvf /path/to/my/kernel-x.y.z.tar.gz 或者 cat /path/to/my/kernel-x.y.z.tar.bz2 | bzip2 -d | tar xvf -,根据您下载的源代码是用 gzip 或 bzip2 压缩的。在输入完此命令后,您下载的内核源代码会被释放到一个新的”linux”目录下。注意内核源代码通常将在硬盘上占用超过兆空间!

讨论配置问题

在您编译内核前,您需要配置它,配置是您精确控制在新内核中启用(禁止)哪些内核功能的机会。您也将控制哪些会被编译到内核的二进制映像(在启动时被载入)而哪些被编译到需要时载入的内核模块文件。

老式配置内核的方法是极为痛苦的过程,并涉及到进入 /usr/src/linux 目录并输入 make config 命令。请放弃这种配置内核的方式除非您想在命令行上回答几百个(对!几百个)“yes/no”的问题。

配置的新途径

我们是现代人类,我们不在输入 make config,而是输入 make menuconfig 或者 make xconfig。如果您想要配置您的内核,使用上述选择之一。如果您输入 make menuconfig,您将使用一个漂亮的基于文本的彩色菜单系统来配置内核。如果您输入 make xconfig,您将使用一个更漂亮的基于 X-Window 的 GUI 界面来配置内核的各种选项。这里有一个使用 “make menuconfig” 的屏幕陆拿旦截图:

当使用 “make menuconfig” 时,在左面出现一个 “” 的选项能被编译成为一个模块。当选项被选中,按下空格键来循环选择选项是被选中或未选中, (“”)表示将被编译成内核映像而(“”)表示将被编译成模块。

配置技巧

在这里有极其多的内核选项,而且我们无法在此一一解释所以请利用内核内置的帮助功能。基本上每个选项都至少有一些描述,而且每个通常都有一行”如果您不知道这个选项的含义,输入 Y。(或者 N)”。这些提示在您不知道一个特定选项的含义时能帮助您。要使用帮助,选中您有疑问的选项然后按 “?” 键。

编译和安装内核

make dep; make clean

一旦您的内核配置完毕,就可开始编译它了。在我们能编译它前,我们需要生成依赖(dependency)信息并清除任何老的”编译结果”。这可以通过在 /usr/src/linux 下输入 make dep; make clean 完成。

make bzImage

现在是编译真正的二进制内核映像时候了。输入 make bzImage。过几分钟后,编译会结束而且您在 /usr/src/linux/arch/i386/boot(x86 PC 内核)目录下找到 bzImage 文件。我们将待会告诉您如何安装这个新内核,但是现在我们要看看模块编译了。

编译模块

现在我们有了 bzImage,下面要编译模块了。即使您在配置内核时没有使用任何模块,也不要跳过此步骤在编译完 bzImage 后立刻编译模块是个好习惯。而且,如果您真的没有模块需要编译,这个步骤也非常快就结束了。输入 make modules; make modules_install。这将导致模块被编译而且被安装到 /usr/lib/ 目录下。

祝贺您!您的内核已经被编译完成了,您的内核模块也编译完成并被安装。现在是要重新配置 LILO,这样您能使用新的内核。

启动配置

LILO 入门

现在是最后来重新配置 LILO 的时候了,它将负责载入新的内核。LILO 是更流行的 Linux 引导工具,而且为所有的主流 Linux 发行商所采用。您要作的之一件事是察看您的 /etc/lilo.conf 文件。它将包含一行看似 “image=/vmlinuz” 的语句。该语句告诉 LILO 到何处找到内核。

启动配置, 第二部分

要配置 LILO 来使用新的内核,您有两种选择。之一个是覆盖您现有的内核除非您手头上有一些紧急启动措施如还有此内核的引导盘,这很危险的方法。

更为安全的选择是配置 LILO 是得它能从新的或旧的内核引导。LILO 可配置成从新内核缺省启动,但仍提供一种方法让您遇上问题时能选择旧的内核来启动。这是推荐的作法,也是我们将随后介绍的方法。

启动配置, 第三部分

您的 lilo.conf 文件有可能看起来如下:

boot=/dev/hda

delay=20

vga=normal

root=/dev/hda1

read-only

image=/vmlinuz

label=linux

要在您的 lilo.conf 文件中增添新的项目,参见下列步骤。首先,拷贝 /usr/src/linux/arch/i386/boot/bzImage 到您的根(root)分区上的一个文件,例如 /vmlinuz2。一旦拷贝完毕,复制您 lilo.conf 文件的最后三行并将它们添加到该文件的最后… 我们即将结束整个步骤了…

启动配置, 第四部分

现在,您的 lilo.conf 文件应该看起来如下:

boot=/dev/hda

delay=

vga=normal

root=/dev/hda1

read-only

image=/vmlinuz

label=linux

image=/vmlinuz

label=linux

首先,将之一个 “image=” 行改为 “image=/vmlinuz2″。其次,将第二个 “label=” 行改为 “label=oldlinux”。然后,确定在文件的开始有一行 “delay=20″如果没有,增添一行。如果它已经存在,将数字至少设为 20。

启动配置, 第五部分

您最后的 lilo.conf 文件将看起来如下:

boot=/dev/hda

delay=

vga=normal

root=/dev/hda

read-only

image=/vmlinuz

label=linux

image=/vmlinuz

label=oldlinux

作完这些修改后,您将需要以 root 身份运行 “lilo”。这非常重要!如果您不执行此步,启动的过程无法继续。运行 “lilo” 将给 lilo 一个机会来更新它的启动映射。

启动配置, 详解

现在我们详细地解释一下我们所作的改动。这个 lilo.conf 文件可以用来允许您启动两个不同的内核。它允许您启动您原来的内核,位于 /vmlinuz 目录下。它也允许您启动新的内核,位于 /vmlinuz2 目录下。在缺省情况下,它将尝试启动您的新内核(指向新内核的 image/label 行首先出现在配置文件中)。

如果,出于某种原因,您需要启动旧内核,只需在重新启动计算机时按住 Shift 键。LILO 将会监测到此操作,然后允许您输入要启动的映像标签名。要启动旧内核,您需要输入 “oldlinux”,然后按回车键。要看到有哪些选择,您可按 TAB 键。

1 是手动选择在开机时候按方上下方向键 界面会停留在选择内核的界面谈派斗

2 自动选择 系统默认会选择最新安装的内核.如果要更改默认使用的内核则修改

配置文件

/boot/grub/menu.lst(直接修改grub.conf同样可行 )下default默羡芦认为0是表示之一个菜单选项(开机时的内核选择含磨菜单),改为1就是使用第二个菜单项了。timeout表示菜单等待时间,单位为秒。

开机自检以知渣猛后,会加载grub 这里会有两个内核,如果你保留了原内核的话。只要按一下上下键选择搭桥,然后回车就可以了。。。如果要修改为开机自动以某个内核为默认内核,那么修改一下

/boot/grub/grub.conf就可以了。。。0为之一个内核,1为第二个。上梁激边的是0,下边的是1

首先, 下kernel源码, 编译卖森新内核兄铅, 然后修改/boot/grub/grub.conf, 加一个新item, 最后reboot.

reboot后,参考hack_qyt的意见.

下面是我自己新加羡配好的项( in /boot/grub/grub.conf), 供你参考.

#ID: 12

title=Gentoo Linux 2.6.35.7(my_kernel working,T410i,ntfs R, RF FS updated,FUSE knl supp, wifi, u2serial,nfs,acpi_lighting_adj)

root (hd0,4)

kernel /boot/kernel-2.6.0058 root=/dev/sda5 ramdisk=8192 hdc=ide-scsi

关于linux 启动 内核 源代码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Linux启动内核源代码解析 (linux 启动 内核 源代码)