簡體   English   中英

CPU從用戶模式切換到內核模式:它究竟做了什么? 它是如何實現這種轉變的?

[英]CPU Switches from User mode to Kernel Mode : What exactly does it do? How does it makes this transition?

CPU從用戶模式切換到內核模式:它究竟做了什么? 它是如何實現這種轉變的?

編輯:

即使它依賴於架構,請給我一個答案。 該架構取決於您。 告訴我你所了解的架構。

我想知道所有事情將涉及到什么。

注意:這主要與x86架構相關。 這是一個有點簡化的解釋。

過渡通常是由以下原因之一引起的:

  • 故障(例如頁面錯誤或執行指令導致的其他異常)
  • 中斷(例如鍵盤中斷或I / O整理)
  • 陷阱(例如系統調用)

通常發生的是系統檢查中斷描述符表(IDT)。 每個異常(中斷,故障等)都有一個與之關聯的數字,用於索引此表。

從該表中,CPU可以確定要運行的中斷處理程序。

作為轉換的一部分,以下更改(通常)生效:

  • 切換到內核堆棧
  • EFLAGS已保存
  • 保存代碼段選擇器和EIP。
  • 堆棧段選擇器和堆棧指針已保存
  • 開始執行中斷處理程序
  • 保存通用寄存器(處理程序的工作)
  • 段選擇器更改為內核選擇器(處理程序的工作)

你現在處於內核模式。

希望有幫助:)

這是系統依賴的,但通常的機制是一些userland操作導致軟件中斷。 該中斷使處理器切換模式並跳轉到內核代碼,然后內核代碼檢查程序嘗試執行的操作(系統調用?),然后執行請求的操作並跳轉回用戶模式代碼。 除了軟件中斷之外的其他機制也可能導致轉換; 例如,在搶占式多任務系統中,定時器中斷可能會觸發調度程序運行。

我的理解是,任何段寄存器具有兩個LSB為零的程序將以內核模式運行,而其段寄存器具有兩個LSB = 1的任何程序將在用戶模式下運行。 實際上,段rgeisters的兩個LSB定義了Priviledge Level(0最高到3最低)

因此,要使prgram在內核模式下運行,您必須將段寄存器設置為0010 hex(我相信)。 我不確定如何在不重寫其他內容的情況下將程序放在該內存空間中 - 換句話說,鏈接器如何確保? 此外,如果要從用戶模式代碼調用內核模式代碼,則必須弄清楚如何傳遞參數 - 它們不使用相同的內存空間,因此無法通過內存引用傳遞數據。 我想你必須把它傳遞給寄存器。

如果任何人都能填補上述空白,我將非常感激。

在Windows中,當您進行系統調用時,庫例程會調用駐留在操作系統地址空間中的內核入口點。 它通過執行特定於此目的的指令(例如sysenter)將CPU帶入管理程序模式。 它的作用主要是在標志寄存器中設置一個位。 這使操作系統能夠使用特權指令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM