看板 LinuxDev 關於我們 聯絡資訊
之前發的文 好像被砍掉了...現在來自回 因為學習Kernel路上有遇到些問題, 目前想個法子解決了@@ 想做的是 memory某段address中 要偵測這address是否被修改 感謝有大大提供各種不同的方法。 這邊來說我想的方法是比較被動的方式。 想法: 把某段memory位置 設定成Read Only 讓他進Page fault handler 然後再到Page fault handler 看看memory的值被改成多少? 譬如原本是 a = 5; 設定 &a是Read Only 當modify 的時候會進Page fault handler 但我希望 1 < a < 10 Page fault handler 會檢查 a被改成甚麼值 若是 a = 6; 那ok,return回去;若a = 11; 則Page fault。 感謝各位大大賜教~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.224.96.66
mayasky:你有看過那篇被刪除的訊息嗎?我沒刪,詢問另位版主中 01/08 01:52
yvb:page fault時, a應該尚未被修改,也尚無法被修改,所以如何檢查? 01/08 02:10
yvb:如果就這麼return回去,仍會執行同指令,結果再度page fault吧. 01/08 02:13
回Y大的話,a 的確尚未修改。但是進page fault時候會傳入error code跟pt_regs 我可以根據error code判定是屬於哪一種情況。若a = 6 則 page fault 幫忙 把 a = 5 改成 a=6; 然後修改regs->ip(跳到a=5;這指令後面) 和 return. ※ 編輯: BitTorrent 來自: 36.224.96.66 (01/08 11:28)
sivle:我也沒刪。。。大家分享心得的 我不會刪掉才是 01/08 11:38
yvb:真奇怪, 有文章被系統暗黑掉了... @.@ 01/08 12:34
yvb:判斷page fault後續狀況的問題, 我以為會相當複雜, 而且會是 01/08 12:36
yvb: machine dependant; 最主要是要分析 ip 指向的指令做什麼... 01/08 12:37
yvb:比方 x86 的 mov 指令, 多種定址法的指令長度都不盡相同... 01/08 12:42
yvb:不知原PO是實作在什麼平台上, 有什麼kernel函式協助分析指令, 01/08 12:49
yvb:或是我想太多, 其實光就 pt_regs 就足以判斷? 01/08 12:51
我作在x86, 有mov有分 movl , movw 等等 我舉個例子 idt_table2[i].offset_low = 0xbeef; 77: 44 89 e6 mov %r12d,%esi 7a: 66 c7 03 ef be movw $0xbeef,(%rbx) 7f: 41 b8 ef be 00 00 mov $0xbeef,%r8d 85: 48 c7 c7 00 00 00 00 mov $0x0,%rdi (unsigned long )((char *)(regs->ip+=5)); *(unsigned long *)address = value; //modified value 或者 idt_table2[i].offset_high = 0x12345678 7b: c7 43 08 78 56 34 12 movl $0x12345678,0x8(%rbx) 82: ba 78 56 34 12 mov $0x12345678,%edx 87: 48 c7 c7 00 00 00 00 mov $0x0,%rdi 8e: 31 c0 xor %eax,%eax (unsigned long )((char *)(regs->ip+=7)); //由c7 43 數到ba共7個 *(unsigned long *)address = *(ggyy+1); //modified value ※ 編輯: BitTorrent 來自: 36.224.96.66 (01/08 16:03)
yvb:還有一些問題: (1) 造成 page fault 的是 userspace process 01/09 02:08
yvb: 還是 kernel thread? (2) handler改值前後, 需要切換 RO 嗎? 01/09 02:09
yvb: (3) 除了 mov, 其它如 add, xchg 等又是如何? 01/09 02:15
yvb:關於 x86 指令集分析的處理, 不知原PO是自行包辦, 01/09 02:19
yvb: 或是如何叫用 kernel 哪些函式來協助完成? 01/09 02:20
yvb:問題 (1) 應改為 造成 page fault 的是 kernel thread, 01/09 12:49
yvb: process 的 user space 或 kernel space ? 01/09 12:49
yvb:此外還有更複雜的情況, 比方 a 為 int, 那麼 01/09 12:56
yvb:*(((char *)&a)+2)=1 或是 *(int *)(((char *)&a)-2)=-1 之類. 01/09 12:58
yvb:當然, 如果一堆變數 b, c, ... 都和 a 同 page 時, 那效能... 01/09 13:02
(1) 一個system call by user mode (2) 需要切換 RO (3) 我都是objdump去看他,所以再複雜的情況,應該都可找出關鍵的assembly code same page 我到沒有想過~~ ※ 編輯: BitTorrent 來自: 114.25.193.147 (03/17 11:01)