[心得] Read only 與 Write 之外的選擇
之前發的文 好像被砍掉了...現在來自回
因為學習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
01/08 02:10, 2F
→
01/08 02:13, , 3F
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
01/08 12:36, 6F
→
01/08 12:37, , 7F
01/08 12:37, 7F
→
01/08 12:42, , 8F
01/08 12:42, 8F
→
01/08 12:49, , 9F
01/08 12:49, 9F
→
01/08 12:51, , 10F
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
01/09 02:08, 11F
→
01/09 02:09, , 12F
01/09 02:09, 12F
→
01/09 02:15, , 13F
01/09 02:15, 13F
→
01/09 02:19, , 14F
01/09 02:19, 14F
→
01/09 02:20, , 15F
01/09 02:20, 15F
推
01/09 12:49, , 16F
01/09 12:49, 16F
→
01/09 12:49, , 17F
01/09 12:49, 17F
推
01/09 12:56, , 18F
01/09 12:56, 18F
→
01/09 12:58, , 19F
01/09 12:58, 19F
→
01/09 13:02, , 20F
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)
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章