grub加载linux内核,浅析 GRUB 如何加载 Linux kernel

分析 GRUB 源码

从[GRUB 官网](http://www.gnu.org/software/grub/)上下载的是 GRUB2 的代码,结构更清晰。因为有关键字 "linux", 我们就用 "linux" 来搜索,可以搜到如下代码.

grub-core/loader/i386/pc/linux.c

cmd_linux = grub_register_command("linux", grub_cmd_linux, 0, N_("Load Linux."));

从名称应该能看出就是这个, 注册了一个命令,关键字是 “linux”。进入 *grub_cmd_linux* 函数进行分析。

struct linux_kernel_header lh;

file = grub_file_open (argv[0]);//打开 vmlinuz

//从 vmlinuz 开头处读取 linux header 结构

grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh);

//校验合法性

if(lh.boot_flag != grub_cpu_to_le16 (0xaa55));

goto fail;

//拷贝 linux header 结构体到特地地址

grub_memmove (grub_linux_real_chunk, &lh, sizeof (lh));

//拷贝 vmlinux 的数据到特地地址

grub_file_read (file, grub_linux_prot_chunk, grub_linux16_prot_size)

大部分和讨论无关的代码都被省略了,只保护加载相关代码。可以看到 vmlinuz 在文件头部提供了一个结构体给 bootloader使用来判断相关信息,使用 hexedit 打开vmlinuz 也确实可以看到这些数据,而且该结构体是双向的,即在vmlinuz 中提供给 bootloader 相关信息, bootloader 也会将内核需要的信息填到其中。可以在 THE LINUX/x86 BOOT PROTOCOL https://www.kernel.org/doc/Documentation/x86/boot.txt  中看到该结构体更多信息。

grub 并没有更详细的分析 vmlinuz 相关信息,加载后就会跳到内核部分进行下一步动作。

再回头看下 grub-core/loader/multiboot_elfxx.c ,这个应该就是加载 ELF 内核时执行的动作了。

static grub_err_t CONCAT(grub_multiboot_load_elf, XX) (grub_file_t fileconst char *filename, void *buffer)

{

Elf_Ehdr *ehdr = (Elf_Ehdr *) buffer;

char *phdr_base;

int i;

if (ehdr->e_ident[EI_MAG0] != ELFMAG0

|| ehdr->e_ident[EI_MAG1] != ELFMAG1

|| ehdr->e_ident[EI_MAG2] != ELFMAG2

|| ehdr->e_ident[EI_MAG3] != ELFMAG3

|| ehdr->e_ident[EI_DATA] != ELFDATA2LSB)

return grub_error(GRUB_ERR_UNKNOWN_OS, N_("invalid arch-independent ELF magic"));

/* Load every loadable segment in memory. */

for (i = 0; i < ehdr->e_phnum; i++)

{

}

可以看到 grub 对 ELF 内核的加载的确是分析了 ELF 段构成并按照 ELF 文件内的参数加载了。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值