zoukankan      html  css  js  c++  java
  • x86 建页表的对齐问题

    页表根据需求可建立不同大小,比如 4K(1000h byte), 2M (20_0000h byte), 1G(4000_0000h byte).
    例如我们现在分别建立 4K, 2M, 1G 大小的页表,
    ;random ( memory, linear: x86_page_va equ (rand1 & 0ffffffff0000), physical: x86_page_pa equ (rand1 & 0ffffffff0000), a000h, if(MODE_PM64))
    // 经过 random, 得到的 x86_page_va = 000004e0cf6be0000
    // 接下来以x86_page_va 为基础分别创建 4K, 2M, 1G 大小的页表
    ;paging_entry x86_page_va -> x86_page_pa+1000h : user write present wb 4kbpage; create page-table
    ;paging_entry x86_page_va +3000h -> x86_page_pa+5000h : user write present wb 2mbpage; create page-table
    ;paging_entry x86_page_va + 40_0000h -> x86_page_pa+1000h : user write present wb 4kbpage; create page-table

    原本期望的页表VA 范围为:
    4K : 000004e0cf6be0000 -> 000004e0cf6be0fff
    2M : 000004e0cf6c20000 -> 000004e0cf701ffff
    1G : 000004e0cf6fe0000 -> 000004e0d36c1ffff

    页表建立时,x86 会考虑对齐问题,比如 创建2M页表的时候,2M对齐, 自动忽略后21bit数值,默认为0。
    因此,真正的建好的页表为:
    4K : 000004e0cf6be0000 -> 000004e0cf6be0fff
    2M : 000004e0cf6c00000 -> 000004e0cf6dfffff
    1G : 000004e0c00000000 -> 000004e0effffffff

    (写得匆忙,页表范围没double check, 可能有错误)

  • 相关阅读:
    PHP双向队列
    [转]数据库查询的3个优化方法
    MySQL性能测试工具 mysqlslap
    PHP各种魔术方法测试
    VBA中级班课时3小结
    VBA中级班课时1小结
    执行cmd并返回程序结果
    Update Dataset data back to Database
    终于会用c#中的delegate(委托)和event(事件)了
    c#: Enqueued event for Queue<T>
  • 原文地址:https://www.cnblogs.com/yanli0302/p/14791145.html
Copyright © 2011-2022 走看看