实模式和保护模式

x86系列最早的16位处理器8086采用的是实模式寻址:尽管8086有20位地址总线,能寻址1M地址空间,不过他只有16位运算能力(指令能处理的最长数据是16位),所以逻辑地址就被拆成了两部分:一个段基址(16bit,存放在相应的段寄存器中,对应地址总线的高16位)和段内偏移(16bit,指令中,对应低16位)。
每次访问内存时,CPU内部会用硬件加法器两者相加(指令中的地址的高12bit加到基址16bit里),最后地址管脚就输出20bit地址了:
struct logical_address{
    UINT16 seg_base;
    UINT16 offset;
};
#define logical_to_phisical(logical) ((logical.seg_base4) + logical.offset)

这样做的缺点是不安全,程式员能通过修改段寄存器的内容访问到任意一个内存单元,系统缺乏保护,非常脆弱。
80286尝试过渡到保护模式。到了32位的80386,开始真正采用保护模式,其实保护模式并不复杂,多绕了一个弯而已:
struct logical_address{
    struct seg_selector{
        UINT16 index:13;
        UINT16 tl:1;
        UINT16 rpl:2;
    };
    UINT32 offset;
};
struct seg_descriptor{
    UINT32 base:32;        /* 基地址 */
    UINT32 seg_limit:20;   /* 段长度 */
    UINT32 g:1;        /* 粒度,表段的长度单位,0表示字节,1表示4KB */
    UINT32 d_b:1;      /* 存取方式,0=16位,1=32位 */
    UINT32 unused:1;   /* 固定设置成0 */
    UINT32 avl:1;      /* available,可供系统软件使用 */
    UINT32 p:1;        /* segment present,为0时表示该段的内容不在内存中 */
    UINT32 dpl:2;      /* Descriptor Privilege Level,访问本段所需权限 */
    UINT32 s:1;        /* 描述项类型,1表示系统,0表示代码或数据 */
    UINT32 type:4;     /* 段的类型,和上面的S标志位一起使用 */
};
UINT32 logical_to_linear(struct logical_address logical_add){
    static bool first = true;
    UINT32 table_base;
    struct seg_descriptor shadow;
    if ( first ) {
        if(logical_add.seg_selector.tl == 0)
            table_base = gdtr; /* GDT */
        else
            table_base = ldtr; /* LDT */
        
        shadow = (struct seg_descriptor) *(table_base + logical_add.seg_selector.index*8);
        first = false;
    }
    if ( logical_add.seg_selector.tl > shadow.dpl ) /* 0: highest level; 3: lowest level */
        thorow access_denied;
    else if ( logical_add.offset > (shadow.limit(shadow.g?12:0)) )
        thorow over_boundary;
    else
        return shadow.base + logical_add.offset;        
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值