前言

对于 GRUB 的加载流程,网上绝大部分都是写对 menu.lst, grub.cfg 这些 GRUB 配置文件的编写流程,就像是写脚本语言一样,用些关键字就能让 PC机能正确启动桌面 Linux 了。但这只是 GRUB 的使用,而不是GRUB的分析。

本来是没有想要探究 GRUB 的想法,直到我在自制toy kernel 的学习中进入了 “虚拟内存管理”这一章节。很多介绍虚拟内存管理的时候都会说到 Linux 的内存管理,Linux 内核会加载到系统 3G~4G 的虚拟内存中, 但 GRUB 是没有开启虚拟内存的,Linux 内核的加载是被谁,又是如何加载相应段到 3G~4G 区的呢。

分析 kernel

vmLinux

我们看下内核源码编译后的最原始文件 vmLinux。该文件是 ELF 文件,使用 readelf 读下该文件的 Section header.

这里只截了几个段显示,后面的段都类似. 可以看到这些需要加载的段的地址的确是在 0xC0000000 之后。但 vmLinux 并不是可引导的Linux 内核文件。

Linux启动的相关信息一般都在 `/boot` 下,我们看下里面的内容.

可以看到 grub 文件夹,grub 就是引导 Linux 进行启动的 bootloader,我们看下 `/boot/grub/grub.cfg` 文件的内容。

menuentry 'Linux Mint 17 {

recordfail

gfxmode $linux_gfx_mode

insmod gzio

insmod part_msdos

insmod ext2

set root='hd0,msdos1'

linux /boot/vmlinuz-3.13.0-24-generic

initrd /boot/initrd.img-3.13.0-24-generic

}

带有 linux 的一行就指定了启动的内核,可以看到不是 vmlinux 文件,而是 vmlinuz 文件。

vmlinuz

搜索后可以看到 vmlinuz 是**可引导的,压缩**的内核。 initrd 是"initial ramdisk" 的简写,是临时的虚拟磁盘,暂时不讨论。 因为我电脑上 vmlinuz 是64 bit的,对 64bit不太了解,所以找了个 32bit 的vmlinuz 文件来作解析。先试试`readelf`命令。

# readelf -S vmlinuz

readelf:错误: Unable to read in 0x7269 bytes of 节头

readelf:错误: 不是 ELF 文件 - 它开头的 magic 字节错误

不是 ELF 文件, 那试试 `objdump` 吧。

# objdump -afh vmlinuz

objdump: vmlinuz: 不可识别的文件格式

还是不行。

这个时候之所以会相当用这些命令看 vmlinuz 文件的段信息,因为在我的 toy kernel 中使用的是 ELF 文件,而且是使用 grub 加载的,对于 ELF 文件来说内部保护若干 section, 执行时这些 section 必须要在特地的内存地址上. 使用 `readelf` 查看toy kernel 的 section header 信息如下.

可以看到 Addr 段就是内核运行时这些段在内存中的地址。而加载我的内核的 grub 的配置如下

title toy kernel

root (fd0)

kernel /zkernel

module /initrd

vmlinuz 之所以叫做压缩的内核,是因为它是使用 gzip 压缩后得来,而且不单单是个纯数据包,在文件开头部分内嵌有 gzip 解压缩代码,相当于"自解压"。我的内核需要由grub加载好相应的 section, 但 vmlinuz 都读不出来段如何让 grub 加载?

其实答案就在上面的 grub 配置文件里,在 linux 中声明内核使用的是 *linux* 关键字,在我的配置中声明内核使用的却是 *kernel*. 可以明确看出,grub对 linux 的加载是特殊对待的, 但具体怎么特使对待,只能从源代码里看了。

linux 卡在grub_浅析 GRUB 如何加载 Linux kernel相关推荐

  1. linux内核加载卡主,请教mx6,linux3.0.35,tf卡能启动uboot但是无法加载内核问题

    请教mx6,linux3.0.35,tf卡能启动uboot但是无法加载内核问题 cpu:mcimx6u5dvm10AB 硬件上,我把wp和cd都直接接地了,这次新加工的核心板,以及重新设计一个新项目的 ...

  2. ubuntu GRUB 引导加载 Beini(WiFi破解神器) Tiny Core Linux

    身处热点环境,手上又有本本,但是不知道wifi热点密码...怎么破??? 那些wifi万能钥匙什么的等类似安卓软件都是扯淡的,对于技术宅类型的大家应该是不屑一顾.那么有什么好的工具呢??? 个人推荐& ...

  3. 在Ubuntu下使用QEMU搭建arm开发环境(三)使用u-boot加载Linux内核

    嵌入式启动概述 嵌入式boot loader 功能类似于PC的BIOS.硬件检测是否正常 加载操作系统镜像到RAM 设置不同的启动方式 常见的启动方式 NOR/NAND flash启动 从SD卡启动 ...

  4. Linux下C/C++程序编译链接加载过程中的常见问题及解决方法

    Linux下C/C++程序编译链接加载过程中的常见问题及解决方法 1 头文件包含的问题 报错信息 该错误通常发生在编译时,常见报错信息如下: run.cpp:2:10: fatal error: dl ...

  5. 浅析Android字体加载原理

    浅析Android字体加载原理 前言 之前在处理系统字体问题的时候,可借鉴的资料很少,遇到了很多坑,不得不了解Android字体加载原理,现抽空写一篇总结,来加深自己对这块的理解. 内容 概述 And ...

  6. Linux系统安装驱动过程中ko文件加载错误(Required key not available)的解决办法

    Linux系统安装驱动过程中ko文件加载错误(Required key not available)的解决办法 问题描述 在Ubuntu上使用CP210x USB转UART设备时需要安装驱动程序(CP ...

  7. Linux arm 内核选项和busybox选项 加载tun模块 -- 创建/dev/tun 字符设备

    Linux arm 内核选项和busybox选项 加载tun/tap模块 – 创建/dev/tun 字符设备 可以参考博客1: linux下TUN/TAP虚拟网卡的使用 可以参考博客2:ubuntu下 ...

  8. linux直接运行程序加载动态库失败,扣丁学堂Linux培训详解程序运行时加载动态库失败解决方法...

    今天扣丁学堂Linux培训老师给大家介绍一下关于Linux程序运行时加载动态库失败的解决方法,希望对同学们学习有所帮助,下面我们一起来看一下吧. Linux下不能加载动态库问题 当出现下边异常情况 . ...

  9. linux优化网页加载过程,【zz】Linux起步过程中硬件模块的加载

    [zz]Linux起步过程中硬件模块的加载 [zz]Linux起步过程中硬件模块的加载 日期:2014-05-16 浏览次数:20354 次 [zz]Linux启动过程中硬件模块的加载 文章来源不详. ...

最新文章

  1. SpringBoot报错:Could not autowire. No beans of ‘DiscussantMapper‘ type found
  2. abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...
  3. 富士通打印机调整位置_打印机为什么卡纸 打印机四种卡纸原因及解决办法【介绍】...
  4. python3打开文件的代码_Python3 对文件操作
  5. shellcode学习总结
  6. 面试官:为什么HTTPS是安全的
  7. springboot超详细教程_CG原画插画教程:超详细线稿教程
  8. python执行gradle脚本
  9. Adobe CTO:Android将超预期获50%份额
  10. c语言编程题2^0+2^1+……+2e63,牛客网刷题33(2道题)
  11. java 课后习题 随机数统计
  12. 一个小时快速搭建微信小程序教程
  13. 排序小记【1】基本排序算法
  14. 顺丰快递如何凭收件人电话和单号批量查询物流信息
  15. 如何提取动图中的某一帧?教你一招在线分解gif
  16. 10张图带你彻底搞懂限流、熔断、服务降级
  17. Swift语言难度大吗?适不适合零基础学习?
  18. 特斯拉进化论:舍命狂奔背后的生存哲学
  19. 微信中html5获取手机号,微信小程序用户授权获取手机号(getPhoneNumber)
  20. 【云栖大会】探索企业互联网转型之路

热门文章

  1. Linux查找树莓派ip地址,让树莓派“说”出自己的IP地址
  2. markdown统一设置图片格式_Markdown教程
  3. kotlin t class.java_尝试Java,从入门到Kotlin(下)
  4. php 添加cdata,PHP cdata 处理 PHP cdata 处理(仔细讲解)
  5. MaxCompute 图计算用户手册(下)
  6. 【leetcode】332. Reconstruct Itinerary
  7. centos 7 网络DNS设置的相关配置文件配置
  8. Qt3D学习之键盘交互
  9. 网络适配器输入的IP地址 已经分配给另一个适配器
  10. python中文decode和encode转码