pmon中x86emu对vga初始化浅析
来源:互联网 发布:微信一键拉人软件 编辑:程序博客网 时间:2024/05/29 15:58
本文主要简要描述下pmon中x86emu对vga初始化的步骤
1。主要思想:
x86emu 实际上可以看作是执行x86指令的一台虚拟机,对其介绍分为三个部分,内存空间
映射,模拟中断机制,和指令执行模拟三个方面。
2。内存空间映射
x86emu中寻址空间空间默认是0~100000大小,映射关系如下:
0~0xa0000 此空间访问 INTPriv(pInt)->base指针所指向的空间
0xa0000~0xc0000 此空间映射 INTPriv(pInt)->vRam指针指向的空间
0xc0000~0xf0000 此空间映射 INTPriv(pInt)->base+V_BIOS开始的空间
0xf0000~0x100000 此空间映射 INTPriv(pInt)->sysMem指针指向的空间
其中INTPriv(pInt)->vRam赋值是VGA_BASE + 0xa0000即vga分配的io空间
INTPriv(pInt)->base 和INTPriv(pInt)->sysMem 是在vga_bios_init函数中malloc的空间
INTPriv(pInt)->base+V_BIOS中开始的10000空间内拷贝了
Target/Bonitoxxxx/Bonito/vgarom.c中定义的vgarom数组内容。
而模拟执行的指令,也正是vgarom数组里面。
3。模拟中断机制
由于pmon中仅支持单线程操作,因此对于中断不可能异步执行。其中断处理函数如下:
28 void xf86ExecX86int10(xf86Int10InfoPtrpInt)
29 {
30 int sig = setup_int(pInt);
31
32 if (sig < 0)
33 return;
34
35 if (int_handler(pInt)) {
36 X86EMU_exec();
37 }
38
39 finish_int(pInt, sig);
40 }
其中setup_int 是保存现场, finish_int是恢复现场
int_handler(pInt)是为处理中断作准备。
X86EMU_exec()是执行中断处理程序。
int_handler函数内容如下:
33 int int_handler(xf86Int10InfoPtr pInt)
34 {
35 int num = pInt->num;
36 int ret = 0;
40 switch (num) {
41 #ifndef _PC
42 case 0x10:
43 case 0x42:
44 case 0x6D:
45 if (getIntVect(pInt, num) == I_S_DEFAULT_INT_VECT) {
46 printf("default int10 called,intno=%x\n", num);
47 ret = int42_handler(pInt);
48 }
49 break;
50 case 0x15:
51 ret = int15_handler(pInt);
52 break;
53 #endif
54 case 0x1A:
55 ret = int1A_handler(pInt);
56 break;
57 case 0xe6:
58
1。主要思想:
x86emu 实际上可以看作是执行x86指令的一台虚拟机,对其介绍分为三个部分,内存空间
映射,模拟中断机制,和指令执行模拟三个方面。
2。内存空间映射
x86emu中寻址空间空间默认是0~100000大小,映射关系如下:
0~0xa0000
0xa0000~0xc0000
0xc0000~0xf0000
0xf0000~0x100000
其中INTPriv(pInt)->vRam赋值是VGA_BASE + 0xa0000即vga分配的io空间
INTPriv(pInt)->base 和INTPriv(pInt)->sysMem 是在vga_bios_init函数中malloc的空间
INTPriv(pInt)->base+V_BIOS中开始的10000空间内拷贝了
Target/Bonitoxxxx/Bonito/vgarom.c中定义的vgarom数组内容。
而模拟执行的指令,也正是vgarom数组里面。
3。模拟中断机制
由于pmon中仅支持单线程操作,因此对于中断不可能异步执行。其中断处理函数如下:
33
其中setup_int 是保存现场, finish_int是恢复现场
int_handler(pInt)是为处理中断作准备。
int_handler函数内容如下: