- 論壇徽章:
- 59
|
回復(fù) 1# gqbfree
沒看內(nèi)核代碼,能回答的回答吧
有幾個問題不懂,請大家?guī)兔獯。查了很多資料,但前篇一律,中間很多疑點只能靠自己理解,怕有誤:
(1)內(nèi)核線性映射是896M,而且對應(yīng)的物理地址已經(jīng)確定,是0-896M。 那么用戶進程空間分配地址的時候是不是優(yōu)先考慮大于896M的物理地址頁面?
>>Windows 98將內(nèi)核Map到所有進程中,但這不表示所有的OS都會這樣做,內(nèi)核并不從用戶程序更加特別(從CPU的角度看),CPU甚至不會知道當(dāng)前運行的是用戶代碼或是內(nèi)核代碼(當(dāng)然,一般來說,內(nèi)核可以執(zhí)行特權(quán)指令,而用戶代碼不可以,不過,如果OS的設(shè)計者喜歡的話...)。
(2)有沒有大俠幫忙把一個進程可能有的vm_area_struct結(jié)構(gòu)對應(yīng)的段列舉一下,比如堆棧對應(yīng)一個vm_area_struct(是不是只對應(yīng)一個?)堆對應(yīng)一個,代碼段對應(yīng)一個,還有mmap啥的 等等。還有malloc時,是否有新的vm_area_struct生成呢?還是擴展堆對應(yīng)的vm結(jié)構(gòu)?
>>沒看過內(nèi)核,無法回答,從系統(tǒng)設(shè)計的角度看,這種結(jié)構(gòu)應(yīng)當(dāng)只有一個。
(3)發(fā)生缺頁異常時,如果需要從磁盤上把相應(yīng)的內(nèi)容讀進內(nèi)存,那么如何定位需要讀入哪些內(nèi)容?我知道 vm_area_struct結(jié)構(gòu)里有對應(yīng)文件的句柄和offsize,需要把整個都讀進來嗎?還是只讀一個頁面?如何確定讀多少?
>>一般的OS都會有預(yù)讀功能,所以會一般也會讀入相鄰的頁面,讀交換頁是通過文件系統(tǒng)進行的,如果把整個分頁文件都讀進入,內(nèi)存足不足夠不用說,分頁的意義也沒有了。
(4)能不能提供以下情形: 只有preem_disable能實現(xiàn),而信號量無法實現(xiàn)的情形。(premm_disable主要用在哪里)
>>PV信號量、Spin_lock、或是Preem_disable的任何一種互斥方式,都可單獨實現(xiàn)所有功能(區(qū)別僅是代價和實現(xiàn)難度)。
(5)幫忙確認(rèn)一下我自己理解的觀點是否正確:
1. 用戶空間 切 內(nèi)核空間,壓當(dāng)前的用戶空間的ss,sp入內(nèi)核棧,然后取值TSS中的ss0/sp0賦給SS,ESP,完成切換; 然后把返回值cs/eip和其它一些現(xiàn)場寄存器壓入內(nèi)核棧(即pt_regs)。(很多資料都寫先賦值SS,SP,然后壓用戶空間的ss,sp入內(nèi)核棧, 我疑問此時的ss/sp從哪里來啊,還有pt_regs是不是只是用來存儲用戶空間時寄存器內(nèi)容的?有沒有情況是對內(nèi)核現(xiàn)場存儲?)
>>當(dāng)前的SS,SP沒有入內(nèi)核棧的必要的,不過,非要這樣做也可以
>>用戶態(tài)的ss/sp本來就有的...據(jù)說Linux不使用X86CPU的TSS,如何還有TSS,不懂中,什么時候看代碼去吧
>>內(nèi)核現(xiàn)場沒有存儲的價值,因為內(nèi)核不會從“上次的執(zhí)行點”開始執(zhí)行,如果非要說有(可能被其它內(nèi)核部件中斷),那么無論被中斷多少次,現(xiàn)場保存在當(dāng)前的用戶進程的內(nèi)核線程中...(就像是80x86是單程序環(huán)境中一樣),當(dāng)然,前提是內(nèi)核態(tài)代碼不應(yīng)當(dāng)被Swtch中斷(這樣也未必不可,只是系統(tǒng)變得更復(fù)雜了)。 |
|