设备树支持下的Linux内核启动过程简介 (基于设备树的内核linux 启动)

随着Linux在嵌入式领域的广泛应用,设备树(Device Tree)开始成为内核启动时的重要组成部分。设备树的出现,使得Linux内核能够更好地适应不同的硬件平台,更加灵活地处理硬件资源。本文将介绍设备树支持下的Linux内核启动过程。

一、原理

内核启动时,需要对硬件进行设备树的枚举与识别。设备树是一个跨平台的数据结构,其中描述了硬件设备的类型、地址、中断等信息。内核通过读取设备树,将硬件资源识别出来,并进行初始化。

设备树通常由.dt或.dtb文件组成,在内核编译时可以选择将设备树编译成二进制格式.dtb,这样可以减小设备树的大小,提高内核启动的效率。

二、内核启动流程

1.引导加载器(Bootloader)执行阶段

内核由引导加载器加载,并且命令行参数会传递给内核启动。对于设备树支持的内核,引导加载器需要传递设备树文件的地址以及大小给内核。

2.内核初始化阶段

内核启动后,首先进行的是内核初始化。此时,内核需要读取设备树来识别硬件资源,并初始化硬件设备驱动。在此过程中,内核会使用到设备树中描述的硬件节点信息。

3.设备树的解析与加载阶段

内核启动完成后,设备树文件被读取到内存中,并进行解析和加载。在解析过程中,内核会以设备树中的根节点为起点,从顶向下逐层解析和加载子节点的信息。通常设备树文件加载到系统内存中的某个指定位置,并在内核启动过程中使用该位置来访问设备树。

4.设备树的匹配阶段

设备树解析和加载完成后,内核对硬件资源进行匹配。此时,内核遍历整个设备树,对每个树节点进行匹配。匹配规则通常是从设备树根节点开始,在设备树中寻找与硬件匹配的节点,并读取其信息,完成硬件初始化。

5.启动内核阶段

设备树匹配完成后,内核会进入启动阶段。此时,硬件设备已经初始化完成,内核可以正常运行,并加载用户空间进行后续操作。

三、适用情况

设备树的存在和广泛使用,主要是为了适应不同的硬件平台和体系结构,因此对于某些嵌入式应用来说,不需要使用设备树也可以完成内核启动。其适用通过各种引导程序提供的信息来识别硬件设备。

不过,对于需要支持多种设备的规模更大的嵌入式系统,使用设备树将更加方便。通过设备树,内核可以将硬件设备的信息标准化,并具有更好的兼容性。

设备树是一种优秀的设计,为内核启动提供了更好的硬件资源管理机制。通过设备树在不同平台上更加灵活,可以更好地支持各种硬件设备,从而提高了嵌入式开发工作的效率。

相关问题拓展阅读:

linux下的五大启动管理程序

分别是

1. System V:System V是一种UNIX操作系统的启动和关机脚本。

2. Upstart:Upstart是Ubuntu Linux发行版中使用的开机启动管理器。

3. systemd:systemd是Linux内核下常用的开机启动管理工具。

4. SysVinit:SysVinit是一个Unix-like操作系统上常用的进程初始化守护进程集成工唯樱具。

5. runit:runit 是指陵丛一个小而快速的 Unix init 系统, 可汪衫以在多重平台上运行, 例如 Linux、Solaris、Mac OS X 等

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内核启动过程简介,linux下的五大启动管理程序,linux启动时怎么选择新旧内核的信息别忘了在本站进行查找喔。


数据运维技术 » 设备树支持下的Linux内核启动过程简介 (基于设备树的内核linux 启动)