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中,开启页表.