练习四:分析bootloader加载ELF格式的OS的过程
 
1.bootloader如何读取硬盘扇区?
  (1)在练习3中实现了bootloader让CPU进入保护模式,下一步的工作就是从硬盘上加载并运行OS。参考指导书2.3.2节的硬盘访问概述后发现,bootloader的访问硬盘都是LBA模式的PIO(Program IO)方式,即所有的IO操作是通过CPU访问硬盘的IO地址寄存器完成。
  一般主板有2个IDE通道,每个通道可以接2个IDE硬盘。访问第一个硬盘的扇区可设置IO地址寄存器0x1f0-0x1f7实现的,具体参数见下图。一般第一个IDE通道通过访问IO地址0x1f0-0x1f7来实现,第二个IDE通道通过访问0x170-0x17f实现。每个通道的主从盘的选择通过第6个IO偏移地址寄存器来设置。  

  (2)硬盘数据存储在硬盘扇区中,一个扇区的大小为512B,读一个扇区的流程(bootmain.c中的readsect函数)如下:
      1、等待磁盘准备好;  
      2、发出读取扇区的命令;  
      3、等待磁盘准备好;  
      4、把磁盘扇区数据读到指定内存。  
  在bootmain.c中的waitdisk函数用来实现等待磁盘就绪的功能,readsect函数实现将磁盘扇区secno处的一个扇区读到指定内存dst处,这里是只能读一个扇区,详细步骤见下图代码及注释:
 
  (3)readseg函数:包装readsect,在offset处读取count个字节从内核到虚拟内存va,实现可以读取任意长度的内容,但可能比要求的复制得更多。详细见下图代码及注释:
 
  至此利用readseg函数和readsect函数就可以实现bootloader读取硬盘扇区了。
 
2.bootloader是如何加载ELF格式的OS?
(1)ELF header在文件开始处描述了整个文件的组织,ELF的文件头包含了整个执行文件的控制结构,其定义在elf.h中,如下图(含注释):
   
(2)bootmain函数,作为bootloader的入口,从硬盘读取8个扇区到内存0x10000处,并将其强制转换为elfhdr使用。然后根据头部的e_magic是否等于ELF_MAGIC判断ELF格式是否正确。之后根据描述表中的progeam header表的偏移量分别把程序段的数据读到内存中。详细代码及注释见下图:

ucore-lab1-练习4report的更多相关文章

  1. 《ucore lab1》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1:理解通过make生成执行文件的过程 详见<ucore lab1 exercise1>实验报告 练习2:使用qemu执行并调试 ...

  2. ucore lab1 bootloader学习笔记

    ---恢复内容开始--- 开机流程回忆 以Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0 ...

  3. 《ucore lab1 exercise5》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...

  4. 《ucore lab1 exercise3》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader进入保护模式的过程 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader.请分 ...

  5. 《ucore lab1 exercise2》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:使用qemu执行并调试lab1中的软件 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: 从CPU加电后执行的第一条指令 ...

  6. 《ucore lab1 exercise1》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:理解通过make生成执行文件的过程 列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关 ...

  7. ucore操作系统学习笔记(一) ucore lab1系统启动流程分析

    一.ucore操作系统介绍 操作系统作为一个基础系统软件,对下控制硬件(cpu.内存.磁盘网卡等外设),屏蔽了底层复杂多样的硬件差异:对上则提供封装良好的应用程序接口,简化应用程序开发者的使用难度.站 ...

  8. Ucore lab1实验报告

    练习一 Makefile 1.1 OS镜像文件ucore.img 是如何一步步生成的? + cc kern/init/init.c + cc kern/libs/readline.c + cc ker ...

  9. ucore lab1练习2 qemu+gdb 不能协作调试的问题make lab1-mon

    本练习是qemu结合gdb调试,但是我做实验的时候并不能像视频输入make lab1-mon那样顺利调试,期间有各种error,后来我找到原因,请看解决方法. 请先把ucore_lab文件删除,以下全 ...

  10. 《ucore lab1 exercise4》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader加载ELF格式的OS的过程 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代 ...

随机推荐

  1. Spring的applicationContext.xml的疑问解析

    Spring中注解注入 context:component-scan 的使用说明 通常情况下我们在创建spring项目的时候在xml配置文件中都会配置这个标签,配置完这个标签后,spring就会去自动 ...

  2. oracle 相关操作

    1,SqlPlus 的使用 1.01,软登入:sqlplus /nolog 1.02,登入 dba 用户:sqlplus /as sysdba 2,用户相关操作 2.01,创建用户:create us ...

  3. PHP Composer 包管理器的安装和使用

    一,包管理器的安装 01,首先确定 php 命令能够全局使用,要是不能请修改环境变量 02,使用 curl 命令安装 => curl -sS http://install.phpcomposer ...

  4. js/jquery this 坑

    重要:js onclick() 函数中,取不到this !!! 错误的写法: function test(){ $(this).parent().addClass('active') } 正确的写法是 ...

  5. Java快速开发平台强大的代码生成器,JEECG 3.7.5 VUE+ElementUI SPA单页面应用版本发布

    JEECG 3.7.5 VUE+ElementUI SPA单页面应用版本发布 此版本为Vue+ElementUI SPA单页面应用版本,提供新一代风格代码生成器模板,采用Vue技术,提供两套精美模板E ...

  6. 【JEECG技术文档】Jeecg高级查询器

    1. 背景 对于用户来讲查询功能按易用性分三个层次: 1)最简单查询操作是一个输入框,全文检索,如百度,后台实现技术使用搜索引擎,需要设计和建立索引,技术较为复杂,适用于文档和信息数据库检索,但是结果 ...

  7. UI5-学习篇-4-SCP-SAP WEB IDE登录

    1.注册SAP账号 登录SAP官网:https://www.sap.com/index.html 注册Register 填完相关信息,勾选条款,然后提交. 账号激活:完成后需到Email邮件中激活链接 ...

  8. css-图片垂直居中

    1. img { vertical-align: middle; }   2. <body> <div> <img src="1.jpg" alt=& ...

  9. select as table

    select order_time, max(sum_price) from (SELECT order, sum(price) as sum_price FROM orders group by o ...

  10. 切换用户身份su与sudo

    普通用户切换到root用户的方式有:su和sudo. 1,su - (su为switch user,即切换用户的简写) 格式:su -l USERNAME(-l为login,即登陆的简写) -l可以将 ...