LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: thrfrs

[体系结构]以前好象在哪里看过,说机器启动时cpu只能控制2m的内存,是这样吗?

[复制链接]
发表于 2006-12-5 19:38:23 | 显示全部楼层
但是好像启动时的实模式还是类似80x86,要进入保护模式才是4G寻址的吧?
回复 支持 反对

使用道具 举报

发表于 2006-12-7 22:16:09 | 显示全部楼层
其实让CPU一启动就进入保护模式并不是什么难事,只是为了跟以前的CPU保持兼容才没有这样做,所以有shadow mode并不奇怪。不过我还是对ilrainyday说的那片文章很感兴趣,不知道ilrainyday兄还能找到那篇文章吗?可否给个链接什么的?
回复 支持 反对

使用道具 举报

发表于 2006-12-7 22:16:19 | 显示全部楼层
其实让CPU一启动就进入保护模式并不是什么难事,只是为了跟以前的CPU保持兼容才没有这样做,所以有shadow mode并不奇怪。不过我还是对ilrainyday说的那片文章很感兴趣,不知道ilrainyday兄还能找到那篇文章吗?可否给个链接什么的?
回复 支持 反对

使用道具 举报

发表于 2006-12-13 15:27:46 | 显示全部楼层
让CPU一启动就进入保护模式并不是什么难事?不可能把?是在BIOS初始后才可以进入保护模式把?
回复 支持 反对

使用道具 举报

发表于 2006-12-14 09:41:24 | 显示全部楼层
[使用intel处理器的机器BIOS如何检测内存大小]

怎么做到在实模式下访问4GB内存。这种技术需要保护模式支持,所以只能在80386以上的CPU中运行。

  学过一点保护模式的读者都知道,在保护模式下段地址寄存器中内容的不再象实模式那样是段的基地址,而只是描述符表中的一个索引,段的真正信息(基地址、限长、访问权限等)放在描述符表中, 当访问一数据时CPU会从描述符表取出段的描述信息来检查访问是否合法,不合法就产生异常,合法则允许访问。每次访问都要读出描述符信息再检查是一个比较费时的过程,为了提高内存访问的速度,Intel公司在CPU中为每个段寄存 器配备了一个高速缓冲器来存放段的描述符信息,这样访问内存时就不用频繁地访问描述表,只要从高速缓冲进行校验就行,[color="Red"]只有在改变段寄存器的值时才访问描述符表将新的段描述符装入高速缓冲中。

  我们就利用CPU的这个特性来达成我们的目的。首先进入保护模式,把某个段寄存器设为基地址0H,限长4GB,然后再退回实模式。这样就可以通过该段寄存器直接访问4GB的内存了(实际上只能访 问你的机器上所有的内存而并不是4GB)!还有一点要注意的是一定要打开A20线,否则......别怪我言之不预!

  下面列出所需要的代码:

Make4GBSegment    MACRO    _seg
local   MyGdt,PM_Service,Old_GDTR,GDTR,Real_Service,MyGdt
local   _Exit
    Push    DS
    Push    ES
    Pushad
    Pushfd                            ;保护现场
   
    Sub     EBX,EBX
    Mov     BX,CS
    Mov     DS,BX

    Shl     EBX,4
    Push    EBX

    Rol     EBX,8
    Mov     BYTE Ptr MyGdt[8+7],BL
    Mov     BL,BYTE Ptr MyGdt[8+5]
    Ror     EBX,8
    Mov     DWORD Ptr MyGdt[8+2],EBX

    Pop     EBX
    lea     EBX,[EBX+MyGdt]
    Mov     DWORD Ptr [GDTR+2],EBX
    Mov     WORD Ptr [GDTR],31        ;建立新的GDTR
    Cli

    Sgdt    FWORD Ptr [Old_GDTR]      ;保存旧的GDTR
    Lgdt    FWORD Ptr [GDTR]          ;设置新的GDTR
    Mov     EBX,CR0
    Or      BL,1
    Mov     CR0,EBX                   ;进入保护模式
    DB      0eah
    DW      PM_Service
    DW      8                         ;跳转到保护模式代码执行

PM_Service:
    Mov     AX,16
    Mov     _seg,AX
    Mov     EBX,CR0
    And     EBX,0fffffffeh
    Mov     CR0,EBX
    DB      0eah
    DW      Real_Service
    DW      seg Real_Service

Real_Service:
    Lgdt    FWORD Ptr [Old_GDTR]

    Popfd                             ;恢复现场
    Popad
    Pop     ES
    Pop     DS
    Jmp     _Exit

MyGdt       DQ    0
            DW    -1,0,9a00h,0
            DW    -1,0,9200h,0cfh
            DQ    0

Old_GDTR    DW    0,0,0
GDTR        DW    0,0,0
_Exit:
    Endm

  在这里为了方便我只把FS改成4GB段,读者可以按需要自行决定使用哪个段寄存器。只要将这段代码拷贝到你的程序中,然后在开始的时候调用它,就可以通过该段寄存器直接访问大内存了,爽吧!

  最后还有一点一定要注意:如果你的程序运行时有任何扩展内存管理程序存在(HIMEM、EMM386等)都要千万小心,因为很容易会破坏到它们的内部数据或其他程序的数据,如果是这样就只有死机一条路可走了。切记切记!我的建议是最好从内存顶端开始使用扩展内存。这时破坏其他数据的可能要小一些。

[color="Red"]代码可能不完整,使用关键词“实模式下”,可以在百度上搜出一大堆。不过基本原理都是一样的。
回复 支持 反对

使用道具 举报

发表于 2006-12-14 10:15:56 | 显示全部楼层
是阿。。BIOS初始化前是没法进入4G寻址
回复 支持 反对

使用道具 举报

发表于 2007-1-2 02:14:56 | 显示全部楼层
其实让CPU一启动就进入保护模式并不是什么难事,只是为了跟以前的CPU保持兼容才没有这样做,所以有shadow mode并不奇怪。不过我还是对ilrainyday说的那片文章很感兴趣,不知道ilrainyday兄还能找到那篇文章吗?可否给个链接什么的?

原始的电子版我应该还有,不过要费些功夫找。不过大致的原理就是利用每个segment register处于效率的考虑,都有一个description cache(应该是叫这个名词吧,很久没看这方面的东西了),就是利用这个cache来实现的(和CPU中的cache一样,其具有访问上的优先级)。你可以在google group中搜索到很多这方面的文章,用关键词"protected mode" "unreal mode"。
回复 支持 反对

使用道具 举报

发表于 2007-1-14 00:14:20 | 显示全部楼层
Post by wheel
是阿。。BIOS初始化前是没法进入4G寻址


BIOS初始化与4G寻址扯不上关系。4G寻址的关键:保护模式+装载适合段描述符
回复 支持 反对

使用道具 举报

发表于 2007-1-14 22:21:52 | 显示全部楼层
楼上说的应该是正解
回复 支持 反对

使用道具 举报

发表于 2007-1-21 15:53:08 | 显示全部楼层
我用过0x86哈哈,好像知道一点点,
先是和086一样只能访问一小部分内存,
被别的程序接管后标志寄存器(叫什么flags吧, 靠,intel早就保留好了)里面设置一位,就变成什么386保护模式了。
看看汇编语言方面的东东就知道了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表