如何启动Kernel
如何启动Kernel
3. 如何启动Kernel
启动 Linux 内核通常是由引导加载程序(Boot Loader)来完成的。引导加载程序负责加载内核镜像并将控制权转交给内核,从而启动操作系统。以下是一般情况下 Linux 内核启动的主要步骤:
- 引导加载程序的配置:
- 首先,你需要选择和配置引导加载程序。一些常见的引导加载程序包括 GRUB、LILO、Syslinux uboot 等。这些引导加载程序有不同的配置文件,用于指定内核的位置和启动参数。
- 内核镜像的位置:
- 内核镜像通常位于系统的引导分区中,例如
/boot
目录。引导加载程序需要知道内核的位置以及如何加载它。
- 内核镜像通常位于系统的引导分区中,例如
- 引导加载程序加载内核:
- 引导加载程序通过读取配置文件,找到内核镜像的位置,然后将内核加载到系统内存中。这通常涉及到加载
vmlinuz
或bzImage
文件。
- 引导加载程序通过读取配置文件,找到内核镜像的位置,然后将内核加载到系统内存中。这通常涉及到加载
- 内核初始化:
- 一旦内核加载到内存,控制权就会转交给内核。内核开始执行初始化过程,设置硬件、初始化内存管理、加载必要的驱动程序等。
- 用户空间初始化:
- 内核完成初始化后,启动用户空间。通常,第一个用户空间程序是
/sbin/init
或/usr/lib/systemd/systemd
,它是用户空间的第一个进程。
- 内核完成初始化后,启动用户空间。通常,第一个用户空间程序是
- 用户空间初始化完成:
- 一旦用户空间初始化完成,系统就会进入可操作状态,用户可以登录并开始使用操作系统。
1. 使用uboot引导嵌入式设备
嵌入式设备启动 Linux 内核的过程与常规计算机有些许不同,通常涉及到特定的引导加载程序和启动方式。以下是一个简化的嵌入式 Linux 内核启动过程的步骤:
- 引导加载程序:
- 嵌入式系统通常使用特定的引导加载程序,例如 U-Boot(Universal Boot Loader)或 Barebox。这些引导加载程序能够加载内核映像并配置启动参数。
- 配置引导加载程序(ENV):
- 在引导加载程序中,需要配置引导命令,指定内核映像的位置 、启动参数以及设备树(Device Tree)等信息。这通常在引导加载程序的环境变量中进行配置。
- 加载设备树(Device Tree):
- 对于许多嵌入式系统,设备树是一个重要的概念。设备树描述了硬件的结构和配置信息,使得相同的内核映像可以在不同的硬件平台上运行。引导加载程序可能会加载设备树文件并传递给内核。
- 加载内核映像:
- 引导加载程序通过网络、存储设备或其他途径加载 Linux 内核映像到内存中。这通常是 zImage 或 Image 文件。
- 设置启动参数(bootargs):
- 引导加载程序设置启动参数,例如 root 文件系统的位置、内核命令行参数等。这些参数可能包括根文件系统的位置、内核的命令行参数等 。
- 转交控制权给内核:
- 引导加载程序将控制权转交给内核,使得内核可以开始执行。内核初始化过程中会进行硬件初始化、加载驱动程序等操作。
- 用户空间初始化:
- 内核初始化完成后,启动用户空间进程。这可能涉及到使用 init 程序或其他初始化系统(busybox)。
- 用户空间操作系统启动:
- 一旦用户空间初始化完成,操作系统开始运行,用户可以开始使用嵌入式系统(APP)。
因此,典型的启动过程是:
-
在内存中的地址 X 加载 zImage
-
在内存中的地址 Y 加载
<board>.dtb
-
用bootz X – Y 启动内核(中间的 - 表示没有 initramfs)
2. kernel启动命令行参数
Kernel command line是一行字符串,是由内核传递给内核用来启动,通常情况下可以通过设置u-boot内bootargs变量来传递kernel 命令行,它也可以在设备树中定义或者在内核配置 CONFIG_CMDLINE 中进行设置。除了编译时配置外,无需重新编译内核也可以使用命令来设置 kernel command line
内核命令行是一个字符串,它定义了内核的各种参数:
参数 | 参数含义 |
---|---|
init= | 从挂载的根文件系统运行的 init 程序,默认为 /sbin/init。 |
loglevel= | 将控制台日志级别设置为最高级别 8,以确保您会在控制台上看到所有内核消息。 |
panic= | 内核恐慌时的如果大于零,则给出重新启动前的秒数; 如果为零,则永远等待(这是默认值); 或者如果它小于零,它会立即重新启动。 |
root= | 挂载根文件系统的设备 |
console= | 用于内核消息输出的目的地。 |
quiet= | 将控制台日志级别设置为静默,抑制除紧急消息。由于大多数设备都有串行控制台,因此需要是时候输出所有这些字符串了。减少了使用此选项的消息可减少启动时间。 |
rdinit= | 从 ramdisk 运行的 init 程序。它默认为 /init |
ro | 以只读方式安装根设备。对虚拟磁盘没有影响,这始终是读/写。 |
rootdelay= | 尝试挂载根设备前等待的秒数;默认为零。 |
rootfstype= | 根设备的文件系统类型。在许多情况下,挂载时会自动检测,但 jffs2 需要文件系统。 |
rootwait | 无限期等待检测到root设备。通常需要 MMC 设备。 |
rw |