MIT jos 6.828 Fall 2014 训练记录(lab 1)
注: 源代码参见我的github:https://github.com/YaoZengzeng/jos
Part 1: PC Bootstrap
+------------------+ <- 0xFFFFFFFF (4GB) 最高位的一部分内存被BIOS保留,用于一些32位设备的使用
| 32-bit | 当内存大于4GB的时候,这一部分内存就会成为另一个hole
| memory mapped |
| devices |
| |
/\/\/\/\/\/\/\/\/\/\ /\/\/\/\/\/\/\/\/\/\
| |
| Unused |
| |
+------------------+ <- depends on amount of RAM
| |
| |
| Extended Memory |
| |
| |
+------------------+ <- 0x00100000 (1MB) ---> BIOS 主要用于负责系统的初始化,例如初始化显卡,以及统计内存的大小,接着加载操作系统
| BIOS ROM |
+------------------+ <- 0x000F0000 (960KB)
| 16-bit devices, |
| expansion ROMs |
+------------------+ <- 0x000C0000 (768KB)
| VGA Display |
+------------------+ <- 0x000A0000 (640KB) --> 0~640KB是low memory, 640KB~1MB hole, 1MB~end extended memory
| |
| Low Memory |
| |
+------------------+ <- 0x00000000 在实模式下,physical address = 16 * segment + offset,处理器重置以后,执行的第一条指令位于[f000:fff0],因为BIOS位于这个区域内,而且一般第一条指令都是跳转指令,因为[f000:fff0]已经位于BIOS的末端了。 Part 2: The Boot Loader
1、一个扇区(sector)是512字节,是磁盘中的最小操作粒度,每次的读写操作必须是整数个扇区并且沿着扇区的边界进行。 2、如果一块磁盘是可以启动的,那么第一个扇区被称为启动扇区(boot sector),其中存放了boot loader的代码。当BIOS发现一个可启动磁盘的时候,它会将启动扇区加载到物理地址为0x7c00~0x7dff的区域,然后使用jmp指令跳转
到该地址,并将控制传递给boot loader。 3、boot loader主要有两个方面的作用,一方面用于将处理器从实模式转换为32位的保护模式,因为只有在保护模式下才能访问1MB以上的物理地址空间,另一方面通过x86特殊的IO指令,利用IDE磁盘特殊的设备寄存器,从IDE磁盘中读取
内核。 4、
(1)At what point does the processor start executing 32-bit code? What exactly causes the switch from 16- to 32-bit mode?
在boot/boot.S执行如下指令, 改变寄存器的状态:
lgdt gdtdesc
movl %cr0, %eax
orl %CR0_PE_ON, %eax
movl %eax, %cr0 (2)What is the last instruction of the boot loader executed, and what is the first instruction of the kernel it just loaded?
在boot/main.c 中((void (*)(void)) (ELFHDR->e_entry))();是boot loader的最后一条指令。 (3)Where is the first instruction of the kernel?
start address 0x0010000c (4)How does the boot loader decide how many sectors it must read in order to fetch the entire kernel from disk? Where does it find this information?
因为kernel是ELF格式的二进制文件,首先读取一个ELF的header,其中包含了kernel所有信息 5、ELF格式的二进制文件结构可以被认为有一个包含了各种加载信息的header(包括一个固定长度的ELF header和可变长度的program header),之后再跟随多个program section,其中program section
是一段连续的代码或数据并且能被加载到特定的内存地址。其中我们感兴趣的program section 包括:
.text: 程序的可执行指令
.rodata: 只读的数据
.data: 包含了程序的初始化数据
.bss: 紧跟在.data section之后,用于存放未初始化的全局变量。C语言中要求未初始化的全局变量的值都为0,因此在二进制文件中无需为它保留存储空间。linker只是记录了.bss段的大小和地址,loader或者
程序自身负责零化.bss段。 6、VMA(link address)是这个section期望开始执行的地址。LMA(load address)是这个section应该被加载到内存的地址。通常来说,link address和load address是一样的。 7、ELF header中有一个非常重要的字段叫e_entry,其中包含了程序的entry point的link address,也就是程序开始执行的地址。 Part 3: The Kernel
1、通常操作系统的内核会被链接并且运行在一个非常高的virtual address,例如0xf0100000,因为需要把低位的地址剩下给用户程序使用。但是因为许多机器没有高达0xf0100000的物理地址,因此我们不能将内核
直接放在那,所以我们使用了处理器的内存管理硬件将虚拟地址0xf0100000映射到0x00100000。这样既然内核的虚拟地址足够高,同时内核加载的物理地址仅仅位于BIOS之上,一般的机器都能满足条件。 2、
(1) Explain the interface between printf.c and console.c. Specifically, what function does console.c export? How is this function used by printf.c?
console.c export函数cputchar(),putch(...)->cputchar(...) (2)
Explain the following from console.c:
1 if (crt_pos >= CRT_SIZE) {
2 int i;
3 memcpy(crt_buf, crt_buf + CRT_COLS, (CRT_SIZE - CRT_COLS) * sizeof(uint16_t));
4 for (i = CRT_SIZE - CRT_COLS; i < CRT_SIZE; i++)
5 crt_buf[i] = 0x0700 | ' ';
6 crt_pos -= CRT_COLS;
7 }
将屏幕的内容向上移动一行
(4)Run the following code.
unsigned int i = 0x00646c72;
cprintf("H%x Wo%s", 57616, &i);
What is the output? "He11o World". (5) In the following code, what is going to be printed after'y='? (note: the answer is not a specific value.) Why does this happen?
cprintf("x=%d y=%d", 3); 3、当进入一个C函数时,先将被调用函数的五个参数压入栈中,接着再将当前执行函数的压入return instruction pointer(eip,一般是call指令的下一条指令)栈中,用于从被调用函数返回时继续执行当前函数。
最后将前一个函数的base pointer(ebp寄存器的内容)压入堆栈,然后再将当前esp寄存器的内容存入ebp寄存器中。由此开始新一轮函数的执行。
MIT jos 6.828 Fall 2014 训练记录(lab 1)的更多相关文章
- MIT jos 6.828 Fall 2014 训练记录(lab 6)
源代码参见我的github: https://github.com/YaoZengzeng/jos 在这个实验中将实现一个基于Intel 82540M(又称E1000)的网卡驱动.不过,一个网卡驱动还 ...
- MIT jos 6.828 Fall 2014 训练记录(lab 4)
源代码参见我的github: https://github.com/YaoZengzeng/jos Part A: Multiprocessor Support and Cooperative Mul ...
- MIT jos 6.828 Fall 2014 训练记录(lab 2)
注: 源代码参见我的github:https://github.com/YaoZengzeng/jos Part1 : Physical Page Management mem_init函数: /*该 ...
- MIT jos 6.828 Fall 2014 训练记录(lab 5)
源代码参见我的github: https://github.com/YaoZengzeng/jos File system perliminaries 我们开发的是一个单用户的操作系统,只提供了足够的 ...
- MIT jos 6.828 Fall 2014 训练记录(lab 3)
注:源代码参见我的github: https://github.com/YaoZengzeng/jos Part A : User Environments and Exception Handlin ...
- MIT 操作系统实验 MIT JOS lab2
MIT JOS lab2 首先把内存分布理清楚,由/boot/main.c可知这里把kernel的img的ELF header读入到物理地址0x10000处 这里能够回想JOS lab1的一个小问.当 ...
- 台州学院maximum cow训练记录
前队名太过晦气,故启用最大牛 我们的组队大概就是18年初,组队阵容是17级生詹志龙.陶源和16级的黄睿博. 三人大学前均无接触过此类竞赛,队伍十分年轻.我可能是我们队最菜的,我只是知道的内容最多,靠我 ...
- MIT 操作系统实验 MIT JOS lab1
JOS lab1 首先向MIT还有K&R致敬! 没有非常好的开源环境我不可能拿到这么好的东西. 向每个与我一起交流讨论的programmer致谢!没有道友一起死磕.我也可能会中途放弃. 跟丫死 ...
- MIT JOS学习笔记03:kernel 02(2016.11.08)
未经许可谢绝以任何形式对本文内容进行转载! 本篇接着上一篇对kernel的分析. (5)pte_t * pgdir_walk(pde_t *pgdir, const void *va, int cre ...
随机推荐
- [译]PrestaShop开发者指南 第一篇 基础
# 第一篇 基础 PS(PrestaShop简称)一开始就设定了能够在它的基础上很简单的构建第三方模块的机制,让它成为一款具有极高定制性的电子商务软件. PS的可以在三个方面进行定制: * 主题 * ...
- JMS学习(二)- JMS Message Model 组成介绍及消息头详解
一.前言 从本文起依次详细介绍JMS中的一些重要的概念,主要参考了官方的JMS1.1的文档,该文档很老了,是02年的,那年,JAVA还没有被Oracle收购..本文主要介绍Message及其相关概念, ...
- mongodb安装与使用
一.在linux服务器中安装mongodb 1.首先你要有一台安装有linux系统的主机 2.从mongoDB官网下载安装包:http://www.mongodb.org/downloads 3.将下 ...
- [python拾遗]列表
python列表拾遗 1.列表可以修改,使用 ‘+’ 将一个新列表附加在原列表的尾部: >>> a = [1,'a'] >>> b = a + [2,'b'] &g ...
- [下载] MultiBeast 6.2.1版,支持10.9 Mavericks。Mac上的驱动精灵,最简单安装驱动的方式。
下载地址1:http://pan.baidu.com/s/1i3ier9F 下载地址2:http://www.tonymacx86.com/downloads.php?do=cat&id=3 ...
- react与redux学习资料的整理
**重点内容**React学习 1.新手入门可以访问react的官方网站,如果英语不是特别好的同学可以访问中文版的,具体链接http://reactjs.cn/react/index.html 首页有 ...
- VS 2013 Preview 自定义 SharePoint 2013 列表 之 两个Bug
SharePoint 2013 已RTM了,对于程序员来说又要了解新功能了,同时 VS 2013 也将要 RTM了,两者同时应用定会有不新功能,我们先从 自定义 列表开始. SharePoint 20 ...
- 初次接触mootools
以下是今天所学代码,网上有这篇博客可供参考,另外还是推荐官方文档 ,以下是今天所敲代码: //用mootools创建类的方式: //方式1:用标准方式传入一个对象字面量 /* var Person = ...
- Office 365 - SharePoint 2013 Online 之母版页和页面布局
1.打开https://login.microsoftonline.com,登陆,点击SharePoint,如下图: 2.打开网站集,可以查看.添加.删除等管理操作: 3.打开一个站点,如下图: 4. ...
- 某网SQL注入漏洞实战
root@kali:~# sqlmap -u http://dn.you.com/shop.php?id=10 -v 1 --dbs available databases [8]: [*] ...