Linux系統分析之啟動流程

2021-09-05 23:56:11 字數 2749 閱讀 4816

第一部分:核心的引導(核內引導)

啟動裝置使用lilo或grub等引導程式開始引導linux系統,當引導程式成功完成引導任務後,linux從它們手中接管了cpu的控制權, 然後cpu就開始執行linux的核心映象**,開始了linux啟動過程。這裡使用了幾個匯程式設計序來引導linux,這一步涉及到linux源**樹中的「arch/i386/boot」下的這幾個檔案:bootsect.s、setup.s、video.s等。

其中bootsect.s是生成引導扇區的彙編原始碼,它完成載入動作後直接跳轉到setup.s的程式入口。setup.s的主要功能就是將系統引數(包括記憶體、磁碟等,由bios返回)拷貝到特別記憶體中,以便以後這些引數被保護模式下的**來讀取。此外,setup.s還將video.s中的**包含進來,檢測和設定顯示器和顯示模式。最後,setup.s將系統轉換到保護模式,並跳轉到 0x100000。

0x100000這個記憶體位址存放的是解壓後的核心,因為redhat提供的核心包含了眾多驅動和功能而顯得比較大,所以在核心編譯中使用了「makebzimage」方式,從而生成壓縮過的核心,在redhat中核心常常被命名為vmlinuz(也有類似initrd-2.6.11.12.img這樣的命名)。在linux的最初引導過程中,是通過"arch/i386/boot/compressed/"中的head.s利用misc.c中定義的decompress_kernel()函式,將核心vmlinuz解壓到0x100000的。

當cpu跳到0x100000時,將執行"arch/i386/kernel/head.s"中的 startup_32,它也是vmlinux的入口,然後就跳轉到start_kernel()中去了。start_kernel() 是"init/main.c"中的定義的函式,start_kernel()中呼叫了一系列初始化函式,以完成kernel本身的設定。如果順利執行完start_kernel(),則基本的linux核心環境已經建立起來了。

在start_kernel()的最後,通過呼叫kernelthread()函式,系統建立第乙個核心執行緒init(),自身呼叫cpu_idle(null)休息。核心執行緒init()主要是來進行一些外設初始化的工作的,包括快取區管理初始化(fs/buffer.c),虛擬記憶體管理初始化(mm/vmscan.c),檔案系統初始化(fs/filesystems.c)和root檔案系統的安裝,呼叫do_basic_setup()完成外設及其驅動程式的初始化。

當do_basic_setup()函式返回init(),init()又開啟了/dev/console裝置,重定向三個標準的輸入輸出檔案stdin、stdout和stderr到控制台,最後,搜尋檔案系統中的init程式(或者由init=命令列引數指定的程式),並使用execve()系統呼叫載入執行init程式。到此init()函式結束,init程序從核心態切換到使用者態(程序號1),核心的引導部分也到此結束了。

第二部分:執行init

init的程序號是1,是系統所有程序的起點,linux在完成核內引導以後,就開始執行init程式(init()的最後一行)。init程式讀取並執行配置檔案/etc/inittab。

第三部分:系統初始化

在init的配置檔案中有這麼一行:

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

它呼叫執行了/etc/rc.d/rc.sysinit,而rc.sysinit是乙個bash shell的指令碼,它主要是完成一些系統初始化的工作,rc.sysinit是每乙個執行級別都要首先執行的重要指令碼。它主要完成的工作有:啟用交換分割槽,檢查磁碟,載入硬體模組以及其它一些需要優先執行任務。

第四部分:啟動對應執行級別的守護程序

在rc.sysinit執行後,將返回init繼續其它的動作,通常接下來會執行到/etc/rc.d/rc程式。以執行級別3為例,init將執行配置檔案inittab中的以下這行:

l5:5:wait:/etc/rc.d/rc 5

這一行表示以5為引數執行/etc/rc.d/rc,/etc/rc.d/rc是乙個shell指令碼,它接受數字5作為引數,去執行/etc/rc.d/rc5.d/目錄下的所有的rc啟動指令碼。當然,/etc/rc.d/rc5.d/目錄中的這些啟動指令碼實際上都是一些鏈結檔案,而不是真正的rc啟動指令碼,真正的rc啟動指令碼實際上都是放在/etc/rc.d/init.d/目錄下。

第五部分:建立終端

rc執行完畢後,返回init。這時基本系統環境已經設定好了,各種守護程序也已經啟動了。init接下來會開啟6個終端(定義在/etc/inittab中),以便使用者登入系統。通過按alt+fn(n對應1-6)可以在這6個終端中切換。

第六部分:登入系統,啟動完成

login程式會接收終端程式傳來的使用者名稱作為使用者名稱引數,並進行分析。如果使用者名稱不是root,且存在/etc/nologin檔案,login將輸出nologin檔案的內容,然後退出。這通常用來系統維護時防止非root使用者登入。

只有/etc/securetty中登記了的終端才允許root使用者登入,如果不存在這個檔案,則root可以在任何終端上登入。/etc/usertty檔案用於對使用者作出附加訪問限制,如果不存在這個檔案,則沒有其他限制。

login程式成功後,會向對應的終端在輸出最近一次登入的資訊(在/var/log/lastlog中有記錄),並檢查使用者是否有新郵件(在/usr/spool/mail/的對應使用者名稱目錄下)。然後開始設定各種環境變數:對於bash來說,系統首先尋找/etc/profile指令碼檔案,並執行它;然後如果使用者的主目錄中存在.bash_profile檔案,就執行它。

Linux系統記憶體管理之夥伴系統分析

1.夥伴系統概念 夥伴系統是一種經典的記憶體管理方法。linux夥伴系統的引入為核心提供了一種用於分配一組連續的頁而建立的一種高效的分配策略,並有效的解決了外碎片問題。2.夥伴系統的組織結構 linux中的記憶體管理的 頁 大小為4kb。把所有的空閒頁分組為11個塊鍊錶,每個塊鍊錶分別包含大小為1,...

Linux作業系統分析

馮諾依曼體系結構如圖所示,其中運算器 儲存器 控制器 輸入裝置和輸出裝置5大基本型別部件組成了計算機硬體。計算機內部採用二進位制來表示指令和資料,將其存入儲存器中,然後啟動計算機工作,這就是儲存程式的基本含義。cpu從記憶體中不斷取下一條指令來執行,cpu負責解釋和執行這些指令,它們通過匯流排連線起...

推薦系統 分析

收集使用者資訊的行為記錄模組 分析使用者喜好的模型分析模組 推薦演算法模組 推薦演算法 1.基於內容的推薦系統 content based recommendation 2.協同過濾推薦系統 collaborative filtering recommendation 3.混合推薦系統 hybrid...