讀《Linux 內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》
第二章 從內(nèi)核出發(fā)
內(nèi)核開(kāi)發(fā)特點(diǎn):
- 沒(méi)有l(wèi)ibc庫(kù)。 kernel是一個(gè)不依賴任何庫(kù)的,包括標(biāo)準(zhǔn)C函數(shù)庫(kù)。kernel中使用的一些常見(jiàn)函數(shù),比如memset, strcpy都是在kernel代碼中自己實(shí)現(xiàn)的。
- 請(qǐng)使用gcc來(lái)編譯內(nèi)核,因?yàn)閮?nèi)核中的代碼并不完全符合ANSI C的標(biāo)準(zhǔn)。
- 沒(méi)有內(nèi)存保護(hù),非法的內(nèi)存操作可能會(huì)使系統(tǒng)掛起。
- 不要使用浮點(diǎn)數(shù)
- 內(nèi)核棧容量很小( 2 * 頁(yè)面大小 )
- linux是搶占多任務(wù)操作系統(tǒng),進(jìn)程,內(nèi)核都可以搶占,而且支持多處理器,所以內(nèi)核代碼需要考慮并發(fā)和同步的問(wèn)題。
- 盡量要兼容所有架構(gòu)(arch),良好的移植性
第三章 進(jìn)程管理
內(nèi)存描述符及任務(wù)結(jié)構(gòu)
- 每個(gè)進(jìn)程都對(duì)應(yīng)有一個(gè)進(jìn)程描述符,即task_struct結(jié)構(gòu),用來(lái)記錄這個(gè)進(jìn)程的所有信息:打開(kāi)的文件,地址空間,進(jìn)程狀態(tài)……
- linux通過(guò)slab(個(gè)人感覺(jué)類(lèi)似于pool)分配task_struct。 進(jìn)程的task_struct指針存放在位于內(nèi)核棧底的一個(gè)叫做thread_info的結(jié)構(gòu)里面。
- 內(nèi)核通過(guò)PID來(lái)標(biāo)識(shí)進(jìn)程,默認(rèn)設(shè)置最大值,即默認(rèn)系統(tǒng)最大進(jìn)程數(shù)為32768。內(nèi)核中一般通過(guò)current宏來(lái)獲的當(dāng)前進(jìn)程的task_struct,不同的體系架構(gòu)下,實(shí)現(xiàn)方法可能會(huì)不同。
- 進(jìn)程狀態(tài),可以通過(guò)set_task_state來(lái)設(shè)置
- TASK_RUNNING 進(jìn)程可執(zhí)行;它正在運(yùn)行,或者是在任務(wù)隊(duì)列中等待被運(yùn)行。
- TASK_INTERRUPTIBLE 進(jìn)程可中斷;進(jìn)程被阻塞,但是可以通過(guò)信號(hào),或者其他方法喚醒。
- TASK_UNINTERRUPTIBLE 進(jìn)程不可中斷;進(jìn)程被阻塞,而且不受任何干擾,不會(huì)響應(yīng)信號(hào)而被喚醒。
- TASK_ZOMBIE 進(jìn)程僵死;進(jìn)程已經(jīng)運(yùn)行完畢,但是父進(jìn)程沒(méi)有調(diào)用wait4系統(tǒng)調(diào)用,此時(shí)子進(jìn)程的task_struct保留,等待父進(jìn)程查詢相關(guān)信息。【Agaric:相似的,在windows上,進(jìn)程的HANDLE通過(guò)(CreateProcess或者OpenProcess得到) 在程序運(yùn)行完畢后,在CloseHandle 前,也是仍然有效,用于查詢進(jìn)程相關(guān)信息,比如Exit code 等等】
- TASK_STOPPED 進(jìn)程停止;
- 進(jìn)程上下文: 進(jìn)程通過(guò)系統(tǒng)調(diào)用或者異常陷入內(nèi)核,此時(shí)內(nèi)核是"代表進(jìn)程"在工作,這個(gè)工作環(huán)境,叫做進(jìn)程上下文,內(nèi)核程序可以通過(guò)宏來(lái)獲的當(dāng)前進(jìn)程的task_struct
- 進(jìn)程家族樹(shù): 除了init,每個(gè)進(jìn)程都有父進(jìn)程, 每個(gè)進(jìn)程都可能有子進(jìn)程及兄弟進(jìn)程。
(待續(xù))
posted on 2008-03-06 00:00 菌子 閱讀(1805) 評(píng)論(7) 編輯 收藏 引用 所屬分類(lèi): 讀書(shū)