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

  • 相关阅读:
    mmap函数实现
    linux交换空间
    日志式文件系统
    Linux内核书籍
    进程状态
    form表单中enctype="multipart/form-data"的作用
    php导入excel表格
    什么是隐藏域
    把生成的excel文件直接提供为下载页效果
    到底什么是实例化
  • 原文地址:https://www.cnblogs.com/sfzyk/p/9811134.html
Copyright © 2011-2022 走看看