init386 分析
2009-05-13 10:21:38来源:未知 阅读 ()
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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 提示:bad kernel: arp : 内网IP地址 is on em0 but got rep 2009-05-13
- freebsd和linux下添加IP地址和静态路由 2009-05-13
- fb 相当快的ports源地址 2009-05-13
- 分析squid的日志,罗列出一天最多的点击url 2009-05-13
- PF防火墙详解 2009-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash