阅读:1476回复:8
实模下访问4G内存的问题。
DWORD ExtMemGDT_Table[] =
{ 0, 0, // First GDT entry always unused 0x0000FFFF, 0x00CF9A00,// Code32 - 08h Base=0 Limit=4G-1 Size=4G 0x0000FFFF, 0x00CF9200 // Date32 - 10h Base=0 Limit=4G-1 Size=4G }; BYTE OldIDT[8] = {0,0,0,0,0,0,0,0}; // Save The IDTR before Enter Protect Mode. BYTE TmpIDT[8] = {0,0,0,0,0,0,0,0}; // NULL The IDTR's Limit=0 CPU will disable all Interrupts, include NMI. void Init4GM(void) { asm { cli // Disable interrupts sidt fword ptr OldIDT // Save Old IDTR lidt fword ptr TmpIDT // Set up empty IDT. Disable any interrupts, } // Include NMI. //Load GDTR asm { db 0x66 mov cx,ds shl ecx, 4 mov TmpIDT[0],(3*8-1) xor eax,eax mov ax,offset ExtMemGDT_Table add eax,ecx // GDTR Base low16 bits mov TmpIDT[2],al mov TmpIDT[3],ah shr eax,16 // GDTR Base high16 bits mov TmpIDT[4],al mov TmpIDT[5],ah lgdt fword ptr TmpIDT // Load GDTR } asm { mov dx,0x10 // The Data32 Selector mov eax,cr0 mov ebx,eax or ax,1 mov cr0,eax jmp flush // Clear machine perform cache. } flush: // Now in flat mode, But the CS is Real Mode Value. asm { // And it's attrib is 16Bit Code Segment. mov eax,ebx mov fs,dx // Load FS Base=0 Size=4G now mov cr0,eax // Return Real Mode. lidt fword ptr OldIDT // LIDT OldIDT,Restore IDTR sti // Enable INTR } } 这段代码总的功能是使得在实模式下可以访问4G的内存。 有几个细节的地方没有明白。 问题1:shr eax,16之后 eax中的数是什么??? 问题2:mov TmpIDT[0],(3*8-1) 把GDTR的低8位设置成23,有什么意义? 问题3: flush后面的代码是用来干什么的。 mov dx,0x10 // The Data32 Selector 为什么是0x10呢? |
|
沙发#
发布于:2005-01-07 09:27
学习,顶一下。
|
|
板凳#
发布于:2005-01-07 10:09
shr eax,16 // GDTR Base high16 bits后eax中的是该描述符的基地址的高16位,关于描述符请参考Intel的处理器手册
|
|
|
地板#
发布于:2005-01-07 10:30
实模式访问4G内存原理很简单:先进入i386的32位保护模式0特权级,
分配一个限制为4G大的GDT,基址为0,放入FS或GS段,返回 实模式后FS/GS依然有效,然后以 [FS/GS:32bit偏移量] 访问 4G的内存 GDTR的低16位是限长。 也就是GDT的大小。 把GDTR设置为23, 那么就意味着GDT的大小是 23。 这和访问4G有关系吗? [编辑 - 1/7/05 by whutxuan] |
|
地下室#
发布于:2005-01-07 10:31
错了,限长应该是23,不是2^23.
|
|
5楼#
发布于:2005-01-08 11:22
实模式访问4GB是利用386以上INTEL处理器的漏洞,没有刷新描述符缓冲寄存器而已,所以可以可以访问4GB的段空间.
GDT一共3个描述符,所以占用24个字节,0~23有效...... |
|
|
6楼#
发布于:2005-01-08 17:57
我也..
|
|
7楼#
发布于:2005-01-10 11:06
GDT的设置不是那么固定的了,你可以把它修改编译一下看看,
|
|
8楼#
发布于:2005-01-14 10:27
实模式访问4GB是利用386以上INTEL处理器的漏洞,没有刷新描述符缓冲寄存器而已,所以可以可以访问4GB的段空间. 高,能给个代码吗? |
|
|