#include <inc/x86.h>
#include <inc/elf.h>/*这是一个简单粗略的boot loader,它唯一的工作就是
从硬盘的第一个扇区启动格式为ELF的内核镜像硬盘布局
这个程序(包括boot.S和main.c)组成了bootloader,
它应该存储在硬盘的第一个扇区第二个扇区存储着内核映像内核映像必须为ELF格式的启动步骤
当CPU启动时,它加载BIOS到内存中并且执行BIOSBIOS程序初始化设备,设置中断例程,并且将启动装置(例如硬盘)
中的第一个扇区的内容加载到内存,并且跳转到那里假设这个bootloader存储在硬盘的第一个扇区,这个代码从BIOS接收了CPU控制权控制从boot.S文件开始--这个文件设置了保护模式和一个栈,这样
C代码就可以运行了,然后再调用bootmain()这个文件中的bootmain函数接过控制权之后,读取内核文件并且跳转到内核*///扇区的大小为512
#define SECTSIZE    512
//将内核加载到内存的起始地址
#define ELFHDR      ((struct Elf *) 0x10000) // scratch space//该函数的作用是读取一个节的内容,也就是读取一个扇区的内容
void readsect(void*, uint32_t);
//函数的作用是读取一个程序段
void readseg(uint32_t, uint32_t, uint32_t);void
bootmain(void)
{//定义了两个程序头表项指针struct Proghdr *ph, *eph;//将硬盘上从第一个扇区开始的4096个字节读到内存中地址为0x10000处readseg((uint32_t) ELFHDR, SECTSIZE*8, 0);//检查这是否是一个合法的ELF文件if (ELFHDR->e_magic != ELF_MAGIC)goto bad;//找到第一程序头表项的起始地址ph = (struct Proghdr *) ((uint8_t *) ELFHDR + ELFHDR->e_phoff);//程序头表的结束位置eph = ph + ELFHDR->e_phnum;//将内核加载进入内存for (; ph < eph; ph++)//p_pa就是该程序段应该加载到内存中的位置//读取一个程序段的数据到内存中readseg(ph->p_pa, ph->p_memsz, ph->p_offset);//开始执行内核((void (*)(void)) (ELFHDR->e_entry))();bad:outw(0x8A00, 0x8A00);outw(0x8A00, 0x8E00);while (1)/* do nothing */;
}//这个函数的作用是从ELF文件偏移为offset处,读取count个字节到内存地址为pa处
void
readseg(uint32_t pa, uint32_t count, uint32_t offset)
{//段的结束地址uint32_t end_pa;//计算段的结束地址end_pa = pa + count;//将pa设置为512字节对齐的地方pa &= ~(SECTSIZE - 1);//将相对于ELF文件头的偏移量转换为扇区,ELF格式的内核文件存放在第一个扇区中offset = (offset / SECTSIZE) + 1;//开始读取该程序段的内容while (pa < end_pa) {//每次读取程序的一个节,即一个扇区//也就是将offset扇区中的内容,读到物理地址为pa的地方readsect((uint8_t*) pa, offset);//将pa的值增加512字节pa += SECTSIZE;//读取下一个扇区offset++;}
}void
waitdisk(void)
{// wait for disk reaadywhile ((inb(0x1F7) & 0xC0) != 0x40)/* do nothing */;
}void
readsect(void *dst, uint32_t offset)
{// wait for disk to be readywaitdisk();outb(0x1F2, 1);     // count = 1outb(0x1F3, offset);outb(0x1F4, offset >> 8);outb(0x1F5, offset >> 16);outb(0x1F6, (offset >> 24) | 0xE0);outb(0x1F7, 0x20); // cmd 0x20 - read sectors// wait for disk to be readywaitdisk();// read a sectorinsl(0x1F0, dst, SECTSIZE/4);
}

MIT 6.828 main.c文件分析相关推荐

  1. MIT6.828 boot.S文件分析

    #include <inc/mmu.h># Start the CPU: switch to 32-bit protected mode, jump into C. # The BIOS ...

  2. MIT 6.828 lab1 part2

    Part 2: The Boot Loader 加载内核 为了理解boot/main.c,你需要知道ELF二进制文件是什么.当你编译和链接一个C程序(如JOS内核)时,编译器将每个C源文件('. C ...

  3. STM32 KEIL里的MAP文件分析

    一.要让Keil生成map文件,要设置: 再重新编译,没有错误后,就会生成map文件了. 二.map文件中相关概念: 段(section) :描述映像文件的代码和数据块. RO:Read-Only的缩 ...

  4. 【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )

    文章目录 前言 一.打包 Jar 文件和 Dex 文件 1.示例代码 2.打包 Jar 文件 3.打包 Dex 文件 二.反编译 Dex 文件 三.分析 Dex 文件 1.Student 类相关信息 ...

  5. MIT 6.828 JOS学习笔记12 Exercise 1.9

    Lab 1中Exercise 9的解答报告 Exercise 1.9: 判断一下操作系统内核是从哪条指令开始初始化它的堆栈空间的,以及这个堆栈坐落在内存的哪个地方?内核是如何给它的堆栈保留一块内存空间 ...

  6. 分析FLV文件分析和解析器的开源代码

    分析一下GitHub上一份FLV文件分析和解析器的开源代码 GitHub源码地址:功能强大的 FLV 文件分析和解析器 :可以将flv文件的视频tag中的h264类型数据和音频tag中的aac类型数据 ...

  7. STM32固件库文件分析

    STM32固件库文件分析 1.汇编编写的启动文件 startup/stm32f10x.hd.s:设置堆栈指针,设置pc指针,初始化中断向量,配置系统时钟,对用c库函数_main最后去c语言世界里. 2 ...

  8. startup_LPC17XX.s 启动文件分析

    startup_LPC17XX.s 启动文件分析 工程中startup_LPC17XX.s是M3的启动文件,启动文件由汇编语言写的,它的作用一般是下面这几个: 1)堆和栈的初始化 2)中断向量表定义 ...

  9. [免费专栏] Android安全之Android so文件分析「详细版」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

最新文章

  1. 解决Python模块报错:ModuleNotFoundError: No module name 'StringIO'
  2. python 输出log_Python常用模块logging——日志输出
  3. 十大迷你iPhone天气应用
  4. 图像浏览界面缩放和平移操作的实现
  5. 备抵附加账户的期末余额_会计账户的分类(二)
  6. 求连通域面积matlab
  7. php代码怎么看错在哪里,PHP代码不知道哪里错了。
  8. Hadoop学习曲线图
  9. 彻底理解Java的Future模式
  10. 学习笔记: yield迭代器
  11. WinForm框架开发教程 - 如何实现简单化开发?
  12. clover写入efi_Clover EFI Bootloader r5111 四叶草黑苹果引导程序下载
  13. Waiting for Jenkins to finish collecting data
  14. linux 中meltdown指令,宇宙最强,meltdown论文中英文对照版(二)
  15. 人可以活很多次,但是七年就是一辈子
  16. 函数连续性的无穷小定义
  17. java小数是怎么运算的_JAVA中小数的运算
  18. 限时秒杀┃“探月计划”来袭,美国米德天文望远镜助孩子观月赏月
  19. maya中英文对照_Maya 2018 英汉速查手册
  20. pv=nrt_中学物理之pV=nRT应用总结篇

热门文章

  1. One Button Combat
  2. [转载] pythonjson构建二维数组_python二维键值数组生成转json的例子
  3. [转载] python解析返回结果_python:解析requests返回的response(json格式)说明
  4. [转载] 用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
  5. [转载] python猜字谜游戏_Python Hangman猜字游戏
  6. SparkRDD内核
  7. python中break continue exit() pass区别
  8. Mac OS 10.12 - 如何关闭Rootless机制?
  9. Sphinx安装与基本设置
  10. 《精通.Net核心技术》