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

時間 2021-05-31 03:44:14

1樓:小呀小阿彭

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

2樓:原子筆

The Linux Kernel documentation

有這種api給你用。但是其實背後的代價和安全措施未必比拷貝小。看你怎麼定義代價。

3樓:

可以參考一下《freebsd設計與實現》中的「2.3 kernel services」這一section的給出的另外一種安全方面的考慮:即使通過了許可權檢查,也要防止在系統呼叫執行期間引數被其他程序修改從而繞過許可權檢查。

4樓:朱勇

在論壇裡問了一下,copy_from_user一方面是許可權的問題(檢查是否越界),另一方面是處理缺頁異常,要求訪問使用者空間的任何函式都必須是可重入的(缺頁處理程式能正常返回到異常發生的地方);

不知道是不是這樣。

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

海嶺洋脊板塊發散 來自 xv6 document When changing protection levels from user to kernel mode,the kernel shouldn t use the stack of the user process,because it ma...

Linux 中 write 系統呼叫具有原子性嗎?比如兩個程序同時 write 同乙個檔案會不會出現資料交錯的情況?標準裡面有規定嗎?

木匠劈柴 兩個程序 執行緒同時write同乙個檔案要分兩種情況,一是 檔案 被共享,二是不被共享。首先澄清一下概念,這裡的 檔案 指的是Linux 核心 in memory 檔案表 file table 裡的乙個檔案物件,即 file description。第一種情況,會在dup或者fork時發生...

Linux既然是通過中斷來進行系統呼叫的,那為什麼在進入核心態後不處於中斷上下文而是程序上下文?

PerfMa system call 和中斷處理是有些區別的。system call 也叫軟中斷,主要從使用者態切換到核心態,構造一些核心態的棧之類的上下文,核心處理完畢後返回到程序,嚴格來說system call 陷入到核心態已經不屬於程序上下文了。 shuyong.chen 這個問題很好回答,因...