文档章节

MIT 6.828 main.c文件分析

FeanLau
 FeanLau
发布于 01/22 20:49
字数 863
阅读 11
收藏 0
#include <inc/x86.h>
#include <inc/elf.h>
 
/*这是一个简单粗略的boot loader,它唯一的工作就是
从硬盘的第一个扇区启动格式为ELF的内核镜像
硬盘布局
这个程序(包括boot.S和main.c)组成了bootloader,
它应该存储在硬盘的第一个扇区
第二个扇区存储着内核映像
内核映像必须为ELF格式的
启动步骤
当CPU启动时,它加载BIOS到内存中并且执行BIOS
BIOS程序初始化设备,设置中断例程,并且将启动装置(例如硬盘)
中的第一个扇区的内容加载到内存,并且跳转到那里
假设这个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 reaady
	while ((inb(0x1F7) & 0xC0) != 0x40)
		/* do nothing */;
}
 
void
readsect(void *dst, uint32_t offset)
{
	// wait for disk to be ready
	waitdisk();
 
	outb(0x1F2, 1);		// count = 1
	outb(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 ready
	waitdisk();
 
	// read a sector
	insl(0x1F0, dst, SECTSIZE/4);
}

 

© 著作权归作者所有

共有 人打赏支持
FeanLau
粉丝 3
博文 224
码字总数 122232
作品 0
浦东
程序员
私信 提问
Caffeinated 6.828:练习 shell

通过在 shell 中实现多项功能,该作业将使你更加熟悉 Unix 系统调用接口和 shell。你可以在支持 Unix API 的任何操作系统(一台 Linux Athena 机器、装有 Linux 或 Mac OS 的笔记本电脑等)上...

作者: Mit
2018/05/06
0
0
MIT 6.828 OS lab Makefile 分析

lab1 中的Makefile主要是根目录下的GNUMakefile, kern/Makefrag, boot/Makefrag, 后两者通过include直接包含到GNUMakefile中。...

FeanLau
01/22
0
0
Linux GCC编译使用动态、静态链接库

在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。 动态链接库的好处就是节省内存空间。 1、Linux下创建动态链接库 在使用GCC编译程序时,只需加上-shared选项即...

rivsidn
2018/05/09
0
0
P2Psim分析笔记(2)-程序架构简述

本文在我的博客《查理的书架》最早发布,并在第一时间更新到51CTO的《Nathan的技术空间》上。 这是我整理P2PSim这个仿真软件包的第二篇笔记。第一篇是《P2PSim在g++ 4.3下的编译》,在第一篇...

技术小胖子
2017/11/17
0
0
从xxx.c到xxx.exe,经历libxxx.a或者libxxx.so (未完)

================================================================ 从xxx.c到xxx.exe,经历libxxx.a或者libxxx.so。 ================================================================ 当......

Michael_Yuan
2012/07/23
0
2

没有更多内容

加载失败,请刷新页面

加载更多

网站漏洞检测之WordPress 5.0.0 修复方案

2019年正月刚开始,WordPress最新版本存在远程代码注入获取SHELL漏洞,该网站漏洞影响的版本是wordpress5.0.0,漏洞的产生是因为image模块导致的,因为代码里可以进行获取目录权限,以及文件...

网站安全
38分钟前
0
0
MySql 优化 group by 语句

默认情况下,Mysql 对所有 group by 的字段进行排序,如果查询包括 group by ,用户想要避免排序结果的消耗。可以指定 order by null 禁止排序。 mysql> EXPLAIN select * from sys_log gro...

嘴角轻扬30
今天
9
0
Linux分区&格式化&文件系统&LVM&扩容

硬件 磁盘由 盘片组、主轴马达、机械臂、磁头、驱动芯片和电路、接口等构成 2. 磁盘的分割 每个盘片很多同心圆分割为磁道 Trace 一组盘片的同径磁道叫做一个柱面 Cylinder 每个磁道又被分为很...

可数局部基
今天
5
0
刷leetcode第705题- 设计哈希集合

这个我可能做的不是很符合题意,虽然AC了,但是没有去用到hash函数之类的方式。同样使用了位运算来搞定这一切,简单易懂。上代码如下: typedef char MyHashSet;/** Initialize your data ...

锟斤拷烫烫烫
今天
4
0
【spring】- springmvc 工作原理

核心:前端控制器:DispatcherServlet 功能:MVC设计模式中的Controller角色,掌控全局 类图 原理 本质是将DispatcherServlet及关联的Spring上下文环境的初始化工作织入Servlet的生命周期内,...

ZeroneLove
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部