日期:2014-05-16  浏览次数:21087 次

linux 内核学习资料

????????? 最近在自学 Linux kernel 方面的东西,这两天了粗浅的研究了下 kernel boot 过程,在此记录。这里所指 Linux 引导加载未涉及虚拟化环境,即系统未运行在 hypervisor 之上。

?

????????? Linux 通过执行不同阶段的引导加载程序(boot loader)程序来引导操作系统,在完成内核等引导之后,最终会由调度器接管 CPU,其通过启用中断来周期性的抢占控制权,处理多个用户进程/客户进程(kvm 虚拟化)。Top level 的引导过程如下图。

?

Top level boot loader

?

?

????????? 整个 Linux 系统引导共分 5 步执行操作:

?

  1. BIOS/BootMonitor 引导程序;BIOS 包括 POST 和 Runtime 服务。
  2. 被称为第一阶段的 MBR (Master boot record)引导程序;位于 BIOS 配置的启动磁盘 0 柱面 1 扇区的主引导记录,用于启动第二阶段的 linux boot loader。
  3. 被称为第二阶段的 linux boot loader;主要有 LILO (Linux loader)和 GNU GRUB (Grand unified boot loader)两种 boot loader 程序,现主流为 GRUB。包括了通过 initrd 来创建 RAM 盘,执行 init 脚本,通过 LKM (linux kernel module)加载本地磁盘等驱动程序来挂载磁盘中的 root 文件系统。RAM 盘中是个完整的小型 linux 环境,在没有磁盘的嵌入式环境中,initrd 可以是最终的根文件系统,也可以通过 NFS 来挂载最终的文件系统。
  4. linux kernel (及 initrd 函数)引导;负责加载并解压 zImage/bzImage kernel 及 initrd 映像,并开始执行 kernel 初使化和引导程序/过程。
  5. init 进程。用于启动 linux 配置的各项用户空间服务(demon)进程。

?

????????? 加电后首先被执行的是 BIOS (Base input/output system)程序。 嵌入式环境使用 boot monitor,它负责在一个位于 rom/flash 中预定地址开始执行引导程序,而在 PC 环境中这个启动地址是 0xFFFF0,相对来讲 BIOS 提供了更多的配置功能。它主要由两部分组成:

?

  1. POST (Power On Self Test)程序;其负责接通电源时对硬件检测,包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等。
  2. BIOS Runtime 服务;负责为操作系统提供一些基础服务,主要与IO外设有关。

????????? 当 BIOS POST 执行完后,其将会从内存中清理,而 Runtime 服务会常驻内存,为操作系统提供一些底层的支持。最后 BIOS 将控制权交给称为第一阶段引导程序的 MBR (Master boot record)程序。

?

????????? 接下来执行的 MBR 是一个512 byte 固定大小的映像。 包括 446 byte 长的被称为初始程序加裁程序 (Initial program loader, IPL)的可执行代码和 64 byte 分区表(16 byte * 4 个),最后以 0xaa55 特殊字节结束。如下图所示。

?

MBR

?

????????? MBR 引导程序会将扫描分区表,获得唯一活动分区后,将其中的引导程序读入 RAM 并开始执行。

?

????????? MBR 启动的引导程序被称为第二阶段引导程序,它是引导的主体,是引导加载的真正部分。 Linux 中该阶段有两个流行的程序,LILO (较老)和 GRUB。如果安装了 lilo 程序,可以通过 root 用户执行如下命令来通过 lilo 生成默认配置的 MBR ,并写入到启动磁盘 0 柱面 1扇区位置上。

?

Shell代码 复制代码
  1. #?/sbin/lilo?-v?-v??
# /sbin/lilo -v -v

?

????????? 一般需要修改 lilo 的配置文件,使生成的 MBR 有效。位于 /etc/lilo.conf 。lilo 配置示例。

?

Config代码 复制代码
  1. boot=/dev/hda ??
  2. map=/boot/map ??
  3. install=/boot/boot.b ??
  4. prompt ??
  5. timeout=100??
  6. compact ??
  7. default=Linux ??
  8. image=/boot/vmlinuz-2.4.18-14??
  9. ????label=Linux ??
  10. ????root=/dev/hdb3 ??
  11. ????read-only ??
  12. ????password=linux ??
  13. other=/dev/hda ??
  14. ????label=WindowsXP??
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=100
compact
default=Linux
image=/boot/vmlinuz-2.4.18-14
	label=Linux
	root=/