獨(dú)家揭秘Linux內(nèi)核棧:內(nèi)核態(tài)的奇妙之處和與用戶態(tài)的差異
理解Linux內(nèi)核棧可以從以下幾個(gè)方面來考慮:
內(nèi)核態(tài)與用戶態(tài):在閱讀Linux內(nèi)核及相關(guān)資料時(shí),需要明確它所描述的是內(nèi)核態(tài)還是用戶態(tài)的內(nèi)容。這有助于理解所討論的是在哪個(gè)執(zhí)行環(huán)境下進(jìn)行的操作。
進(jìn)程與線程的描述:用戶態(tài)的進(jìn)程和線程在內(nèi)核中都使用一個(gè)task_struct結(jié)構(gòu)實(shí)例進(jìn)行描述。類似于設(shè)計(jì)模式中的橋接模式(handle-body),用戶態(tài)所看到的進(jìn)程PID和線程TID可以視為handle,而task_struct就是body。
堆和棧的用戶態(tài)概念:C語(yǔ)言書籍中對(duì)堆和棧的大部分討論都是針對(duì)用戶態(tài)的概念。用戶態(tài)的堆和棧對(duì)應(yīng)于用戶進(jìn)程虛擬地址空間中的某個(gè)區(qū)域,棧向下增長(zhǎng),堆通過malloc分配,向上增長(zhǎng)。
用戶空間堆棧的描述:用戶空間堆棧在task_struct->mm->vm_area中進(jìn)行描述,它們都屬于進(jìn)程虛擬地址空間的一個(gè)區(qū)域。
內(nèi)核態(tài)的棧描述:內(nèi)核態(tài)的棧描述在task_struct->stack中,棧的底部是thread_info對(duì)象。通過thread_info對(duì)象可以快速獲取task_struct對(duì)象。整個(gè)棧區(qū)域通常只有一頁(yè)內(nèi)存(可配置),在32位系統(tǒng)中為4KB。
進(jìn)程的內(nèi)核棧:因此,進(jìn)程的內(nèi)核棧也是進(jìn)程私有的,只需從task_struct->stack獲取即可。
內(nèi)核態(tài)的堆概念:內(nèi)核態(tài)沒有進(jìn)程堆的概念,內(nèi)存分配使用kmalloc()函數(shù),實(shí)際上是由Linux內(nèi)核統(tǒng)一管理的。一般情況下,使用slab分配器,它是一個(gè)內(nèi)存緩存池,管理所有可通過kmalloc()分配的內(nèi)存。因此,從原理上看,在Linux內(nèi)核態(tài),kmalloc分配的內(nèi)存可以被所有運(yùn)行在Linux內(nèi)核態(tài)的任務(wù)訪問到。
通過以上解析,我們可以更好地理解Linux內(nèi)核棧及其與用戶態(tài)堆棧和內(nèi)核態(tài)堆的區(qū)別與聯(lián)系。
剛好,我這里有上位機(jī)入門,學(xué)習(xí)線路圖,各種項(xiàng)目,需要留個(gè)6。