xv6-riscv学习笔记

加载系统

  • kernel.ld 描述可执行程序或库在目标内存中的布局方式。它定义了不同的程序段(如代码段、只读数据段、可读写数据段、未初始化数据段等)应该如何在内存中排列,以及指定了一些特殊符号的值,这些符号可以在程序的其他部分被引用,以了解内存布局的相关信息。
  • 内核text段加载到物理内存0x80000000处;随后是trampoline.S(用户和内核的跳转代码).这两段都是按页对齐的;随后是rodata,data,bss段.
  • entry.S 为每个核心配置内核栈,然后跳到start处.
  • start.c 执行一些只允许在机器模式下进行的配置,然后切换到主管模式。
  • main.c 初始化几个设备和子系统之后,它通过调用userinit 创建第一个进程(initcode)。

main.c

  • kinit(): 将所有空闲内存添加到freelist.
  • kvminit(): 设置内核空间pagetable.(除了trampoline 和 kernal stacks外,其他内存是直接映射)
  • kvminithart(): 内核页表指针存到satp中,开启页表.