init386 分析

2009-05-13 10:21:38来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

qiuhan
2007.8.20
今天我们继续以内存映像为主线来分析init386.
代码为于:
sys/i386/i386/machdep.c
传给init386的参数为第一个可用页面基址:
(gdb) p/x first
$1 = 0x1025000
首先为thread0设置堆栈和pcb指针:
(gdb) p thread0.td_pcb
$4 = (struct pcb *) 0xc1020d90
(gdb) p/x sizeof(struct pcb)
$6 = 0x270
0xc1020d90 + 0x270 = 0xC1021000
接着设置preload_metadata, preload_bootstrap_relocate把区域中的地址信息加上3G的偏移,
这样我们在后面就可用通过preload_metadata找到loader时加载的模块或者二进制文件(详见《loader分析》).
设置kern_envp,以查找环境变量。 紧接着的init_param1就根据该值初始化一些基本的环境变量。
设置gdt,ldt,pc, idt, tr, 这里不详说。
vm86_initialize
初始化vm86 区域内存映射, 为在保护模式下执行vm86函数做准备。紧接着的getmemsize就是使用vm86 函数来获取内存大小。
     * +--------+    vm86phystk 0x01021000
     * | page 0 |
     * |        | +--------+
     * |        | | stack  |
     * |        | |--------| vml_pcb
$29 = (struct pcb *) 0x440
     * pcb_esi  = new PTD entry 0 //0x1022007
     * pcb_ebp  = pointer to frame on vm86 stack //0xc1021fa8
     * pcb_esp  =    stack frame pointer at time of switch
     * pcb_ebx  = va of vm86 page table
     * pcb_eip  =    argument pointer to initial call
(gdb) p/x *(struct pcb *)vm86pcb
$21 = {pcb_cr3 = 0x0, pcb_edi = 0x0, pcb_esi = 0x1022007,
  pcb_ebp = 0xc1021fa8, pcb_esp = 0xc1020b90, pcb_ebx = 0xc1022000,
  pcb_eip = 0xc1020ccc, pcb_dr0 = 0x0, pcb_dr1 = 0x0, pcb_dr2 = 0x0,
  ...
invltlb()
重新读入cr3以使tlb更新。
getmemsize
一个很有意思的函数。参数为第一个可用页面,即0x1025000,输出为:
(gdb) p/x phys_avail
$14 = {0x1000, 0x9f000, 0x100000, 0x400000, 0x1025000, 0x7fe8000, 0x0, 0x0, 0x0, 0x0}
通过vm86_intcall(0x12, &vmf)计算basemem(得到639), 然后把basemem到640k之间的空间映射到vm86paddr;  通过INT 15:E820得到内存map
(gdb) p/x physmap
$45 = {0x0, 0x9fc00, 0x100000, 0x7ff0000, 0x0 }
然后向内存反复写'0','1'来判断内存是否正常。
这里有2个地方比较有意思:
1 vm86_intcall的调用
修改IdlePTD的一个映射为vm86paddr,然后重新加载cr3,以按照vm86 Page Tbl  的方式来映射0-0xffffc(1M空间,线性映射,即物理地址和虚拟地址相同)
(gdb) xp/4x 0x0101e000
0x101e000:      0x01022027      0x01001023      0x01002023      0x01003003
伪造了一个vm86frame,其中eip为0xa00, eflags中包含VM位, 然后jmp doreti,伪装成从内核返回的样子[FIXME]。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:boot0分析

下一篇:lshal输出解读