whutxuan
驱动小牛
驱动小牛
  • 注册日期2002-03-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1476回复:8

实模下访问4G内存的问题。

楼主#
更多 发布于:2005-01-07 08:42
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呢?

最新喜欢:

WY.lslrtWY.lsl... hongsinghongsi...
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-07 09:27
学习,顶一下。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-07 10:09
 shr eax,16 // GDTR Base high16 bits后eax中的是该描述符的基地址的高16位,关于描述符请参考Intel的处理器手册
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
whutxuan
驱动小牛
驱动小牛
  • 注册日期2002-03-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于: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]
whutxuan
驱动小牛
驱动小牛
  • 注册日期2002-03-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-07 10:31
错了,限长应该是23,不是2^23.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2005-01-08 11:22
实模式访问4GB是利用386以上INTEL处理器的漏洞,没有刷新描述符缓冲寄存器而已,所以可以可以访问4GB的段空间.
GDT一共3个描述符,所以占用24个字节,0~23有效......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
amfands
驱动牛犊
驱动牛犊
  • 注册日期2005-01-08
  • 最后登录2005-01-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-08 17:57
我也..
windchen
驱动牛犊
驱动牛犊
  • 注册日期2004-08-11
  • 最后登录2010-01-14
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-10 11:06
GDT的设置不是那么固定的了,你可以把它修改编译一下看看,
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-14 10:27
实模式访问4GB是利用386以上INTEL处理器的漏洞,没有刷新描述符缓冲寄存器而已,所以可以可以访问4GB的段空间.
GDT一共3个描述符,所以占用24个字节,0~23有效......


高,能给个代码吗?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部