基于C语言设计的Bootblock设计

本文详细介绍了Bootblock的设计过程,包括从SD卡读取内核到内存、调用PMON读盘函数、处理参数问题,以及解决在虚拟机中烧录image到SD卡时遇到的挂载问题。通过调试和理解elf文件,作者成功定位并修正了offset的错误,最终实现了Bootloader的功能。
摘要由CSDN通过智能技术生成

完整资料进入【数字空间】查看——搜索"writebug"

一、Project1 Bootloader 设计文档
中国科学院大学 [王苑铮]

1.1 Bootblock 设计流程
请至少说明以下内容

Bootblock 主要完成的功能

把 kernel 从 sd 卡读取到内存中的指定位置,之后跳转到内核的起始地址让内核开始执行。

Bootblock 被载入内存后的执行流程

依次把内核在内存中的起始地址、内核在 sd 卡中的偏移量、内核的大小存入函数参数寄存器,之后调用 pmon 的读盘函数将内核从 sd 卡读进内存,之后跳转到内核起始执行的函数地址

Bootblock 如何调用 SD 卡读取函数依次把内核在内存中的起始地址 addr、内核在 sd 卡中的偏移量 offset、内核的大小 size 存入函数参数寄存器,之后调用 pmon 的读盘函数,这个函数就会从 sd 卡偏移量 offset 开始,读出 offset 个字节,从 addr 起始存入内存

Bootblock 如何跳转至 kernel 入口

人在算出 kernel 的入口地址后,通过 jal 指令跳转到这个地址

任何在设计、开发和调试 bootblock 时遇到的问题和解决方法

第一次编写 bootblock 时,读盘函数的三个参数(内核在内存中的起始地址 addr、内核在 sd 卡中的偏移量 offset、内核的大小 size)全都不知道

解决方法:先随便填写三个数,然后用 make 编译,其打印结果中包含有我所需要的这三个参数,之后把这三个参数重新写进我的 bootblock.s 里,再重新 make 一遍,就得到有正确参数的 bootblock 了

把参数填进去后 bootblock 依然无法运行,怀疑是我有的参数填的不对

解决方法:offset 填的不对。我一开始填的是 kernel_phdr->poffset(因为打印信息里只有这个名字里有 offset),后来看 elf 的说明才知道这个是 kernel 起始地址在 kernel 的 elf 文件中的 offset,而不是 kernel 相对 sd 卡起始位置的 offset。读盘函数需要的 offset 是 padding up to 0x200 的 0x200。(一开始我没明白 pad up 在这里是什么意思,后来知道是填满扇区的意思,0x200 是十进制的 512,即一个扇区的大小)

虚拟机显示已连接 sd 卡,并且用 lsblk 命令也能看到 sdb 被挂载了,并且也显示了 3.7G 的存储容量,但是 image 无法被 dd 进 sd 卡

解决方法:分别换用了新卡、新板子,都不成功,说明不是硬件问题。把程序发给小伙伴烧进他的 sd 卡,在板子上能成功运行,说明不是程序问题。后来用 fdisk –l /dev/sdb,却没有 sdb 的信息,这说明虽然 lsblk 显示 sd 卡挂载了,但实际上并没被挂载,所以才无法烧录。后来重启了虚拟机问题就解决了(只知其然,不知其所以然。怀疑是驱动或者虚拟机的问题。)

中国科学院计算技术研究所先进计算机系统实验室在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值