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 ...
随机推荐
- 重新想象 Windows 8 Store Apps (53) - 绑定: 与 ObservableCollection CollectionViewSource VirtualizedFilesVector VirtualizedItemsVector 绑定
[源码下载] 重新想象 Windows 8 Store Apps (53) - 绑定: 与 ObservableCollection CollectionViewSource VirtualizedF ...
- 重新想象 Windows 8.1 Store Apps (73) - 新增控件: DatePicker, TimePicker
[源码下载] 重新想象 Windows 8.1 Store Apps (73) - 新增控件: DatePicker, TimePicker 作者:webabcd 介绍重新想象 Windows 8.1 ...
- 当使用母版页时JavaScript客户端获取服务器控件的Id
当使用MasterPage.UserControl等容器时,为了避免控件的重复命名,asp.net会自动将容器中的控件生成一个ClientID(Control Tree中的可生成,否则不会生成). J ...
- FreeBSD的新一代包管理工具Pkg 1.3.0 发布
Pkg 是 FreeBSD 下一代的打包管理工具,用来替代原来的 pkg_info/pkg_create/pkg_add 工具,可以本地打包,也提供远程打包,主要是为了方便远程二进制包升级. Pkg ...
- Titanium开发环境搭建第一个坑
操作系统: Ubuntu 12.04 LTS AMD64 在Titanium Studio中,装Titanium CLI怎么都不能成功,到了一个进度,发现卡在那里,硬盘一直狂闪,发现在Studio的文 ...
- ahjesus mongodb指定到数据盘连接不上的解决方案
关于配置路径指定到数据盘会出现连接不上的情况 我发现是因为数据盘权限不足引起的,目前没找到治本的方法 有个治标的方法就是设置数据盘的权限和用户 sudo chmod 777 * -R /path/d ...
- 最全的前端开发面试题及答案(js,css等等)
点击链接 https://github.com/HerbertKarajan/Fe-Interview-questions 我会不断的更新...... 若想自己留着,可以fork一下. 如果觉得不错, ...
- css三角形的实现
实底三角形: <html> <head> <title></title> <style type="text/css"> ...
- GTD3年来读的52本书
2012年 1.一生的计划 平衡:人生要在精神.理财.教育和娱乐4个方面进行平衡. 2.重来REWORK 小型软件公司的创业与软件项目的管理 不要管全年计划,只要找出下一项最重要的任务,然后起 ...
- mac svn client 设置
经过谷歌和百度N次后,终于搞定SVN的升级,Intellij Idea和Xcode5.1都可以正常使用. 步骤: 1. 下载Subverion的Max安装版.(推荐.使用其他brew和port都试过, ...