走進(jìn)Linux 操作系統(tǒng)
它們的,而前一階段都是由“硬件進(jìn)程”手工去做的。該階段,這個由ini_task創(chuàng)建的新進(jìn)程需要初始化總線、網(wǎng)絡(luò)并啟動系統(tǒng)中的各種系統(tǒng)內(nèi)核后臺線程,然后再初始化外設(shè)、設(shè)置文件格式,在這之后,它要為進(jìn)入系統(tǒng)做最后的準(zhǔn)備——初始化文件系統(tǒng),安裝根文件,打開/dev/console設(shè)備,重定向stdin、stdout和stderr到控制臺,然后搜索文件系統(tǒng)中的init程序,并使用 execve()系統(tǒng)調(diào)用加載執(zhí)行init程序。系統(tǒng)自此進(jìn)入了用戶態(tài)。 init程序接著將依照initab配置文件中的選項(xiàng)依次執(zhí)行: 1 確定運(yùn)行級別(1-6) 2 運(yùn)行rc.sysinit腳本中的的系統(tǒng)服務(wù),如激活交換分區(qū),檢查磁盤,加載硬件模塊等 3 運(yùn)行規(guī)定級別下的服務(wù):/etc/rc.d/rc*.d/下的s打頭的服務(wù),如網(wǎng)絡(luò)服務(wù)s*network。 4 在指定串口上運(yùn)行g(shù)etty程序,getty打開終端線,并設(shè)置模式,然后運(yùn)行l(wèi)ogin程序。如果用戶帳號和密碼正確(需要通過/etc/passwd驗(yàn)證),則進(jìn)入用戶的工作目錄,并按照其工作目錄中的設(shè)置執(zhí)行相應(yīng)的shell。 到這里用戶才可以真正實(shí)用操作系統(tǒng)了。 idle進(jìn)程是個奇怪的進(jìn)程,它是在沒有別的任務(wù)使用cpu時是才使用cpu的,它的存在價值據(jù)說可以延長cpu壽命。 內(nèi)核后臺線程是種執(zhí)行在內(nèi)核態(tài)的進(jìn)程,它們和用戶進(jìn)程一樣受調(diào)度程序調(diào)度,系統(tǒng)利用它們周期性(不一定固定周期)地執(zhí)行一些自身管理方面的“家務(wù)事”。主要的幾種內(nèi)核線程為:bdflush——清理被寫過的內(nèi)存緩沖區(qū);kup-date——按時將內(nèi)存緩沖區(qū)中的信息更新到磁盤中; kswapd——將內(nèi)存頁交換到磁盤;keventd——關(guān)系系統(tǒng)事件;ksoftirq——執(zhí)行軟件中斷。 搭建實(shí)驗(yàn)系統(tǒng) 很抱歉搭建一個linux操作系統(tǒng)到目前為止還沒有一個很標(biāo)準(zhǔn)的流程或規(guī)范,不過大體流程都大通小異,無非是首先編譯內(nèi)核——將內(nèi)核源代碼編譯成一個可執(zhí)行的鏡像文件,當(dāng)然編譯內(nèi)核時可能會帶有一些模塊也需要同期進(jìn)行編譯和安裝(是否有模塊取決于你的具體選擇)?! ∮辛司幾g后的內(nèi)核,接著就需要創(chuàng)建一個根文件系統(tǒng),在其中又需要創(chuàng)建必要的目錄。至于其中使用的軟件和庫函數(shù)你可以選擇下載源代碼包,然后交叉編譯,再進(jìn)行安裝?;蛘呶覀兺祩€懶,從一個發(fā)布的完整系統(tǒng)里直接拷貝需要的軟件和庫,同時將必要的設(shè)備文件、配置文件和服務(wù)腳本也拷貝過來,你這時所要做得僅僅是去修改一些相關(guān)的配置文件就可以擁有一個自己的文件系統(tǒng)了。 內(nèi)核與文件系統(tǒng)都有了,就可以說一切具備只欠東風(fēng),你所需要做得只剩下將內(nèi)核和文件系統(tǒng)綁定到一起,讓系統(tǒng)被引導(dǎo)載入內(nèi)核,內(nèi)核載入后可以找到根文件系統(tǒng),并執(zhí)行其中的初始化程序。你可別以為這個收尾動作能輕松搞定,往往初學(xué)者都在這里要栽跟頭?! ≡趺茨茉谧钚〉拇鷥r學(xué)習(xí)搭建系統(tǒng)呢?想想看可不是每個網(wǎng)友都能找個空硬盤或者磁盤(看看你的機(jī)器,也許連軟驅(qū)都沒)來做新系統(tǒng)的,為了保護(hù)原有系統(tǒng),即便開一個新分區(qū)都不能鼓勵。所以最好的方法就是用內(nèi)存模擬一個磁盤,將創(chuàng)建的根文件系統(tǒng)放在其中,系統(tǒng)引導(dǎo)后,就登陸到內(nèi)存模擬的磁盤上運(yùn)行。這時你徹底跳出了你的物理硬盤。這種方法有時在嵌入系統(tǒng)中會被使用,或希望斷電后數(shù)據(jù)被抹掉的安全系統(tǒng)中使用?! ∠旅嫖覀兙鸵煌鰝€這樣的試驗(yàn)系統(tǒng),你付出的唯一代價是消耗些時間和無數(shù)次擊健。編譯內(nèi)核 第一步要做的工作就是挑選一個合適版本的內(nèi)核源代碼包,然后編譯它。不要以為編譯內(nèi)核很神秘,其實(shí)它和編譯普通程序差不多,內(nèi)核源代碼其實(shí)就是“一大堆”程序,編譯它就等于分別編譯個個程序然后在將它們鏈接成一個單一的可執(zhí)行鏡像文件。這個鏡像就是你在/boot目錄下看到的vmlinuz-*(如果你細(xì)心的話,一定能發(fā)現(xiàn)在該目錄下還有一個叫vmlinux的文件。其實(shí)這兩個文件是一回事,但前面那個是經(jīng)過壓縮的) 正如第一部分所說,linux內(nèi)核具有很強(qiáng)的伸縮性,在內(nèi)核里面許多功能是可選擇的,如果需要就可以被編譯到內(nèi)核,不過內(nèi)核會因此變的肥胖。一種可替代的方式是將某些功能編譯成模塊放在文件系統(tǒng)內(nèi),等你真正需要它時,再由被載入到內(nèi)核,這樣就內(nèi)核就可以輕裝上陣了,啟動起來也快許多?! ‰m然是個試驗(yàn)系統(tǒng),但還是盡力讓它功能做強(qiáng)點(diǎn)吧。所以在編譯前,配置內(nèi)核選項(xiàng)時,除了支持最基本的ext2文件系統(tǒng),pci接口,自動裝在模塊等功能外,再將ext3,jfs,即插即用,網(wǎng)絡(luò),scsi,usb等比較常用的功能加入。再一個就是為了能實(shí)現(xiàn)我們的虛擬內(nèi)存中建立根文件系統(tǒng),內(nèi)核還需要支持ramdisk 和initrd。內(nèi)核網(wǎng)絡(luò)設(shè)備選項(xiàng)里包含大量網(wǎng)卡驅(qū)動程序,你必須知道自己網(wǎng)卡內(nèi)型才能正確選擇,一般情況都將網(wǎng)卡驅(qū)動編譯未模塊,在系統(tǒng)啟動后載入。我們試驗(yàn)系統(tǒng)運(yùn)行在vmware下,而vmware虛擬網(wǎng)卡驅(qū)動為pcnet32,因此這個模塊被包含進(jìn)來了。編譯步驟 先去下載一個內(nèi)核源代買不用我在多說了吧。如果你實(shí)在是個衣來伸手的家伙,好吧告訴你,到www.kernel.org網(wǎng)站上蕩一個想要版本的內(nèi)核源代碼。如果是gz結(jié)尾的壓縮源文件,就使用tar xvzf linux-2.4.18.tar.gz解開,如果是gz2結(jié)尾的,就使用tar xvjf linux-2.4.18.tar.bz2解開?! ?nèi)核版本編號可是有點(diǎn)講究的,簡單的說,偶數(shù)為穩(wěn)定版本,奇數(shù)為開發(fā)版本,所以我們用2.4.18版,一是因?yàn)樗鼘儆诜€(wěn)定版,再一個就使我機(jī)器里以前下載過它,不想再換了:)?! ∪缓筮M(jìn)入存放解開后的內(nèi)核原代碼的目錄(標(biāo)準(zhǔn)系統(tǒng)默認(rèn)情況下在目錄/usr/src/linux下存放該系統(tǒng)的內(nèi)核源代碼),執(zhí)行命令make menuconfig進(jìn)行內(nèi)核功能配置,選擇需要的功能以模塊形式編譯或直接編譯到內(nèi)核。配置信息默認(rèn)情況下記錄在隱含文件.config中,你也可以選擇將其記錄到自定義文件中,比如可以把信息記錄在minisys.config中。在以后配置內(nèi)核時可以方便地導(dǎo)入指定的配置文件。<make 詳細(xì)解釋***> make menucofig提供給你一個文本圖形界面的配置菜單,其中列出了內(nèi)核所能提供的全部功能,如果你在選項(xiàng)前選則*號,那么該選項(xiàng)被編譯到內(nèi)核中,如果選m則被編譯為模塊,對于你不清楚的選項(xiàng)可以使用?查看其解釋。除了用make meunconfig外你有復(fù)古情節(jié)的話,可以試試使用make config,它完成同樣的功能,不過你得有足夠得耐心去忍受刷平一樣得命令行選擇<y><n> 。如果你在x環(huán)境下(桌面環(huán)境)不妨可以使用make xconfig配置,它相比前兩種方法得好處就試比較容易看清楚,對眼神不好得網(wǎng)友建議使用它。保存內(nèi)核配置后,就執(zhí)行 make dep /*確保所有的相依關(guān)系,例如 include files 都沒問題.除非你的電腦真的很慢,否則它不會花太久時間的*/ make clean ?/*清除核心編譯的所有目的檔以及其它東西.在重建一個核心之前不要忘記這個步驟*/make bzimage 或zimage/*編譯內(nèi)核——bz和z格式內(nèi)核之間******的差別是對于內(nèi)核體積大小的限制。zimage內(nèi)核需要放在實(shí)模式1mb的內(nèi)存之內(nèi),其體積受到了限制。而bzimage的內(nèi)核沒有1mb內(nèi)存限制*/ 記住內(nèi)核編譯完了,還必須再編譯模塊, 即使您在配置內(nèi)核時沒有使用任何模塊,也不要跳過此步驟,在編譯完 bzimage 后立刻編譯并安裝模塊是個好習(xí)慣。而且,如果您真的沒有模塊需要編譯,這個步驟也非??炀徒Y(jié)束了。 make modules; /*編譯內(nèi)核模塊,凡是配置內(nèi)核時標(biāo)記為m功能都將被編譯未模塊*/make modules_install。/*這將導(dǎo)致模塊被編譯而且被安裝到 /usr/lib/<內(nèi)核版本號> 目錄下。不過如果你想改變內(nèi)核鏡像或模塊的所在目錄,都可以通過修改內(nèi)核源碼中的makefile文件來達(dá)到,比如修改install_mod_path來改變模塊安裝目錄*/ 等黃蜂一樣的字符風(fēng)暴再屏幕上停止后,你現(xiàn)在擁有了新內(nèi)核了。它藏在內(nèi)核源碼目錄下arch/i386/boot下叫bzimage或zimage。新內(nèi)核隨帶的模塊被安裝到了lib下的modules目錄中。組建文件系統(tǒng) 組建根文件系統(tǒng)說白了更簡單,一來格式化文件系統(tǒng)的宿主設(shè)備,二來就是拷貝需要的文件。簡單明了吧!我們先來一同拷貝文件吧,等考完了再談宿主設(shè)備的問題,別忘了我們可都是完空手套百狼呀!(除了拷貝文件外,更標(biāo)準(zhǔn)的方法是下栽各種工具包,在本地交叉編譯,在進(jìn)行安裝,不過為了省事,我們采用拷貝標(biāo)準(zhǔn)系統(tǒng)文件的方法來構(gòu)造文件系統(tǒng),不但方便而且異曲同工。但前提是新系統(tǒng)體系結(jié)構(gòu)——處理器——和我們原料系統(tǒng)一致,如果你想在0x86系統(tǒng)上編譯運(yùn)行在arm機(jī)上的文件系統(tǒng),那么最好是去下載源代碼包重新交叉編譯吧)   |
<< Linux 串口截止閥的分類以及特點(diǎn) >>