我正在寻找一种学习和理解这项技术的方法。这就是我要说的:
- Slax 启动,{做一些事情,比如将自身复制到 RAM},然后
transitions control to the kernel/file system it just made
- SYSLINUX 从 FAT32/NTFS 系统启动,{does stuff},然后
boots into a kernel
- ISOLINUX 从 CD/DVD 启动,然后{does stuff}
boots into a kernel
这个有名字吗?在 GRUB 中使用链式加载时是否类似?
- GRUB 启动,加载选择菜单,进行选择。如果是链式加载选择,则
passes control to something else
.
我正在寻找如何使用一个内核将 .iso(从 FAT32/NTFS 分区)提取到 RAM 中,然后从 RAM 驱动器启动,就像它在启动时就存在一样。有关我为什么要这样做的更多详细信息,请参阅这个问题。
然而,在这里,我只是询问有关内核如何“转换”到另一个内核的详细信息。这个有名字吗?我听说过,INT13h
我相信它在 GRUB/chainloading 中使用。这是一种“重新启动到不同内核”的技术吗?如果没有,这是如何完成的?
答案1
我猜是这样的:http://linux.die.net/man/8/kexec
kexec(8) - Linux 手册页
姓名
kexec - 直接启动到新内核
概要
/sbin/kexec [-v (--version)] [-f (--force)] [-x (--no-ifdown)] [-l (--load)] [-p (--load-)恐慌)] [-u(--unload)] [-e(--exec)] [-t(--type)] [--mem-min=addr] [--mem-max=addr]
描述
kexec 是一个系统调用,使您能够从当前运行的内核加载并引导到另一个内核。 kexec 从内核内部执行引导加载程序的功能。标准系统引导和 kexec 引导之间的主要区别在于,通常由 BIOS 或固件(取决于体系结构)执行的硬件初始化在 kexec 引导期间不执行。这具有减少重新启动所需时间的效果。确保在配置内核时选择了 CONFIG_KEXEC=y。 CONFIG_KEXEC 选项启用 kexec 系统调用。
答案2
Int 13 是一个中断 - 特别是“13”是 BIOS/固件磁盘服务/API 的入口点 - 因此您可以使用此特定中断进行磁盘 IO(输入/输出)。还有其他中断以及 Int 9 等。中断是一种将执行上下文从程序切换到固件/BIOS、操作系统驱动程序/操作系统等以从固件获取帮助的方法。当操作系统内核不在内存中并且需要加载自身(stage1、stage 1.5、模块等)时,GRUB 在从硬盘加载引导加载程序的初始阶段使用 INT 13,因此 Grub 基本上依赖 BIOS/固件来完成加载 GRUB 部分的工作。
从文件系统加载 ISO 的最简单方法是使用 GRUB 环回/循环模块引导 ISO。 GRUB 最好安装在硬盘的 MBR 上,当您启动计算机时,在 GRUB 启动菜单中,您开始键入 GRUB 命令以从 ISO 所在的任何文件系统加载 ISO。您不需要内核将 ISO 提取到 ramdisk - GRUB 可以直接完成所有这些操作,而无需依赖另一个内核。
例如,对于 Debian 可能如下所示: insmod Loopback linux (hd0,1)/deb.iso/install.amd/vmlinuz initrd (hd0,1)/deb.iso/install.amd/initrd.gz boot
(您需要检查 GRUB 可以使用哪些模块以及这是否是 EFI|BIOS 引导)
链式加载是使用 GRUB/Bootloader 来加载另一个操作系统,通过引导另一个 GRUB/Syslinux/Bootloader。通常你会做: GRUB-MBR--->vmlinuz 加载你会做: GRUB-MBR--->CDROM-GRUB-MBR--->vmlinuz