• 沒有找到結果。

啟動程序 啟動程序 啟動程序 啟動程序

4.2 系統架構 系統架構 系統架構 系統架構

4.2.1 啟動程序 啟動程序 啟動程序 啟動程序

Kernel Shared Library

Application

Root File System Kernel Image

Hardware

Linux Kernel Loadable Kernel Modules C Library Other Libraries Shell Utilities GUI

Base Linux GUI System

Linux

少量的組合語言。而啟動過程中也執行了大量的所寫的 Shell Script(主要是 bash shell),可以透過圖 12 來了解開機的整個流程。

圖 12 開機流程

當開啟 PC 的電源,BIOS 開機自我檢查(POST),按照 BIOS 中設置的啟動設備 (通常是硬碟)啟動,接著啟動設備上安裝的導引程序(boot loader)lilo 或 grub 開始 導引 Linux,Linux 首先進行核心(Kernel)的導引運作,接下來執行 init 程序,init 程序呼叫了 rc.sysinit 和 rc 等程序,rc.sysinit 和 rc 當完成系統初始化(initialization) 和執行服務的任務後,返回 init;init 啟動了 mingetty 後,打開了終端機供使用 者登錄系統,使用者登錄成功後進入了 Shell,這樣就完成了從開機到登錄的整 個啟動過程。

(1) BIOS (POST)

(2)Bootloader

(3)Kernel Boot

(4)Init

(5)Mingetty

rc.sysinit rc

(6)Shell

login Power

主要的開機程序可以分成圖 12 的數個流程,接下來我們簡單的敘述每個流程的 動作,而從原始碼角度來看的詳細過程放於附錄 B 當作參考。

(1) BIOS (POST)

BIOS ( Basic Input/Output Setup )的主要作用是作自我檢測(POST) ,是第一 個被載入電腦的資料,包含 CPU 資料、開機順序、硬碟大小、晶片組工作 狀態、PnP (Plug and Play)的開啟與否、記憶體的時脈等都記錄在 BIOS 當中,

開機之後,系統會先去找 BIOS 作硬體初始的動作。

(2) Bootloader

個人電腦的系統在讀完 BIOS 之後,會先去讀取第一個開機硬碟的第一個 磁區(master boot record, MBR),這個磁區主要就是在記錄開機的資訊,

LILO 或 GRUB 等 Bootloader 紀錄就是在 MBR,例如 LILO 記錄的資訊就 會被讀出來,並依內容執行不同的系統,也就是多重開機的設定。

(3) Kernel Boot

當在 LILO 的選單中選擇我們要的 Linux 系統,開發平台跑到 Linux 所在的 硬碟之下,就開始將所需要的核心載入。在 Linux 的系統下,通常開機的核 心都擺在 /boot 底下,因此這時候的 boot loader 就會到/boot 去尋找相關的 核心。本專題的 kernel 名稱通常是/boot/vmlinuz-2.4.20-8(Red Hat 9.0)的格 式,所以使用 uname –r 的指令就可了解目前的核心版本。當 kernel 載入之 後會作一系列系統初始和設置的動作,我們可以從 trace 原始碼的角度來觀 察,而這一系列的核心資料結構初始化及外部初始化的動作請參考附錄 B。

(4) Init

init 的 process id (pid)為 1,因此 init 行程是系統所有行程的起點,Linux 在 完成 kernel 導引以後,就開始執行 init 程序,init 程序需要讀取配置文件 /etc/inittab 的初始化檔案。inittab 是一個不可執行的文字檔案,由若干指令 所組成。Inittab(initialize table)的詳細內容請見附錄 C。在 init 作系統初始化

的動作時,呼叫執行/etc/rc.d/rc.sysinit,故在 init 的 inittab 中有這麼一行─

si::sysinit:/etc/rc.d/rc.sysinit

rc.sysinit 是一個 shell script,主要是完成一些系統初始化的工作,rc.sysinit 是每一個 run-level 都要首先執行的 shell script。主要工作有啟動 swap partition、檢查硬碟、mount 硬體模組區塊、以及其它一些需要優先執行任 務。

在 rc.sysinit 執行後,返回 init 繼續其它的動作,接下來啟動核心的外掛式模 組 (/etc/modules.conf),接著執行到/etc/rc.d/rc 程序,rc 會根據不同的 run-level 啟動不同的 system service 的 daemon,當 daemon 啟動完成,rc 程序也就執 行完畢,然後再返回 init 繼續下一步。

(5) Mingetty

rc 執行完畢後,返回 init。此時候基本系統環境已設置好,各種 daemon 也 已經啟動。init 接下來會打開 6 個終端機,以便使用者登錄系統。通過按 Alt+Fn(n 對應 1-6)可在這 6 個終端機中切換,也可以自己設定終端機的個數。

 1:2345:respawn:/sbin/mingetty tty1

 2:2345:respawn:/sbin/mingetty tty2

 3:2345:respawn:/sbin/mingetty tty3

 4:2345:respawn:/sbin/mingetty tty4

 5:2345:respawn:/sbin/mingetty tty5

 6:2345:respawn:/sbin/mingetty tty6

在 2、3、4、5 的 run-level 中都將以 respawn 方式執行 mingetty 程序,mingetty 程序能打開終端機、設置模式。同時它會顯示一個文本登錄界面(run-level 3),這個界面就是我們經常看到的登入界面,在這個登錄界面中會提示輸入 使用者帳號、密碼,傳給 login 程序來驗證使用者的身份。當 init 執行完之 後,在/etc/rc.local 當中我們可以設定一些平常手動載入的模組例如光碟或是 NAT 的服務,可以寫到 rc.local 中,在開機時就會自動載入,

(6) Shell

login 程序成功後,會向對應的終端機再輸出最近一次登入的訊息(在 /var/log/lastlog 中有記錄),並檢查使用者是否有新郵件(在/usr/spool/mail/的 對應使用者名目錄下)。接著開始設置各種環境變數,對於 bash 來說,系統 首先尋找/etc/profile Script 文件,並執行它;如果使用者的主目錄中存 在.bash_profile 文件便執行,在這些文件中有可能呼叫了其它配置文件,所 有的配置文件執行後,各種環境變數也設好了,這時會出現熟悉的命令列提 示(command prompt),到此整個啟動過程就結束了。

核心原始碼主要可以在

http://www.kernel.org/ 中找到,裡面提供了許多版本的

kernel。本專題主要的硬體平台是在 x86 和 ARM-9 目標板上,首先,在 x86 上是 以 2.4.20 為實驗版本,要特別注意的是,並不是每一個版本都可以支援開發的架 構,因此選擇的必須是比較穩定的版本,ARM 的 kernel 版本可以參考

http://www.arm.linux.org.uk/developer 來找到相關的資訊,以 ARM 為例,主要是

使用 HyBUS 已經 Patch 過的 Kernel(2.4.18-rmk7-pxa1-xhyper255),主要是使用 ARM 架構(patch-2.4.18-rmk7)、CPU 型號(diff-2.4.18-rmk7-pxa1)、及 ARM 目標 版(xhyper255_TKU3-2.4.18-rmk7-pxa1) 的 Patch,Patch 過的 kernel 當中便包含了 許多 ARM 和目標板所需要的功能核心組態詳細設定請見

http://bbs.iecs.fcu.edu.tw/~viggo/project/config/arm_kernconf.htm。

4.3 Kernel