完整资料进入【数字空间】查看——搜索"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 卡挂载了,但实际上并没被挂载,所以才无法烧录。后来重启了虚拟机问题就解决了(只知其然,不知其所以然。怀疑是驱动或者虚拟机的问题。)
中国科学院计算技术研究所先进计算机系统实验室
标签:kernel,Bootblock,内存,C语言,内核,offset,设计,sd From: https://blog.51cto.com/u_16075443/6892975