日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 開機(jī)程序之研討

各位是否曾經(jīng)對(duì)電腦整個(gè)開機(jī)的流程感到好奇呢 ? 這一次 , 我們所要討論的
主題 , 就是 Linux 從開機(jī)的一瞬間到 login 為止 , 到底發(fā)生了什麼事情 ?

想必各位都知道 , 在剛開機(jī)時(shí) , 由於 80x86 的特性 , CS ( Code Segment )
這個(gè)暫存器中全部都放著 1 , 而 IP ( Instruction Pointer ) 這個(gè)暫存器
中全部都放著 0 , 換句話說 , CS=FFFF 而 IP=0000 , 此時(shí) , CPU 就依據(jù)
CS 及 IP 的值 , 到 FFFF0H 去執(zhí)行那個(gè)地方所放的指令 . 這時(shí)候 , 由於
FFFF0H 已經(jīng)到了高位址的頂端 , 所以 , FFFF0H 這個(gè)地方 , 總是會(huì)放一個(gè)
JMP 指令 , 跳到比較低的位址 . 接著 , ROM BIOS 就會(huì)作一些檢查的動(dòng)作
像記憶體 , 鍵盤 等...... 并在我們俗稱的 UMB ( Upper Memory Block )
之中掃描 , 看看是否有合法的 ROM 存在 ( 比如 SCSI 卡上的 ROM ) .
假如有 , 就到里面去執(zhí)行一些東西 , 執(zhí)行完之後再繼續(xù)剛才的行程 . 到了
最後 , 讀取磁碟機(jī)上的第一個(gè) sector . 在這里 , 我假設(shè)各位由硬碟啟動(dòng)
因此 , 就硬碟的構(gòu)造而言 , 它的第一個(gè) sector 稱為 MBR ( Master Boot
Record ) . 因?yàn)橐粋€(gè) sector 是 512 bytes , 而 MBR 這 512 bytes 可分
為兩個(gè)部份 , 第一個(gè)部份為 Pre-Boot 區(qū) , 占了 446 bytes ; 第二部份
是 Partition Table , 占了 66 bytes . Pre-Boot 區(qū)的作用之一 , 就是
去看看那個(gè) Partition 被標(biāo)成 Active , 然後去讀那個(gè) Partition 的 Boot
區(qū) .

在 Linux 的啟動(dòng)方面 , 一般人最常把 LILO 放在 MBR 或 Superblock
假如你把 LILO 放在 MBR , 那很明顯的 , 當(dāng)讀取到 MBR 的時(shí)候 , LILO
就被執(zhí)行 , 此時(shí) , 你的螢?zāi)簧蠒?huì)出現(xiàn); boot: 接著 , 就進(jìn)行 Load Kernel
的動(dòng)作 . 在另一方面來說 , 假如你把 LILO 安裝在 Superblock , 通常你
還會(huì)有一個(gè)管理開機(jī)的程式 , 也許是住在 MBR ( 像 OSBS ) 或者是放在一
個(gè)單獨(dú)的 Partition ( 像 OS/2 的 Boot Manager ) . 再由這個(gè)管理開機(jī)
的程式去讀取 LILO , 進(jìn)而做 Load Kernel 的動(dòng)作 .

好了 , 到了目前為止 , 我們已經(jīng)講到 Load Kernel 的動(dòng)作 . Kernel 被
load 到 memory 中之後 , 接著進(jìn)行一連串 probe 周邊的動(dòng)作 , 像串聯(lián)埠
并聯(lián)埠 , 軟碟 , 音效卡 , 硬碟 , 光碟機(jī) 等 ...... 接著 mount root
partition . 在這之後 , kernel 會(huì)起動(dòng) init 這個(gè) process . init 這
個(gè) process 的 PID 為 1 , 它是所有 process 的祖先 .

接下來呢 ? 系統(tǒng)就開始執(zhí)行; /rc.d/rc.S; , 在這里 , 我們暫時(shí)打住 ,
先對(duì)大概的 initialization script 執(zhí)行的順序作一個(gè)瀏覽 , 請(qǐng)看下面
的流程 :

init[1]
rc.Sbegin;;;;<--- 目前我們已經(jīng)講到這里
rc.serialbegin
rc.serialend
rc.Send
init[1] enter runlevel 5
rc.Mbegin
rc.inet1;begin
rc.inet1;end
rc.inet2;begin
rc.inet2;end
rc.font;;begin
rc.font;;end
rc.local;begin
rc.local;end
rc.Mend
login

上面的流程清楚的指出 , 在 rc.S 這個(gè) shell script 中 , 會(huì)去執(zhí)行 rc.serial
接著再執(zhí)行 rc.M , rc.M 中又包含了 rc.inet1 , rc.inet2 , rc.font , rc.local
最後執(zhí)行 login . 在下面的內(nèi)容中 , 將為各位介紹這幾個(gè) shell script
從下面開始 , 凡是每一列之前有一個(gè) # 的 , 為原來 shell script 中的注解
有兩個(gè) # 的 , 為筆者加上的注解 , 當(dāng)然啦 , 沒有任何 # 的為 shell script
的內(nèi)容 , 而對(duì)命令或內(nèi)容的解釋 , 一律都寫在命令或內(nèi)容的前面 .
首先由 rc.S 開始 :

***************************** rc.S **********************************

#!/bin/sh
#
# /etc/rc
#
# These commands are executed at boot time by init(8).
# User customization should go in /etc/rc.local.

echo "======== rc.S is running !; System Initializing Now !!! ========"
PATH=/sbin:/usr/sbin:/bin:/usr/bin

## 打開所有 swap ! 下面 /sbin/swapon -a 的意思是 : 使得 /etc/fstab 中被記錄

推薦閱讀