1 Star 0 Fork 0

WHC/xv6-course

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
23-kmem-pgtab.org 2.62 KB
一键复制 编辑 原始数据 按行查看 历史
殊蕤 提交于 2023-11-10 10:24 . add: 修改内存地址空间

内核页表初始化

上个视频

  1. entry.S 开启分页 CR0_PG
  2. main():kinit1 -> freelist
    (qemu) info tlb
    0000000000000000: 0000000000000000 --P-A---W
    0000000080000000: 0000000000000000 --PDA---W
    (qemu) info mem
    0000000000000000-0000000000400000 0000000000400000 -rw
    0000000080000000-0000000080400000 0000000000400000 -rw
    (qemu)
        
    (gdb) xv-freelist
    #1: 0x803ff000 -> use
    #2: 0x803fe000 -> use
    #3: 0x803fd000
    #4: 0x803fc000
    #5: 0x803fb000
    #6: 0x803fa000
    #7: 0x803f9000
    #8: 0x803f8000
    #9: 0x803f7000
    total=746 size=746.00M 782237696
        
    (gdb) p/x kmap
    $6 = {
      {virt = 0x80000000, phys_start = 0x0, phys_end = 0x100000, perm = 0x2},
      {virt = 0x80100000, phys_start = 0x100000, phys_end = 0x108000, perm = 0x0},
      {virt = 0x80108000, phys_start = 0x108000, phys_end = 0xe000000, perm = 0x2},
      {virt = 0xfe000000, phys_start = 0xfe000000, phys_end = 0x0, perm = 0x2}
    }
        

kvmalloc 初始化页表

kvmalloc 初始化内存页表,核心调研 setupkvm 初始化内核分页表

  • kalloc 申请 4K 物理页
    1. pgdir 页目录
  • memset 设置内存值
  • mappages 初始化页表项, 初始化 kmap
    1. walkpgdir 创建页表项
    2. 设置权限
(gdb) p pgdir
$10 = (pde_t *) 0x803ff000
(gdb) x/8x 0x803ff000
0x803ff000:     0x803fe000      0x01010101      0x01010101      0x01010101
0x803ff010:     0x01010101      0x01010101      0x01010101      0x01010101
(gdb) set print array on
(gdb) p/x kmap
$4 = {
  {virt = 0x80000000, phys_start = 0x0, phys_end = 0x100000, perm = 0x2},
  {virt = 0x80100000, phys_start = 0x100000, phys_end = 0x108000, perm = 0x0},
  {virt = 0x80108000, phys_start = 0x108000, phys_end = 0xe000000, perm = 0x2},
  {virt = 0xfe000000, phys_start = 0xfe000000, phys_end = 0x0, perm = 0x2}
}
(gdb)

物理内存分布

  1. 0x0 ~ 0x100000: BIOS 地址空间 (total 1MB)
    • 0x7c00 ~ 0x7e00 MBR
    • 0xa0000 ~ 0x100000 device memory region
  2. EXTMEM(0x100000) ~ end: BIOS extended memory start
    • kernel text+data
    • end 0x1154d0 in main.c
  3. end ~ PHYSTOP(0xe000000): Free Memory
    • end ~ 4M kinit1 初始化
    • PHYSTOP 物理内存终点, kmap 定义, kvmalloc 中初始化
  4. DEVSPACE(0xfe000000) ~ 4G: Memory-mapped 32-bit I/O Devices
    • DEVSPACE memory mapped direct
    • devices such as ioapic
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/whc_softHardware/xv6-course.git
git@gitee.com:whc_softHardware/xv6-course.git
whc_softHardware
xv6-course
xv6-course
master

搜索帮助

D67c1975 1850385 1daf7b77 1850385