歌尔嵌入式面试题及参考答案
请介绍 xv6 的启动过程
xv6 的启动过程主要包含以下几个关键步骤:
- 初始引导:当 riscv 计算机上电时,pc 被默认设置为 0x1000,经过一系列指令后跳转到 0x80000000。这是因为 xv6 在编译时,会把引导程序放在 0x80000000 位置 。引导加载器会将 xv6 的内核装载到内存中从 0x80000000 开始的存储空间.
- 进入_entry 函数:在 machine mode 下,cpu 从 kernel/entry.s 的_entry 处开始执行 xv6。_entry 函数的主要作用是设置内核栈指针。它首先将 stack0 的地址赋给 sp 寄存器,然后通过一系列操作计算出每个 cpu 对应的栈起始地址,即 sp = stack0+(hartid*4096),从而为 xv6 运行 c 代码做好准备.
- 执行 start 函数:_entry 函数会调用 start () 函数。start () 函数主要完成了以下几件事:一是将 mstatus 从机器模式设置为特权者模式;二是将 main 函数地址写入 mepc;三是将 satp 设置为 0,关闭页表,即关闭虚拟地址转换功能;四是把所有中断和异常委托给 s-mode;五是打开中断;六是