[心得] Read only 與 Write 之外的選擇

看板LinuxDev作者 (螳勃唬)時間10年前 (2014/01/07 23:17), 編輯推噓6(6014)
留言20則, 3人參與, 最新討論串1/1
之前發的文 好像被砍掉了...現在來自回 因為學習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

01/08 01:52, , 1F
你有看過那篇被刪除的訊息嗎?我沒刪,詢問另位版主中
01/08 01:52, 1F

01/08 02:10, , 2F
page fault時, a應該尚未被修改,也尚無法被修改,所以如何檢查?
01/08 02:10, 2F

01/08 02:13, , 3F
如果就這麼return回去,仍會執行同指令,結果再度page fault吧.
01/08 02:13, 3F
回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)

01/08 11:38, , 4F
我也沒刪。。。大家分享心得的 我不會刪掉才是
01/08 11:38, 4F

01/08 12:34, , 5F
真奇怪, 有文章被系統暗黑掉了... @.@
01/08 12:34, 5F

01/08 12:36, , 6F
判斷page fault後續狀況的問題, 我以為會相當複雜, 而且會是
01/08 12:36, 6F

01/08 12:37, , 7F
machine dependant; 最主要是要分析 ip 指向的指令做什麼...
01/08 12:37, 7F

01/08 12:42, , 8F
比方 x86 的 mov 指令, 多種定址法的指令長度都不盡相同...
01/08 12:42, 8F

01/08 12:49, , 9F
不知原PO是實作在什麼平台上, 有什麼kernel函式協助分析指令,
01/08 12:49, 9F

01/08 12:51, , 10F
或是我想太多, 其實光就 pt_regs 就足以判斷?
01/08 12:51, 10F
我作在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)

01/09 02:08, , 11F
還有一些問題: (1) 造成 page fault 的是 userspace process
01/09 02:08, 11F

01/09 02:09, , 12F
還是 kernel thread? (2) handler改值前後, 需要切換 RO 嗎?
01/09 02:09, 12F

01/09 02:15, , 13F
(3) 除了 mov, 其它如 add, xchg 等又是如何?
01/09 02:15, 13F

01/09 02:19, , 14F
關於 x86 指令集分析的處理, 不知原PO是自行包辦,
01/09 02:19, 14F

01/09 02:20, , 15F
或是如何叫用 kernel 哪些函式來協助完成?
01/09 02:20, 15F

01/09 12:49, , 16F
問題 (1) 應改為 造成 page fault 的是 kernel thread,
01/09 12:49, 16F

01/09 12:49, , 17F
process 的 user space 或 kernel space ?
01/09 12:49, 17F

01/09 12:56, , 18F
此外還有更複雜的情況, 比方 a 為 int, 那麼
01/09 12:56, 18F

01/09 12:58, , 19F
*(((char *)&a)+2)=1 或是 *(int *)(((char *)&a)-2)=-1 之類.
01/09 12:58, 19F

01/09 13:02, , 20F
當然, 如果一堆變數 b, c, ... 都和 a 同 page 時, 那效能...
01/09 13:02, 20F
(1) 一個system call by user mode (2) 需要切換 RO (3) 我都是objdump去看他,所以再複雜的情況,應該都可找出關鍵的assembly code same page 我到沒有想過~~ ※ 編輯: BitTorrent 來自: 114.25.193.147 (03/17 11:01)
文章代碼(AID): #1Ip1gTfm (LinuxDev)
文章代碼(AID): #1Ip1gTfm (LinuxDev)