2012-04-16 111 views
4

我想了解內核並嘗試打印一些組成內核格局的基本數據結構的一些時間,但不成功。我的問題是,給定一個內存地址,我希望能夠打印該地址的內容。從指定的內核訪問內核內存

例如,我有一個函數來確定IDT的位置。它返回(void *)的訂單0xffff81b8c0000fff。但是,每當我嘗試printk那個地址時,結果都是內核恐慌。我知道有防止從用戶空間訪問內核內存的保護措施,但我試圖在start_kernel內部執行此操作,在那裏我會認爲它們是可讀的。

的代碼是:

idt_ptr = sidt(); // returns (void *) 
printk(KERN_INFO "680: IDT TABLE, FIRST ENTRY\n"); 
//entry is 64 bits 
printk(KERN_INFO "680: %llx\n", *(unsigned long long *)idt_ptr); 

下面是使這一嘗試後發生的核恐慌的末尾:

enter image description here

看來我需要的讀訪問的信號,但這不是一個任意的地址嗎?

+0

從我在操作系統開發方面的經驗來看,好像是觸發了頁面錯誤。當您嘗試訪問您不應該或不存在的分頁內存時,會發生這種情況。不幸的是,我不知道更多我可以說幫助你。 – user99545 2012-04-16 02:33:59

回答

5

例如,我有一個函數來確定IDT的位置。它的0xffff81b8c0000fff

沒有指針的順序返回(無效*)比其他任何char*可能可能等於0x...ff - 該地址沒有被正確的指向包含比char S以外的任何一個數據結構對齊。

結論:您的sidt功能被破壞並返回虛假地址。

+1

根據其他地址,我會說實際地址可能是0xffffffff81b8c000 - 0x0fff很可能是16位IDT限制。 OP應該注意'sidt'操作碼寫入一個10字節的值,其中較低的兩個字節是16位限制,高8字節是地址。 – caf 2012-04-16 07:15:04

+0

我擔心這可能是這種情況。我一直試圖在userland進行測試,但由於無法訪問內核內存,我無法判斷我的地址是否壞,或者我無法訪問它的內容。說什麼咖啡很有意義,我會盡早嘗試並報告。謝謝。 – fromClouds 2012-04-16 15:26:34

1

我建議給kdb一個在內核周圍打個盹。

嘗試設置一個KVMqemu具有kdb修補內核的虛擬機。

+0

我會研究它,謝謝你的建議。 – fromClouds 2012-04-16 15:27:22