2009-06-24 33 views
3

如果我讀/寫/跳轉到ummapped地址,即。linux:「真正的」分段錯誤處理程序在哪裏?

.text 
    .global _start 
_start: 
    movl $1,%edx 
    jmp  *%edx 

這會導致分段錯誤。

我想知道,系統(內核) 的實際部分是什麼攔截讀取/寫入未映射的地址(如何?) 並拋出「用戶模式」信號?

+1

那麼有硬件支持的怎麼樣,也許http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection對於這裏,我想你應該尋找中斷處理程序? – wds 2009-06-24 09:26:03

回答

4

一切從架構陷阱表流動。這通常被稱爲entry.S(在entry_32和entry_64.S之間的x86上分割),並且具有彙編程序鏈接功能,在進入內核本身的C代碼之前執行許多操作(取決於配置)。

因此無效的內存訪問應該通過page_fault或general_protection進入,並且最終可能在最終排隊回send_signal(kernel/signal.c)中的用戶空間之前最終執行force_sig_info。

0

它針對不同的體系結構實施。 例如,在x86,可以在檢查源:

do_page_fault: linux/arch/x86/mm/fault.c 
+1

頁面錯誤和分段錯誤是完全不同的東西。 – SoapBox 2010-04-09 11:08:10

0

在不是「Book E」的PowerPC芯片(例如最近用於嵌入式系統的芯片)中,分段錯誤以異常0x300(用於數據)或0x400(用於指令)開始。用戶/管理員模式標誌爲設置爲管理員,MMU關閉,CPU跳轉到地址0x300或0x400,從而控制操作系統。