lilognu.docx
- 文档编号:27959095
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:30
- 大小:75.57KB
lilognu.docx
《lilognu.docx》由会员分享,可在线阅读,更多相关《lilognu.docx(30页珍藏版)》请在冰豆网上搜索。
lilognu
本文以是我的学习记录,其中一些文字和图片来自参考资料所列文档,感谢作者对其知识和分享!
最近在自学Linuxkernel方面的东西,这两天了粗浅的研究了下kernelboot过程,在此记录。
这里所指Linux引导加载未涉及虚拟化环境,即系统未运行在hypervisor之上。
Linux通过执行不同阶段的引导加载程序(bootloader)程序来引导操作系统,在完成内核等引导之后,最终会由调度器接管CPU,其通过启用中断来周期性的抢占控制权,处理多个用户进程/客户进程(kvm虚拟化)。
Toplevel的引导过程如下图。
整个Linux系统引导共分5步执行操作:
1.BIOS/BootMonitor引导程序;BIOS包括POST和Runtime服务。
2.被称为第一阶段的MBR(Masterbootrecord)引导程序;位于BIOS配置的启动磁盘0柱面1扇区的主引导记录,用于启动第二阶段的linuxbootloader。
3.被称为第二阶段的linuxbootloader;主要有LILO(Linuxloader)和GNUGRUB(Grandunifiedbootloader)两种bootloader程序,现主流为GRUB。
包括了通过initrd来创建RAM盘,执行init脚本,通过LKM(linuxkernelmodule)加载本地磁盘等驱动程序来挂载磁盘中的root文件系统。
RAM盘中是个完整的小型linux环境,在没有磁盘的嵌入式环境中,initrd可以是最终的根文件系统,也可以通过NFS来挂载最终的文件系统。
4.linuxkernel(及initrd函数)引导;负责加载并解压zImage/bzImagekernel及initrd映像,并开始执行kernel初使化和引导程序/过程。
5.init进程。
用于启动linux配置的各项用户空间服务(demon)进程。
加电后首先被执行的是BIOS(Baseinput/outputsystem)程序。
嵌入式环境使用bootmonitor,它负责在一个位于rom/flash中预定地址开始执行引导程序,而在PC环境中这个启动地址是0xFFFF0,相对来讲BIOS提供了更多的配置功能。
它主要由两部分组成:
1.POST(PowerOnSelfTest)程序;其负责接通电源时对硬件检测,包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等。
2.BIOSRuntime服务;负责为操作系统提供一些基础服务,主要与IO外设有关。
当BIOSPOST执行完后,其将会从内存中清理,而Runtime服务会常驻内存,为操作系统提供一些底层的支持。
最后BIOS将控制权交给称为第一阶段引导程序的MBR(Masterbootrecord)程序。
接下来执行的MBR是一个512byte固定大小的映像。
包括446byte长的被称为初始程序加裁程序(Initialprogramloader,IPL)的可执行代码和64byte分区表(16byte*4个),最后以0xaa55特殊字节结束。
如下图所示。
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=/dev/hdb3
read-only
password=linux
other=/dev/hda
label=WindowsXP
boot键指定了lilo在哪里安装MBR。
可以通过替换boot=/dev/fd0配置来指定lilo创建有引导记录的软盘。
LILO天生存在一些缺点和不足,因此linux在新版本中引入了GRUB程序。
它为了从磁盘来加裁配置和kernel映像,不像LILO只能从裸扇区中执行引导程序,而具有了访问磁盘文件系统(ext2/3、reiserfs、jfs、fat等)的能力。
GRUB是通过引入所谓1.5阶段的引导加载程序来实现这项功能的,在该阶段中,GRUB主要来加载特殊的文件系统驱动。
此后,阶段2的引导加载程序就可以进行加载了。
一般GRUB有一个不错的GUI界面,其中通过分析配置文件来显示了一此引导选项。
在我的ubuntu8.10系统中,该配置文件位于/boot/grub/menu.lst。
我们可以选择内核甚至修改附加内核参数,甚至可以使用GRUBshell对引导过程进行高级手工控制。
我的menu.lst文件内容如下。
Config代码
1.default 0
2.timeout 3
3.hiddenmenu
4.
5.title Ubuntu 8.10, kernel 2.6.27-11-generic
6.uuid e2cf53c5-11de-4d57-a532-878901afd9b4
7.kernel /boot/vmlinuz-2.6.27-11-generic root=UUID=e2cf53c5-11de-4d57-a532-878901afd9b4 ro locale=zh_CN quiet splash
8.initrd /boot/initrd.img-2.6.27-11-generic
9.quiet
10.
11.title Ubuntu 8.10, kernel 2.6.27-11-generic (recovery mode)
12.uuid e2cf53c5-11de-4d57-a532-878901afd9b4
13.kernel /boot/vmlinuz-2.6.27-11-generic root=UUID=e2cf53c5-11de-4d57-a532-878901afd9b4 ro locale=zh_CN single
14.initrd /boot/initrd.img-2.6.27-11-generic
15.
16.title Ubuntu 8.10, kernel 2.6.27-7-generic
17.uuid e2cf53c5-11de-4d57-a532-878901afd9b4
18.kernel /boot/vmlinuz-2.6.27-7-generic root=UUID=e2cf53c5-11de-4d57-a532-878901afd9b4 ro locale=zh_CN quiet splash
19.initrd /boot/initrd.img-2.6.27-7-generic
20.quiet
21.
22.title Ubuntu 8.10, kernel 2.6.27-7-generic (recovery mode)
23.uuid e2cf53c5-11de-4d57-a532-878901afd9b4
24.kernel /boot/vmlinuz-2.6.27-7-generic root=UUID=e2cf53c5-11de-4d57-a532-878901afd9b4 ro locale=zh_CN single
25.initrd /boot/initrd.img-2.6.27-7-generic
26.
27.title Ubuntu 8.10, memtest86+
28.uuid e2cf53c5-11de-4d57-a532-878901afd9b4
29.kernel /boot/memtest86+.bin
30.quiet
default0
timeout3
hiddenmenu
titleUbuntu8.10,kernel2.6.27-11-generic
uuide2cf53c5-11de-4d57-a532-878901afd9b4
kernel/boot/vmlinuz-2.6.27-11-genericroot=UUID=e2cf53c5-11de-4d57-a532-878901afd9b4rolocale=zh_CNquietsplash
initrd/boot/initrd.img-2.6.27-11-generic
quiet
titleUbuntu8.10,kernel2.6.27-11-generic(recoverymode)
uuide2cf53c5-11de-4d57-a532-878901afd9b4
kernel/boot/vmlinuz-2.6.27-11-genericroot=UUID=e2cf53c5-11de-4d57-a532-878901afd9b4rolocale=zh_CNsingle
initrd/boot/initrd.img-2.6.27-11-generic
titleUbuntu8.10,kernel2.6.27-7-generic
uuide2cf53c5-11de-4d57-a532-878901afd9b4
kernel/boot/vmlinuz-2.6.27-7-genericroot=UUID=e2cf53c5-11de-4d57-a532-878901afd9b4rolocale=zh_CNquietsplash
initrd/boot/initrd.img-2.6.27-7-generic
quiet
titleUbuntu8.10,kernel2.6.27-7-generic(recoverymode)
uuide2cf53c5-11de-4d57-a532-878901afd9b4
kernel/boot/vmlinuz-2.6.27-7-genericroot=UUID=e2cf53c5-11de-4d57-a532-878901afd9b4rolocale=zh_CNsingle
initrd/boot/initrd.img-2.6.27-7-generic
titleUbuntu8.10,memtest86+
uuide2cf53c5-11de-4d57-a532-878901afd9b4
kernel/boot/memtest86+.bin
quiet
将第二阶段的引导加载程序加载到内存中之后,就可以对文件系统进行查询了,并将默认的内核映像和initrd映像加载到内存中。
当这些映像文件准备好之后,阶段2的引导加载程序就可以调用内核映像。
正如上面配置文件描述的那样,我的ubuntu启动会将加载/boot/vmlinuz-2.6.27-11-generic(zImage/bzImage格式的kernel映像)和/boot/initrd.img-2.6.27-11-generic(cpio格式的initrd映像)。
接下来就是kernel引导加载过程,这个过程包括如下6步。
1.执行一个对硬件做些基本设置的例程;
(,/arch/i386/boot/head.S中的start例程)
2.设置一个基本的环境(堆栈等),并清除BlockStartedbySymbol(BSS);
(./arch/i386/boot/compressed/head.S中的startup_32例程)
3.通过连接在映像中的函数来解压内核;
(./arch/i386/boot/compressed/misc.c中的decompress_kernelC函数)
4.启动swapper(0进程)进程,初始化页表,启用CPU内存分页。
然后会为任何可选的浮点单元(FPU)检测CPU的类型,并将其存储起来供以后使用;
(./arch/i386/kernel/head.S中的startup_32函数)
5.调用linuxkernlmain函数,进入与体系结构无关的Linux内核部分。
(init/main.c中的start_kernel函数)
这会调用一系列初始化函数来设置中断,执行进一步的内存配置,并加载已初始化的RAM盘。
最后启动init进程,这是第一个用户空间进程(user-spaceprocess);
(./arch/i386/kernel/process.c中的kernel_thread)
6.最后,启动空任务。
现在调度器就可以接管控制权了(在调用cpu_idle之后)。
通过启用中断,抢占式的调度器就可以周期性地接管控制权,从而提供多任务处理能力。
上面第5步加载的RAM盘(initrd)是由阶段2引导加载程序加载到内存中的,它用来加载必要的磁盘驱动内核模块,来挂载真正磁盘的root文件系统。
引导加载的最后的一步就是执行init(1进程),该进程会根据配置来启动服务。
一般的配置都会写在inittab里,不过我这里用的ubuntu使用的是upstart,它是基于事件驱动的,发生什么event怎么处理,在这里init进程会产生startupevent,upstart据此来启动rc.*配置的进程。
不过无论如何,此时引导加载程序已经放权了。
这里抄录一段LILO与GURB的优缺点对比。
1.LILO没有交互式命令界面,而GRUB拥有。
2.LILO不支持网络引导,而GRUB支持。
3.LILO将关于可以引导的操作系统位置的信息物理上存储在MBR中。
如果修改了LILO配置文件,必须将LILO第一阶段引导加载程序重写到MBR。
相对于GRUB,这是一个更为危险的选择,因为错误配置的MBR可能会让系统无法引导。
使用GRUB,如果配置文件配置错误,则只是默认转到GRUB命令行界面。
关于kernel和initrd两个映像。
技术含量很高的,嵌入式开发中bootloader可是很大一块。
值得深入,只可惜现在的技术水平,哎~
1.kernel/boot/vmlinuz-2.6.27-7-generic
2.initrd/boot/initrd.img-2.6.27-7-generic
initrd映像是打包的RAM盘根文件系统。
一般initrd.img-2.6.27-7-generic是一个cpio包文件,老版本也有gzip压缩格式的。
通过cpio命令将其解包到当前目录中,如下。
cpio使用方法可参见cpio命令详解。
Shell代码
1.zcat initrd.img-2.6.27-11-generic | cpio -i -d --no-absolute-filenames
zcatinitrd.img-2.6.27-11-generic|cpio-i-d--no-absolute-filenames
在我这里解包后的根文件系统包括如下内容。
从上面的directorytree可以看到initrd中主要包括的就是磁盘、网络、文件系统的驱动lkm文件。
其中还有最主要是的initshell脚本,它包括了初使化的全过程。
Shell代码
1.#!
/bin/sh
2.
3.echo "Loading, please wait..."
4.
5.[ -d /dev ] || mkdir -m 0755 /dev
6.[ -d /root ] || mkdir -m 0700 /root
7.[ -d /sys ] || mkdir /sys
8.[ -d /proc ] || mkdir /proc
9.[ -d /tmp ] || mkdir /tmp
10.mkdir -p /var/lock
11.mount -t sysfs -o nodev,noexec,nosuid none /sys
12.mount -t proc -o nodev,noexec,nosuid none /proc
13.
14.# Note that this only becomes /dev on the real filesystem if udev's scripts
15.# are used; which they will be, but it's worth pointing out
16.mount -t tmpfs -o mode=0755 udev /dev
17.[ -e /dev/console ] || mknod -m 0600 /dev/console c 5 1
18.[ -e /dev/null ] || mknod /dev/null c 1 3
19.> /dev/.initramfs-tools
20.mkdir /dev/.initramfs
21.
22.# Export the dpkg architecture
23.export DPKG_ARCH=
24.. /conf/arch.conf
25.
26.# Set modprobe env
27.export MODPROBE_OPTIONS="-Qb"
28.
29.# Export relevant variables
30.export ROOT=
31.export ROOTDELAY=
32.export ROOTFLAGS=
33.export ROOTFSTYPE=
34.export break=
35.export init=/sbin/init
36.export quiet=n
37.export readonly=y
38.export rootmnt=/root
39.export debug=
40.export panic=
41.export blacklist=
42.export resume_offset=
43.
44.# Bring in the main config
45.. /conf/initramfs.conf
46.for conf in conf/conf.d/*; do
47. [ -f ${conf} ] && . ${conf}
48.done
49.. /scripts/functions
50.
51.# Parse command line options
52.for x in $(cat /proc/cmdline); do
53. case $x in
54. init=*)
55. init=${x#init=}
56. ;;
57. root=*)
58. ROOT=${x#root=}
59. case $ROOT in
60. LABEL=*)
61. ROOT="/dev/disk/by-label/${ROOT#LABEL=}"
62. ;;
63. UUID=*)
64. ROOT="/dev/disk/by-uuid/${ROOT#UUID=}"
65. ;;
66. /dev/nfs)
67. [ -z "${BOOT}" ] && BOOT=nfs
68. ;;
69. esac
70. ;;
71. rootflags=*)
72. ROOTFLAGS="-o ${x#rootflags=}"
73. ;;
74. rootfstype
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lilognu