第一遍看書時(shí)不明白,今天偶然又看到了這一點(diǎn),頓時(shí)豁然開朗
linux0.12系統(tǒng)中共用了四種堆棧
1. 系統(tǒng)引導(dǎo)初始化時(shí)臨時(shí)使用的堆棧,此時(shí)我的理解是系統(tǒng)還在實(shí)模式
2. 進(jìn)入保護(hù)模式之后提供內(nèi)核程序初始化使用的堆棧,位于內(nèi)核代碼地址空間固定位置處,該堆棧也是后來任務(wù)0的用戶態(tài)堆棧,個(gè)人理解任務(wù)0比較特殊,它的內(nèi)核態(tài)堆棧還是用戶
態(tài)堆棧都在內(nèi)核中。
3. 每個(gè)任務(wù)通過系統(tǒng)調(diào)用,執(zhí)行內(nèi)核程序時(shí)使用的堆棧,我們稱之為任務(wù)的內(nèi)核態(tài)堆棧,每個(gè)人物都有自己的內(nèi)核態(tài)堆棧,內(nèi)核態(tài)堆棧是和任務(wù)數(shù)據(jù)結(jié)構(gòu)一起定義
4.任務(wù)在用戶態(tài)執(zhí)行的堆棧,位于任務(wù)邏輯地址空間的末端處。
以前有一段時(shí)間還懷疑過linux0.12中內(nèi)核態(tài)堆棧和內(nèi)核堆棧是不是一個(gè)東西,現(xiàn)在我可以很自信的說,這兩個(gè)是一個(gè)東西。
下面說下任務(wù)的堆棧,說的都是在linux0.12中的情況
每個(gè)任務(wù)(除了任務(wù)0和任務(wù)1)有自己的64M地址空間,當(dāng)一個(gè)任務(wù)剛被創(chuàng)建時(shí),它的用戶態(tài)堆棧指針被設(shè)置在起地址空間的靠近末端(64M頂端)部分。實(shí)際上末端部分還要包括執(zhí)
行程序的參數(shù)和環(huán)境變量,然后才是用戶的堆棧空間。說到這里的參數(shù)和環(huán)境變量聯(lián)想《自己動(dòng)手寫操作系統(tǒng)》和《程序員的自我修養(yǎng)》c語言mian函數(shù)的執(zhí)行可看出,main函數(shù)
再被調(diào)用錢,堆棧上已經(jīng)壓入了main函數(shù)的參數(shù)。P181
每個(gè)任務(wù)的內(nèi)核態(tài)堆棧的初始化為
p->tss.esp0=PAGE_SIZE+(long)p;
p->tss.ss0=0x10;
可見每個(gè)任務(wù)(任務(wù)0和任務(wù)1除外)的內(nèi)核態(tài)堆棧是都是用的同一塊地址空間,所以應(yīng)該不支持內(nèi)核級(jí)的中斷。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
