歌尔嵌入式面试题及参考答案

请介绍 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;五是打开中断;六是配置物理内存保护,给予监督者模式访问所有物理内存的权限;七是进行定时器初始化;八是将 hart_id 存储到 tp 寄存器中,最后通过 asm volatile ("mret") 切换到监督者模式,并跳转到 main 函数.
  • 进入 m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大模型大数据攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值