佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 7644|回复: 86

Linux 開機流程(x86版)

[复制链接]
发表于 19-4-2009 05:07 PM | 显示全部楼层 |阅读模式
(一)

Linux開機流程?這有什麼好說的?啊不就是按poweron的按鈕,然後就會在螢幕上出現一堆黑黑白白花花綠綠的訊息和圖示,最後出現要求登入的畫面,只要把usernamepassword都打對就可以登入linux了,之後就可以為所欲為啦

不是啦,各位有沒有想過在以上所描述的整過程當中,您的電腦和Linux作業系統做了什麼壞事,喔不,是做了哪些事情讓您可以進入一個可供作業的系統之中呢?而筆者今天所要介紹的就是在這整個從系統供電開始一直到使用者登入時,電腦和Linux作業系統做了哪些事情,讓對於了解系統有興趣的網友可以稍微了解一下這一個完整的程序為何。
   
然而這個課題可以很粗淺,也可以很深入。所以我打算分兩個部份來說明,先是初淺地交待整個流程,再來才比較深入地了解這整個流程中比較細部的程序為何。



在開始進入正題以前,我習慣讓大家先思考一下,既然主題是系統開機流程,不妨先思考一下,系統開機,需要做哪些事情,才能讓我們這些使用者有一個可供作業的操作環境。
  • 首先,電腦一定是好的啊,也就是說電腦硬體沒有問題,否則不是做白工了嗎?所以希望我們的電腦自已就能先幫笨笨的我檢查一下系統是否可以工作。
  • 嗯,好,電腦硬體沒有問題。那麼再來就是軟體了。什麼?還沒到軟體出場喔?        因為啊,雖然硬體沒有問題,但既然是開機嘛,還要初始化 (Initialization)一下…
  • 再來就該是軟體初始化了,我這麼聰明可以舉一反三。什麼?又錯了…當然啦,沒有找到軟體,是要怎樣叫軟體初始化啊 Orz  找到了他(軟體),還要叫他來做事情啊(他不可以是soho族嗎?)
  • 軟體的初始化,軟體自己要知道初始化的順序和部份有哪些,如果由使用者來指定,就太麻煩啦…想像一下開機開一半,作業系統還要求您選擇要做初始化的軟體有哪些…這就太白目了
  • 建立一個完整的操作環境
  • 等待使用者登入
  • 檢查使用者是否合法(偷渡客與狗禁止入內)

   好了,現在對於大至上對於系統開機,需要做哪些事情,才能讓我們這些使用者有一個可供作業的操作環境已經有個譜了。再來就可以開始介紹這些過程之中做了哪些事情。慢著,先想像一下,當一個企業要開一個新專案時會怎麼做?首先大老板會找總經理,叫到他的office開始劈哩叭啦地吹棒他的新計劃新理念有多麼地棒,然後交待經理確實執行,並在什麼時候要看到產品上市。這…跟開機流程有關係嗎?難不成開不了機可以去找大老板還是總經理嗎?當然有關係啦…什麼關係呢?就請看下去就對了唄O(≧▽≦)O

[ 本帖最后由 詩魂 于 20-4-2009 12:28 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 19-4-2009 05:08 PM | 显示全部楼层
(二)



如果我們開機開一半才發現這個不能用,那個壞掉了,心裡一定很:@,所以我們會希望電腦開機在最開始時可以幫忙做個初步的檢查,例如吸屁優有沒有壞掉,煮雞板是不是因為電壓不穩,早就燒掉了,還有DIMM有沒有確實插入啊(這不是黃色小說,不要亂想)…等等…

所以系統供電以後,確定煮雞板(mainboard,又稱motherboard)各部件電壓沒問題後,由於記憶體已被自動清零,CPU此時是無法獲得指令的,在這個momentCPU這個大老板只要知道找他的總經理就對了。老板不必知道完成這個專案需要找誰來負責當專案經理,找哪些團隊來負責產品設計等等比較細部的事情,他只知道找經理就對了啦…所以在我們的電腦系統,CPU在一開始誰也不認識,但他知道經理是誰,在哪。為什麼他會知道呢?因為內定啊!!

在我們的電腦系統中扮演總經理角色的就是BIOS。所以其全名就是『基本上(Basically)決定員工進來(getIn)還是滾蛋(getOut)Supervisor 不是啦(雖然有時算是),這裡的BIOS指的是BasicInput OutputSystem,他在最初始的任務是提供CPU所需的啟動指令,還記得剛才說的,怎麼找到BIOS?沒錯,就是內定。電腦開發者預先編好了供系統啟動使用的啟動程式,把它們存放在ROM中,並安排它到一個固定的位置,即FFFF:0000CPU就從BIOS中獲得了啟動所需的指令集。

评分

参与人数 1人气 +5 收起 理由
q(T_T)p + 5 谢谢分享

查看全部评分

回复

使用道具 举报

 楼主| 发表于 19-4-2009 05:09 PM | 显示全部楼层
(三)



BIOS中啟動程式的第一個任務就是系統給電後的自檢(POSTPower-On Self Test),它是一個專門的程式,BIOS被執行以後會先執行它,而POST會做哪些事情,讀者可參考:http://www.ns-bbs.com/teach/list.asp?id=75
然後是對系統內的硬體設備進行檢查和連接,並把測試後取得的資料存放到BIOS資料區,以便作業系統在啟動時或啟動後使用。此外,BIOS還提供一組中斷讓硬體能夠被存取使用。

再來呢,BIOS會根據使用者設定的開機順序寻找開機磁區(bootsector)。同樣地,BIOS怎麼知道開機磁區位於哪裡呢?答案也是內定的。在我們的儲存媒介例如硬碟或者早期在用的軟碟,有個專門放置開機資訊的地方,叫做MBR(Master BootRecord),而這裡放置的往往就是所謂的開機引導程式(BootLoader)。事實上,BIOS無法幫我們決定要從哪開機,要專入哪些軟體。所以就根據使用者設定的開機順序去找該磁碟的MBR,這個MBR一般就位置磁碟的第一個Sector,也只有一個sector,所以大小是512B,這時將執行權交給MBR裡的bootloader。若是可開機(bootable)軟碟(Floopy)一般只會有一個作業系統,MBR所以裡面放的就是/usr/src/linux/arch/i386/boot/bootsect.S(新版應把i386改成x86),由這支程式決定要載入後續哪些程式;後續的這些程式包括要做初式化以及載入核心的Assemblycodes

在開機期間有幾個很重要的Assemblycodes,包括/usr/src/linux/arch/i386/boot/bootsect.S/usr/src/linux/arch/i386/boot/setup.S/usr/src/linux/arch/i386/boot/compressed/head.S。請注意,不同版本的kernel,其路徑可能稍有不同。以下分別介紹這幾支程式的工作。
回复

使用道具 举报

 楼主| 发表于 19-4-2009 05:09 PM | 显示全部楼层
(四)


如前文所說的,bootsect.S這支程式往往擺在MBR裡頭。往往,那就是說也有例外囉…沒錯,您真聰明,由於一顆硬碟裡可以安裝不只一個作業系統,例如最常見的windowsLinux共存,一般我們都會在安裝Linux的同時安裝Lilo或者GRUB,所以BIOS完成自檢以後,去MBR找的程式可能不是bootsect.S而是GRUB,由GRUB完成bootsect.S的工作或者由GRUB去執行bootsect.S。這就是LinuxBootLoader。它的主要作用就是將系統啟動程式讀入記憶體中並把控制權交給它。

當我們完成Linuxkernel編譯後,就獲得一個新的核心映射,BootLoader就放在核心映射檔的開始處。當BIOSBootSector找到BootLoader後,將BootLoader讀入至記憶體中物理位址0x07c00處,而後將控制權轉給BootLoaderBootLoader再把自己從地址0x07c00移到0x90000

其後還會處理一系列工作以後,再載入Setup.S。然後程式的執行權也轉交給Setup.S,而它的主要工作是把剛才BIOS檢查完系統後保存的系統參數,放在0x90000~0x901FF這個記憶體區間。然而它會執行Vedio.S,檢查並設定一些有關於螢幕的設定和設定模式。此外還包括像鍵盤,PS/2滑鼠等。最後它要讓系統進入保護模式,以實現多工的能力。

之後跳轉到0x100000的位置,執行head.Sstartup_32head.S的主要任務是要解壓縮kernelimage。由於現在kernel的功能越來越強大,所以檔案大小也相對大了許多,所以一般會經過壓縮,當開機待載入核心時,再透過解壓縮程式把它還原回原來的大小。如果kernel是放0x00001000處,在decompress時會直接解壓縮到0x00100000。如果kernel是放在0x00100000處,在decompress時會先解壓縮到暫時的buffer空間,即目前compressedkernel image後的(0x00100000+ bzImage size),再將之移動到0x00100000
回复

使用道具 举报

 楼主| 发表于 19-4-2009 05:10 PM | 显示全部楼层
(五)

完成以後,再跳轉到main.cstart_kernel()中。呼,總算開始進入C語言函式了,但也別高興得太早,因為這部份也很複雜。這時候的主要任務是要對核心做一系列的初始化。我們先不介紹這部份,待下一個階段再來介紹這部份初始化了哪些程序。

初始化結束以後,就進入我們比較熟悉的INIT階段。好,讓我們喘口氣,喝口茶…基本上,把前面介紹的都忘了也沒關係,因為後面的部份跟使用者比較有直接的關係。直到這個階段,基本的Linux核心環境已經建立起來了。在start_kernel()的最後,通過呼叫init()函數,系統創建第一個核心線程,啟動了init過程。init()主要進行了一些外部設備初始化的工作的,包括呼叫do_basic_setup()完成外部設備及其驅動程式的載入和初始化。再來是完成檔案系統初始化和root檔案系統的安裝。之後,init()使用execve()系統呼叫載入執行init程式。到此init()函數結束,Kernel的引導部分也到此結束了。

Ini的行程號碼是1,它是系統所有行程的起點,然後它還需要讀取配置檔/etc/inittabinittab是一個不可執行的文字檔案,等等…什麼我騙人?你在ubuntu找不到/etc/inittab?哈,真是誤會一場。原來,在ubuntu是找不到/etc/inittab的,那ubuntu要怎麼設定runlevel之類的東東呢?答案是,它把inittab分散在/etc/event.d裡。

Inittab主要設定了runlevelaction運行方式,process等。這裡暫不細談inittab的內容,留待之後說明。然後它會呼叫/etc/rc.d/rc.sysinitrc.sysinit是一個bashshellscript它主要是完成一些系統初始化的工作它主要完成的工作包括:啟動交換分區,檢查磁碟,載入硬體
模組以及其他一些需要優先執行的任務等。同樣的,細部的內容留待之後才說明。這裡先有個概念就好。
回复

使用道具 举报

 楼主| 发表于 19-4-2009 05:10 PM | 显示全部楼层
(六)


rc執行完畢後,返回init。這時基本系統環境已經設置好了,各種守護行程也已經啟動了。init接下來會打開6個終端,以便用戶登錄系統。通過按Alt+Fn(n=1~6)可以在這6個終端中切換。在inittab中還會指定運行tty的方式,例如mingetty程式,以打開終端、設置模式。然後它會顯示一個登錄介面,這個介面就是我們開機完看到的登錄介面,在這個登錄介面中會提示使用輸入用戶名,其將作為參數傳給login程式來驗證使用者身份,看這個使用者是偷渡客還是合法的使用者。

看到這裡,相信各位己經建立初步的Linux啟動流程的概念了。什麼?您已經睡著了,不怪您,因為我也寫到睡著了,等等要偷睡一下才行

值得注意的是,不同版本的Linuxkernel,其細部內容會稍微不同。所以我傾向講訴的是開機的方法和流程,而不是原始碼。對於kernel原始碼有興趣的朋友可自行參考/usr/src/linux-xxx(核心版本)。然而Linuxkernel有大約百分之十左右的assemblycode,若要Tracecode,還需要了解X86assemblerprogramming才行。
回复

使用道具 举报

Follow Us
发表于 19-4-2009 07:30 PM | 显示全部楼层
霸位霸位~~
我是你的忠实“帖迷“
回复

使用道具 举报

 楼主| 发表于 19-4-2009 09:28 PM | 显示全部楼层
(七)

這時大家對於Linux開機流程己經有了初步的認識,對於一般使用者其實己經足夠。因此,若有興趣者才有再看下去的必要,因為接下來會對前文的內容做進一步的探討,會更加枯燥乏味。但本文也不傾向對每個細節都一一交待清楚,只對重要的部份做進一步的說明。

(一)Bootsect.S
前文已說明這個程式就是linuxPc的bootloader。它的主要任務就是決定載入後續哪些程式;後續的這些程式包括要做初式化以及載入核心的Assemblycodes。



上圖為這幾個重要的assemblycode的記憶體配置圖。左邊為LinuxKernel的映象檔,位於檔案最上方為bootsect.S,大小為512B。其結尾為0xAA55的標籤。因此BIOS便可據此找到MBR內的bootloader內容,然後把它載入如右圖所示的0x00007C00。把執行權交給 bootloader後,它會把自己載 入到0x00090000。接著呢,它會把下一個要執行的程式:setup.S載到0x00090200處,換句話說 ,它setup.S載到bootloader的接續空間(bootloader=512B = 0x200)也就是0x00090000+0x200處。而setup.S則佔據4個sector的大小。

接著設定Real-modestack 在0x00098000處,還有就是把壓縮過的kernel載到0x00100000的位置。載入的動作都完成後,接著就跳轉到setup.S的位置去執行它,以便執行一些初始化的動作。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 19-4-2009 09:31 PM | 显示全部楼层
(八)


                                                                ()setup.S


如前所述,setup()函數被Linker放在核心映射檔中的0x200偏移處。它的主要任務為初始化電腦中的硬體設備並為核心程式的執行建立環境。首先,它通過BIOS中斷獲取記憶體容量資訊,設置鍵盤的回應速度,設置顯示器的基本模式,獲取硬碟資訊,檢測是否有PS/2滑鼠等等操作,都是在386RealMode下進行。而後才準備讓CPU進入保護模式了。

這時別忘了先把中斷信號masked掉,否則,系統可能受到中斷信號的干擾而陷入不可知狀態。然後呼叫作業系統指令lidtlgdtIDT是中斷向量表,而GDT是全局描述符表。此時的中斷描述符表放置的就是開機時由BIOS設定的那張表。

完成一系列對硬體 設 備的初始化動作以後 ,即跳轉到startup_32()函式:jmpi 0x100000, __BOOT_CS,進入核心Head.S
回复

使用道具 举报

 楼主| 发表于 19-4-2009 09:36 PM | 显示全部楼层
(九)

()arch/i386/boot/compressed/head.S

為什麼要叫head.S?我想,大概是因為它是屬於Kernel最前面部份的程式,也就是說它是進入核心時要執行的第一個程式。還記得前面前經提過嗎,Linux核心是經過壓縮過的壓縮檔,在執 行以前會先做解壓縮,然後再置於記憶體中。於是head.S也有兩套,一個是在解壓縮以前的kernel中的head.S,另一個則是解壓縮後的kernel裡的head.S

由此可見,自然是先執行解壓縮前的head.S。也因此我們會看到兩個不同的startup_32()函式,一個在arch/i386/boot/compressed/head.S檔中,在setup結束以後,該函數被放在0x00001000或者0x00100000位置,其主要的任務描述如下:
  • segment register和臨時的stack做初始化。由於剛剛進入保護模式,六種Segment   Register,只有CS有初始化(讀者可參考setup.S程式),所以還須將DSESFSGSSS也初始化,程式才能正常運作。
  • 清除eflags register的所有bits
  • _edata_end區間的所有核心未初始化區填0 (有關Linker定義,讀者可下指令:ld        –verbose 做參考)
  • 呼叫decompress_kernel()函式解壓Linux Kernel Image。也就是說 ,呼叫misc.c檔中decompress_kernel函式將Linux Kernel Image解壓縮。所以開機時,我們會看到類 似"Uncompressing Linux...",待解壓完成後將顯示 "OK, booting the kernel."。核心解壓後,如果在低地址載入,則放在0x00100000位置;否則解壓後的映射先放在壓縮映射後的臨時暫存器裏,最後解壓後的映射被放置到實體位置0x00100000處;
  • 跳轉到0x00100000實體記憶體處執行;


[ 本帖最后由 詩魂 于 19-4-2009 09:41 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 19-4-2009 09:37 PM | 显示全部楼层
(十)

()arch/i386/kernel/head.S
解壓後要執行的是位於arch/i386/kernel/head.S檔中的startup_32()函式,其主要的操作任務如下:
  •         對一系列的register        例如DSESFSGS做初始化
  •         將核心的bss段填0
  •         初始化一些分頁表
  •         處理一系列register,中斷向量表等
  •          將從BIOS獲取的系統參數傳遞給Linux kernel
  •         檢查CPU類型
  •         跳轉到start_kernel函式,這個函式是執行kernel的第一個C函式

本階段其實是相當複雜的(大約500行的assemblycode),在此只節錄部份的操作任務,請有興趣了解其細部運作的朋友自行閱讀其原始碼。

[ 本帖最后由 詩魂 于 20-4-2009 12:30 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 19-4-2009 10:56 PM | 显示全部楼层
(十一)
()/usr/src/linux/init/main.c
這時已經進入系統 核心的C語言部份,別以為可以就此輕鬆,事實上這裡還是相當地複雜,同樣地,我也不打算全介紹,請有興趣了解其細部運作的朋友自行閱讀其原始碼。

從上一個階段以後,386處理器可說是完全進入了全面執行作業系統的狀態。接下來就要執行軟體部份,也就是作業系統相關的初始化了。首先執行start_kernel(),它主要用於對處理器、記憶體等最基本的硬體相關部分做初始化,例如處理器的類型,記憶體所佔用的空間等等。

再來也“可能”呼叫到paging_init()(不同版本kernel可能稍微不同),把線性位址中尚未mappingphysicaladdress上的部分,用page機制來做mapping以完成page的初始化。然後就是對中斷向量表的初始化,trap_init();完成中斷向量表以後很自然地就是初始化中斷向量的函式們,呼叫init_IRQ()來完成。

然後就進行排程的初始化,sched_init()執行這個任務。time_init()對系統時鐘做初始化。parse_options()則解析開機時取得的一些參數。再來執行的console_init()還不是對tty做初始化,而kmalloc_init()檢查可用記憶體的大小。

接下來是跟檔案系統(filesystem)相關的初始化工作。例如inode_init()VFS的索引節點管理機制進行初始化,name_cache_init()則對VFS的目錄暫存機制進行初始化;Buffer_init()初始化bufferfree list的指標。

看到這裡,要不睡著也是很難的。好啦,接下來介紹的應該足以讓各位的精神為之掁奮。因為在start_kernel()的最後部份就是建立init行程。這個行程是Linux的第一個行程,也是其他所有行程的父行程。在建立起init行程之前,首先試著去找“/sbin/init”,如果找不到,會去找“/etc/init”,再找不到就往“/bin/init”找。注意,這部份也是因kernel版本的不同而異。在執行etc/init時,會根據一些設定好的scriptfiles內容去呼叫一些重要的行程以完成一些必要的操作,例如檔案系統的檢查,啟動系統的守護行程,對終端機建立getty行程,最後再執行“/etc/rc”下的scriptfile

這個getty會等待使用者的登錄。使用者透過login登入系統,getty便呼叫exec執行login程式。Login程式會檢查user的帳號和密碼,如果密碼正確,便呼叫exec執行shellX-windows。然而執行user預設的系統環境檔,也就是home/username/.profile檔。

user登出之後,init行程要再重新啟動一個getty行程,讓其他user登錄。

[ 本帖最后由 詩魂 于 19-4-2009 11:19 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 19-4-2009 11:57 PM | 显示全部楼层
(十二)

較早之前我們曾提到etc/inittab/etc/rd.c/rc.sysinit。這些都是啟動Linux系統時會執行的scriptfiles。以下便針對這些部份做進一步的探討。

不知各位是否還記得在之前介紹如何製作LinuxLive USB時有提到過etc/inittab的內容:
::sysinit:/etc/rc.d/rc.sysinit
::askfirst:/bin/sh


但其實之前在製作LinuxLiveUSB,由於該系統較單純,所以inittab也相對簡單得多。它主要設定runlevel為何。系統會根據不同的開機級別(runlevel)來分配資源。主要分成7種級別(或許會改變)。由於這部份的說明相當豐富,所以建議各位上網搜索相關的文件。以下節錄來自http://163.23.79.65/html/techdoc/startup.htm 的內容,方便不便上網搜索相關的文件的朋友做參考:
RedHat run-level有以下7 定義在/etc/inittab)
  • 0        --- halt : 關機        level
  • 1        --- Single user mode : 單人模式,        如果你忘記        root 密碼,        這是補救的方式之一.        
  • 2        --- Multiuser, without NFS : 多人使用模式,        但沒有 NFS        功能,        如果安裝時沒有使用網路功能,        那麼 level        3 是一樣的.        
  • 3        --- Full multiuser mode : 這是預定的        run-level
  • 4        --- unused : 這個        run-level        目前尚未定義使用        
  • 5        --- X11 : X Windows 使用的        level
  • 6 --- reboot :        重新開機時使用的        level
Linux 系統開機時,最重要的觀念便是這個run-level ,run-level 可以說是Linux的系統狀態(systemstates of Linux), 根據不同的情況進入不同的系統狀態,以執行不同的初始化動作.
另外一點,Linux 雖然融合了System V BSD 的特色,但在開機起動的部份,比較接近System V 的作法,並且這種方式幾乎已成為Linux 世界的一項標準.因為它具有容易使用,功能強大以及富有彈性的特色.
其目錄檔案結構如下:
/etc/rc.d
中包含:        
                                
目錄
                        
                                
script 檔案
                        
                                
  • /etc/rc.d/init.d
  • /etc/rc.d/rc0.d
  • /etc/rc.d/rc1.d
  • /etc/rc.d/rc2.d
  • /etc/rc.d/rc3.d
  • /etc/rc.d/rc4.d
  • /etc/rc.d/rc5.d
  • /etc/rc.d/rc6.d
                        
                                
  • rc
  • rc.local
  • rc.sysinit
                        
rc0.d 便是run-level 0 起動script 存放的目錄,rc3.d run-level 3,其它依此類推
不過,rc0.d ~ rc6.d 中的script並不是各自獨立的,其實它們都是symbolic file,連結到/etc/rc.d/init.d中的 script.
回复

使用道具 举报

 楼主| 发表于 19-4-2009 11:59 PM | 显示全部楼层
(十三)

Example:
#Runxdm in runlevel 5
x:5:respawn:/usr/bin/X11/xdm-nodaemon


接下來探討inittab的格式及格式的意義為何:

格式:
id:runleveld:action:process

意義:
id
代表由幾個字元所組成的識別字。

Runlevels
說明action以及process會在哪些runlevel中被執行,合法值為012...6s以及S

Action
呼叫行程時,對行程所採取的應答方式,計有:
initdefault:指出系統在啟動時預設的runlevel。例如系統在啟動時,進入runlevel3的模式。如果把3改為5,那將會執行/etc/rc.d/rc.5,也就是X-Window
sysinit:在系統啟動時,一定要執行的行程。而所有的inittab的行中,如果它的action中有bootbootwait,則該行必須等到這些actionsysinit的行程執行完之後才能夠執行。
wait:在啟動一個行程之後,若要再啟動另一個行程,則必須等到這個行程結束之後才能繼續。
respawn:代表這個process即使在結束之後,也可能會重新被啟動,如剛才介紹的getty

inittab一般會看到:
#Systeminitialization.
si::sysinit:/etc/rc.d/rc.sysinit
它是系統無論進入到哪個級別,都必須執行/etc/rc.d/rd.sysinit
它主要的任務包括:檢查檔案系統,設置硬體設備,檢查並載入模組。完成後會回到inittab,根據inittab所設定的runlevel去執行/etc/rc.d目錄下的對應的rc檔。也就是說當runlevel=3,對應的rc檔即為rc.3。這會根據不同的啟動程式去初始化各個runlevel的系統環境,包括啟動系統的守護行程。最後init行程將執行getty行程,等待user登錄,整個Linux的開機流程就到此結束。




[ 本帖最后由 詩魂 于 20-4-2009 12:10 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 20-4-2009 12:17 AM | 显示全部楼层
(十四) 結語



筆記是最好的記憶。還記得當初在學習這部份時是幾年前的事情了,當時的kernel版本還是2.4.x,所以這篇文章難免出現過時的資訊,而且整個開機流程並不是文中所述這般簡單,而這篇文章的宗旨是在於提供有興趣者一個參考的方向,其細部的探討還是要回歸到Linux的原始碼閱讀。

在開始看原始碼之前,我建議您先從makefile看起。同時在您的linux系統查看/var/log/dmesg,先大致了解一下流程,待心裡有個譜以後再看原始碼,才不至於迷路
回复

使用道具 举报

 楼主| 发表于 20-4-2009 12:18 AM | 显示全部楼层

回复 7# qwe88 的帖子

謝謝您
希望不會誤人子弟
回复

使用道具 举报


ADVERTISEMENT

发表于 22-4-2009 08:14 AM | 显示全部楼层
看到我@@头晕~

真的非常非常谢谢楼主。。 

可惜我看来看去还是不明白。。 我再从读过。。 
回复

使用道具 举报

发表于 22-4-2009 02:41 PM | 显示全部楼层
作业系统区的精品啊。。。这个帖估计我要看很多次才能吸收。。。
回复

使用道具 举报

发表于 22-4-2009 07:09 PM | 显示全部楼层
小弟拿P3 128 ram 的旧电脑灌utunbu,可用,但很慢,给一个指令要等几秒,是否还可优化?
还是因为ram太小就是这样慢。
回复

使用道具 举报

 楼主| 发表于 22-4-2009 11:06 PM | 显示全部楼层

回复 17# intelp 的帖子

也可能是我表達得不夠好
我建議您看1~6就好

我的看法是,desktop user, 系統管理者,
了解1~6即可,但系統管理者最好也看一看11~13

而系統開發者,7~13都要會,而且最好是懂得很細
而且一定要去trace code

總之,若非必要的話,您不必需要看懂也沒關係
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 22-12-2024 07:22 PM , Processed in 0.169468 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表