zoukankan      html  css  js  c++  java
  • ucore 地址映射的几个阶段

    第零阶段:
    启动之后的实模式阶段
    vir = lin = pa

    第一阶段 :
    启动 bootloader 的段式分页
    这里段基址是0 ,所以地址空间维持不变
    vir addr = lin addr = pa addr

    第二阶段 :
    从entry.S enable paging 开始
    这时
    vir
    addr 0-4G
    kernelbase - kernelbase+4G
    这两个段都被映射到了 pa 的0-4G

    第三阶段

    第二阶段转换到第三阶段只有几行指令
    因为启动了页式分页后 需要把eip中的值更新到 basekernel 以上去
    在这几行执行完后就可以取消vir addr 0-4G 至 pa addr 0-4G 的映射

    自映射机制在这里启动
    有一个 0xFAC00000 作为VPT

    使用指令 boot_pgdir[PDX(VPT)] = PADDR (boot_pgdir ) | PTE_P | PTE_W

    于是使用 VPT 地址访问的就是 pgd 这个页表本身 更进一步的
    VPT - VPT +4G 这个空间被映射到了全部的页表上去
    其中一个特殊的地址也就是
    0xFACFAC000 地址不会这样写,我的含义是高十位和中间十位相同并且等于 0xFAC 的地址被映射到了页目录项本身

    第四阶段
    地址空间也不改变
    进入gdt_init 进行最后一次段式设置
    这次设置用户代码和数据段信息,加载tss 的值
    以上所有的段都有 基址=0x0
    所以就是说全程都有 lin addr= vir addr

  • 相关阅读:
    ubuntu下Nodic开发环境搭建
    usb_modeswitch移植
    STM32F4编程手册学习2_内存模型
    STM32F4 编程手册学习1_编程模型
    ARM架构中的程序执行与调用
    锲形文字 数字
    疑问
    lisp 题目
    面试官在面试时让我去破解一个软件,我成功了
    php CI ip限制
  • 原文地址:https://www.cnblogs.com/sfzyk/p/9811134.html
Copyright © 2011-2022 走看看