-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlinux系统启动过程.mm
117 lines (116 loc) · 13.9 KB
/
linux系统启动过程.mm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<map version="1.0.1">
<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->
<node CREATED="1470707244740" ID="ID_145931839" MODIFIED="1470707260322" TEXT="linux系统启动过程">
<node CREATED="1470708659961" ID="ID_1531695549" MODIFIED="1470708665043" POSITION="right" TEXT="上电"/>
<node CREATED="1470708666669" ID="ID_410120518" MODIFIED="1470708675914" POSITION="right" TEXT="BIOS自检">
<node CREATED="1470708798196" ID="ID_482153167" MODIFIED="1470708799407" TEXT="POST(Power-on self test)"/>
<node CREATED="1470709051706" ID="ID_1726283543" MODIFIED="1470709052834" TEXT="BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码"/>
</node>
<node CREATED="1470708676286" ID="ID_168625877" MODIFIED="1470708685212" POSITION="right" TEXT="系统引导">
<node CREATED="1470709144631" ID="ID_483134153" MODIFIED="1470709188349" TEXT="MBR的第一个区域是bootloader,运行bootloader"/>
<node CREATED="1470709189713" ID="ID_1873489108" MODIFIED="1470709275839" TEXT="grup">
<node CREATED="1470709269395" ID="ID_1752691356" MODIFIED="1470709273439" TEXT="stage1">
<node CREATED="1470709302909" ID="ID_1684907817" MODIFIED="1470709391060" TEXT="stage1/start.S"/>
<node CREATED="1470709417655" ID="ID_880931861" MODIFIED="1470709453630" TEXT="被BIOS写入MBR的bootloader段"/>
<node CREATED="1470709463825" ID="ID_575841330" MODIFIED="1470709804908" TEXT="被载入内存0x7c00处执行">
<node CREATED="1470709536036" ID="ID_1595005222" MODIFIED="1470709597695" TEXT="将硬盘0头0道2扇区读入内存0x7000处"/>
<node CREATED="1470709610400" ID="ID_1653026696" MODIFIED="1470709611565" TEXT="调用copy_buffer将其转移到内存0x8000处"/>
</node>
</node>
<node CREATED="1470709283003" ID="ID_405960164" MODIFIED="1470709287455" TEXT="stage1.5">
<node CREATED="1470709642976" ID="ID_786491227" MODIFIED="1470709643661" TEXT="存放在硬盘0头0道3扇区向后的位置"/>
<node CREATED="1470710058784" ID="ID_1850329065" MODIFIED="1470710059395" TEXT="stage1_5作为stage1和stage2中间的桥梁"/>
<node CREATED="1470710049806" ID="ID_1303896342" MODIFIED="1470710051395" TEXT="stage1_5有识别文件系统的能力"/>
</node>
<node CREATED="1470709275777" ID="ID_1079239587" MODIFIED="1470709281104" TEXT="stage2">
<node CREATED="1470709545190" ID="ID_1965346445" MODIFIED="1470709556023" TEXT="0头0道2扇区内容是源代码中的/stage2/start.S"/>
<node CREATED="1470709922465" ID="ID_583383301" MODIFIED="1470709924274" TEXT="它的主要作用就是负责将stage2或stage1.5从硬盘读到内存中">
<node CREATED="1470710220972" ID="ID_1607630004" MODIFIED="1470710222125" TEXT="这里的stage2或者stage1_5不是/boot分区/boot/grub目录下的文件,因为这个时候grub还没有能力识别任何文件系统"/>
<node CREATED="1470709810998" ID="ID_723458200" MODIFIED="1470710013995" TEXT="读stage1.5">
<node CREATED="1470710000181" ID="ID_764446010" MODIFIED="1470710025050" TEXT="载入到0x2200处">
<node CREATED="1470710260318" ID="ID_63057944" MODIFIED="1470710261579" TEXT="此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行"/>
</node>
</node>
<node CREATED="1470709820926" ID="ID_888250731" MODIFIED="1470710310443" TEXT="读stage2">
<node CREATED="1470709991613" ID="ID_1471244714" MODIFIED="1470710027398" TEXT="载入到0x820处">
<node CREATED="1470710283281" ID="ID_56334094" MODIFIED="1470710284495" TEXT="这个时候start.S读取的是存放在/boot分区Boot Sector的stage2"/>
<node CREATED="1470710299231" ID="ID_513182895" MODIFIED="1470710300509" TEXT="因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,限制在8GB以内。因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前"/>
</node>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1470708688213" ID="ID_1670444955" MODIFIED="1470710398648" POSITION="right" TEXT="启动内核">
<node CREATED="1470710398636" ID="ID_215184698" MODIFIED="1470710400951" TEXT="当stage2被载入内存执行时">
<node CREATED="1470710380842" ID="ID_435010302" MODIFIED="1470710381583" TEXT="解析grub的配置文件/boot/grub/grub.conf"/>
<node CREATED="1470710427732" ID="ID_1104615565" MODIFIED="1470710428394" TEXT="然后加载内核镜像到内存中"/>
<node CREATED="1470710433445" ID="ID_450028052" MODIFIED="1470710433856" TEXT="将控制权转交给内核"/>
<node CREATED="1470710458108" ID="ID_171127520" MODIFIED="1470710459018" TEXT="内核会立即初始化系统中各设备并做相关的配置工作"/>
</node>
<node CREATED="1470710608810" ID="ID_665274850" MODIFIED="1470710629145" TEXT="内核掌握控制权">
<node CREATED="1470710930638" ID="ID_1817434685" MODIFIED="1470710935876" TEXT="内核镜像">
<node CREATED="1470710937144" ID="ID_742623952" MODIFIED="1470710938282" TEXT="实际上Linux的内核镜像仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入 initrd 。这样在以后启动系统时,一部分设备驱动就放在initrd中来加载"/>
</node>
<node CREATED="1470710634204" ID="ID_857502016" MODIFIED="1470710641512" TEXT="linux2.6">
<node CREATED="1470710681853" ID="ID_1488526724" MODIFIED="1470710690235" TEXT="initrd">
<node CREATED="1470710691303" ID="ID_1441330274" MODIFIED="1470710692386" TEXT="initrd 的英文含义是 bootloader initialized RAM disk"/>
</node>
<node CREATED="1470710707102" ID="ID_1849526035" MODIFIED="1470710711188" TEXT="linu2.6内核启动前">
<node CREATED="1470710719712" ID="ID_1752017531" MODIFIED="1470710720171" TEXT="boot loader 会将存储介质中的 initrd 文件加载到内存"/>
</node>
<node CREATED="1470710769464" ID="ID_1148807461" MODIFIED="1470710776087" TEXT="内核启动阶段">
<node CREATED="1470710779104" ID="ID_1329444248" MODIFIED="1470710782430" TEXT="第一阶段">
<node CREATED="1470710794659" ID="ID_447028229" MODIFIED="1470710795333" TEXT="先执行 initrd 文件系统中的init,完成加载驱动模块等任务">
<node CREATED="1470725139151" ID="ID_54094938" MODIFIED="1470725140156" TEXT="主要是加载各种存储介质相关的设备驱动程序"/>
</node>
<node CREATED="1470725151265" ID="ID_12263203" MODIFIED="1470725152700" TEXT="创建一个根设备,然后将根文件系统rootfs以只读的方式挂载"/>
</node>
<node CREATED="1470710782688" ID="ID_1152996566" MODIFIED="1470710785679" TEXT="第二阶段">
<node CREATED="1470725178849" ID="ID_267921790" MODIFIED="1470725586095">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,执行系统的<font color="#ff3333">1号进程</font>
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
</node>
<node CREATED="1470710641899" ID="ID_1723311850" MODIFIED="1470710645138" TEXT="linux2.5">
<node CREATED="1470710958830" ID="ID_558686353" MODIFIED="1470710959948" TEXT="initramfs">
<node CREATED="1470710993817" ID="ID_683103248" MODIFIED="1470710994870" TEXT="在内核镜像中附加一个cpio包,这个cpio包中包含了一个小型的文件系统"/>
</node>
<node CREATED="1470710996481" ID="ID_1233114082" MODIFIED="1470711001270" TEXT="内核启动阶段">
<node CREATED="1470711013761" ID="ID_507848973" MODIFIED="1470711024998" TEXT="内核将这个 cpio包解开,将其中包含的文件系统释放到rootfs中"/>
<node CREATED="1470711046308" ID="ID_153074901" MODIFIED="1470711047366" TEXT="内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行"/>
</node>
</node>
</node>
</node>
<node CREATED="1470708717062" ID="ID_617719328" MODIFIED="1470708721070" POSITION="right" TEXT="初始化系统">
<node CREATED="1470712529022" ID="ID_314880874" MODIFIED="1470725230920" TEXT="1号进程(/sbin/init)掌握控制权">
<node CREATED="1470725254964" ID="ID_35370246" MODIFIED="1470725256121" TEXT="读取/etc/inittab文件来执行相应的脚本进行系统初始化">
<node CREATED="1470725334656" ID="ID_1762537498" MODIFIED="1470725335853" TEXT="执行系统初始化脚本(/etc/rc.d/rc.sysinit)"/>
<node CREATED="1470725343257" ID="ID_1927884759" MODIFIED="1470725343900" TEXT="执行/etc/rc.d/rc脚本">
<node CREATED="1470726766910" ID="ID_913385156" MODIFIED="1470726768226" TEXT="定义了服务启动的顺序是先K后S"/>
<node CREATED="1470726769774" ID="ID_358691307" MODIFIED="1470726784385" TEXT="每个运行级别的服务状态是放在/etc/rc.d/rc*.d(*=0~6)目录下"/>
<node CREATED="1470726793285" ID="ID_903822496" MODIFIED="1470726794319" TEXT="所有的文件均是指向/etc/init.d下相应文件的符号链接"/>
</node>
<node CREATED="1470725357561" ID="ID_828063512" MODIFIED="1470725358036" TEXT="执行用户自定义引导程序/etc/rc.d/rc.local">
<node CREATED="1470726814961" ID="ID_193859831" MODIFIED="1470726816029" TEXT="当执行/etc/rc.d/rc3.d/S99local时,它就是在执行/etc/rc.d/rc.local"/>
<node CREATED="1470726832679" ID="ID_1448761612" MODIFIED="1470726850813" TEXT="添加自定义的程序只需要将命令放在rc.local里面就可以了"/>
</node>
<node CREATED="1470725398921" ID="ID_1229964766" MODIFIED="1470725399573" TEXT="启动终端或X-Window来等待用户登录">
<node CREATED="1470726890234" ID="ID_1741353727" MODIFIED="1470726901736" TEXT="执行"/sbin/mingetty",而且执行了6个纯文本终端"/>
<node CREATED="1470726955291" ID="ID_1144094526" MODIFIED="1470726976842" TEXT="执行/etc/X11/prefdm -nodaemon启动X-Window"/>
</node>
</node>
</node>
</node>
</node>
</map>