首页 > 其他分享 >基于C语言设计的Bootblock设计

基于C语言设计的Bootblock设计

时间:2023-07-29 15:01:31浏览次数:32  
标签:kernel Bootblock 内存 C语言 内核 offset 设计 sd

完整资料进入【数字空间】查看——搜索"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 卡挂载了,但实际上并没被挂载,所以才无法烧录。后来重启了虚拟机问题就解决了(只知其然,不知其所以然。怀疑是驱动或者虚拟机的问题。)


中国科学院计算技术研究所先进计算机系统实验室

基于C语言设计的Bootblock设计_解决方法

基于C语言设计的Bootblock设计_解决方法_02

基于C语言设计的Bootblock设计_函数参数_03

基于C语言设计的Bootblock设计_解决方法_04

基于C语言设计的Bootblock设计_解决方法_05

基于C语言设计的Bootblock设计_偏移量_06

标签:kernel,Bootblock,内存,C语言,内核,offset,设计,sd
From: https://blog.51cto.com/u_16075443/6892975

相关文章

  • C语言【怎么定义变量?】
    变量定义的目的是向编译器说明在哪里创建变量的存储,并指明如何创建变量的存储方式。变量定义会明确指定一个数据类型,并包含一个或多个变量的列表。例如:typevariable_list;在这里,"type"必须是一个合法的C数据类型,可以是"char"、"w_char"、"int"、"float"、"double",或者是用户自......
  • 基于C语言设计的全局光照明模型
    完整资料进入【数字空间】查看——搜索"writebug"Part1Whitted-StyleRayTracingStep0.算法流程为了渲染出一张图片,RayTrace()计算了给定像素点的色彩取值。根据光路可逆原理,可以从人眼作为出发点,沿着指向该pixel的某一点的方向发出一条ray。Step1:射线求交这条ray会碰到一个......
  • 【环境属性AmbientValueAttribute】使用ShouldSerialize 和 Reset 方法定义默认值----
    今天和大家讲解下关于winform控件的 环境属性AmbientValueAttribute 开发,net自带标准控件库里面的Control基类里面有些属性会根据父容器的属性变化而变化的,其中最常用环境属性包括BackColor、ForeColor、Font、Cursor。在这里不得不吐槽微软把所有技术文档全放在一个网站,用他的......
  • PPT| 集团SRM项目业务蓝图设计方案P60
    PPT共60页,由于篇幅有限,以下为部分资料,需要PPT资料的朋友可以关注我,私信我。......
  • 2020年百度程序设计大赛初赛
     解题思路:签到题。首先找出最少补充x[i]需要消耗掉多少瓶水。从而在得到摄入的最小值importjava.util.Scanner;importjava.util.Collections;importjava.util.ArrayList;importjava.util.StringTokenizer;publicclassMain{publicstaticvoidmain(String[]arg......
  • c语言学习笔记5
    内存空间在C语言中,内存空间可以被划分为以下几个部分:1.栈(Stack):这部分内存由编译器自动分配和释放,用于存放函数的参数值,局部变量等。其操作方式类似于数据结构中的堆栈,先进后出。2.堆(Heap):堆是用于动态内存分配的。与栈不同,堆的分配和释放必须由程序员自己操作。在C语言中,使用m......
  • Java设计模式-策略模式
    简介策略模式是指有一定行动内容的相对稳定的策略名称,策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法经验总结抽象策略角色:策略类,通常由一个接口或者抽象类实现具体策略角色:包装了相关的算法和行为环境角色:持有一个策略类的引用,最终给客......
  • 设计模式-备忘录模式在Java中使用示例-象棋悔棋
    场景备忘录模式备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,当前很多软件都提供了撤销(Undo)操作,其中就使用了备忘录模式。备忘录模式结构图 在备忘录模式结构......
  • 如何设计缓存,并且保证一致性
    设计缓存是一种常见的优化技术,用于存储常用数据,并在需要时快速检索。为了保证一致性,即缓存中的数据与数据源的数据保持同步,需要采取一些策略和技术来处理。以下是一个关于如何设计缓存并保证一致性的综合指南。了解缓存的基本概念:在设计缓存之前,首先要理解缓存的基本概念。缓存是......
  • 设计模式-中介者模式在Java中使用示例-客户信息管理
    场景欲开发客户信息管理窗口界面,界面组件之间存在较为复杂的交互关系:如果删除一个客户,要在客户列表(List)中删掉对应的项,客户选择组合框(ComboBox)中客户名称也将减少一个;如果增加一个客户信息,客户列表中需增加一个客户,且组合框中也将增加一项。中介者模式概述如果在一个系统......