linux為什麼需要核心棧,系統呼叫時直接使用使用者棧不行嗎?

時間 2021-05-31 18:13:53

1樓:海嶺洋脊板塊發散

來自 xv6 document

When changing protection levels from user to kernel mode, the kernel shouldn't use the stack of the user process, because it may not be valid. The user process may bemaliciousorcontain an error that causes the user %esp to contain an address that is not part of the process's user memory.

正好寫作業的時候碰到這題哈哈哈

2樓:ZengTM

個人理解:

根據核心函式、中斷處理函式的複雜程度和中斷數量(在linux中,每種型別interrupt只能nest一次)可以大概估計出kernel棧需要多大,如果按照題主的思路,在每個user棧的底部預留這個固定空間大小,則我可以把這個空間的頂部位址定義為kernel棧的起始位址。這樣看似乙個棧的實現方式也自然分成了兩個棧,最終殊途同歸。

當然如果不預留固定大小的空間則有可能由於user棧使用過多導致執行kernel函式時boom掉.....

3樓:唐浩然

題主所說的「核心棧」,嚴謹的說法應該是「程序的核心態堆疊」,因為每個程序都有自己的核心態堆疊。

為何使用使用者核心態堆疊:

1,多是安全原因 ,進入系統呼叫需要儲存使用者態執行時的暫存器資訊,(包括控制暫存器資訊 EFLAGS, 以及 cs/ip,)這些儲存在低許可權的使用者態堆疊,實在不安全。

2: 任務切換必須發生在核心態,在任務切換時,也需要使用使用者的核心態堆疊,來儲存使用者態時的暫存器資訊(包換使用者態堆疊指標)。 比如,最後將新任務的核心態堆疊中的儲存的上次切換時儲存的使用者態暫存器彈出,然後恢復新任務使用者態執行。

3: 還有注意到乙個特點, 每當使用者程式從使用者態進入核心態時, 使用者程式的核心態堆疊總是空的, 什麼內容也沒有,或許這可能也是從安全層面的考慮?

分割線補充:x86 架構上設計TSS(Task State Segment,TR暫存器對應),也為任務設計了多個執行級別的棧,也是為了讓 task 在不同的執行級別時使用不同的 stack, 並儲存切換前 stack的資訊,32位TSS結構 :

linux在系統呼叫進入核心時,為什麼要將引數從使用者空間拷貝到核心空間?不能直接訪問,或是使用memcpy嗎?非要使用copy from user才行嗎?

小呀小阿彭 在使用系統呼叫的時候要進行從特權級3到0的轉換在該轉換過程中 CPU會將事先放在tss中的 ss0 和esp0 賦予ss和esp暫存器這樣就造成了棧的變化通俗點說就是換了乙個棧而進行函式呼叫的時候pushl 指令是將引數從右到左依次壓入棧的此時的棧中的值在新棧中就沒有了因此就有了複製引數...

Linux為什麼不把所有位址空間都給核心呢?因為通過分頁機制,核心程序和使用者程序在物理空間上不會起衝突。

陳延偉 我想不太明白,直接對映難道不需要頁表查詢嗎?對映的意義不就是在於實體地址和虛擬位址間的轉換嗎,轉換過程不需要頁表嗎,如果沒有頁表的話,核心要對記憶體進行位元組操作? fumin 借linux核心設計與實現一書的解釋 linux的物理記憶體分三區,zone dma 能用於dma的 zone n...

為什麼Linux系統比Windows快?

葛雨 你挖一下微軟的核心就會發現了,它的核心也是posix的,但是那是乙個開放的體系啊,與微軟的理念不和,怎麼辦呢?一層層封裝唄,既然要封裝就要一次次的轉碼打包,這些當然要消耗計算資源了,那麼能感受到的就是 同樣做一件事,它比別人慢。而且,你能保證它沒夾帶私貨?所以啊,不是linux快,只是wind...