注: 源代码参见我的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)的更多相关文章

  1. MIT jos 6.828 Fall 2014 训练记录(lab 6)

    源代码参见我的github: https://github.com/YaoZengzeng/jos 在这个实验中将实现一个基于Intel 82540M(又称E1000)的网卡驱动.不过,一个网卡驱动还 ...

  2. MIT jos 6.828 Fall 2014 训练记录(lab 4)

    源代码参见我的github: https://github.com/YaoZengzeng/jos Part A: Multiprocessor Support and Cooperative Mul ...

  3. MIT jos 6.828 Fall 2014 训练记录(lab 2)

    注: 源代码参见我的github:https://github.com/YaoZengzeng/jos Part1 : Physical Page Management mem_init函数: /*该 ...

  4. MIT jos 6.828 Fall 2014 训练记录(lab 5)

    源代码参见我的github: https://github.com/YaoZengzeng/jos File system perliminaries 我们开发的是一个单用户的操作系统,只提供了足够的 ...

  5. MIT jos 6.828 Fall 2014 训练记录(lab 3)

    注:源代码参见我的github: https://github.com/YaoZengzeng/jos Part A : User Environments and Exception Handlin ...

  6. MIT 操作系统实验 MIT JOS lab2

    MIT JOS lab2 首先把内存分布理清楚,由/boot/main.c可知这里把kernel的img的ELF header读入到物理地址0x10000处 这里能够回想JOS lab1的一个小问.当 ...

  7. 台州学院maximum cow训练记录

    前队名太过晦气,故启用最大牛 我们的组队大概就是18年初,组队阵容是17级生詹志龙.陶源和16级的黄睿博. 三人大学前均无接触过此类竞赛,队伍十分年轻.我可能是我们队最菜的,我只是知道的内容最多,靠我 ...

  8. MIT 操作系统实验 MIT JOS lab1

    JOS lab1 首先向MIT还有K&R致敬! 没有非常好的开源环境我不可能拿到这么好的东西. 向每个与我一起交流讨论的programmer致谢!没有道友一起死磕.我也可能会中途放弃. 跟丫死 ...

  9. MIT JOS学习笔记03:kernel 02(2016.11.08)

    未经许可谢绝以任何形式对本文内容进行转载! 本篇接着上一篇对kernel的分析. (5)pte_t * pgdir_walk(pde_t *pgdir, const void *va, int cre ...

随机推荐

  1. java File.mkdirs和mkdir区别

    File f = new File("e://xxx//yyy"); System.out.println(f.mkdirs());//生成所有目录,一般来说,这个方法稳健性更好, ...

  2. HTML 运算符、类型转换

    1.类型转换: 分为自动转换和强制转换,一般用强制转换. 其他类型转换为整数:parseInt(): 其他类型转换为小数:parseFloat(): 判断是否是一个合法的数字类型:isNaN(): 是 ...

  3. 再说Play!framework http://hsfgo.iteye.com/blog/806974

    这篇帖子的内容我本来想发到 http://www.iteye.com/topic/806660这里的主贴里去的,想挽回被隐藏的命运,但我写完本贴的内容,却发现为时已晚.好吧,我承认,上一个贴的标题容易 ...

  4. jQuery owlcarousel 旋转木马

    owlcarousel是一款猫头鹰旋转木马插件.OwlCarousel优势兼容所有浏览器支持响应式支持 CSS3 过度支持触摸事件支持 JSON 及自定义 JSON 格式支持进度条支持自定义事件支持延 ...

  5. 基于流的自动化构建工具------gulp (简单配置)

    项目上线也有一阵子,回头过来看了看从最初的项目配置到开发的过程,总有些感慨,疲软期,正好花点时间,看看最初的配置情况 随着前端的发展,前端工程化慢慢成为业内的主流方式,项目开发的各种构建工具,也出现了 ...

  6. RHEL7文件管理

    Linux系统目录结构 主要目录说明 目录 说明 / 通常称为根分区所有的文件和目录的起始点只有root用户对此目录拥有写权限 /home 普通用户的宿主目录 /root 超级用户的宿主目录 /dev ...

  7. SAP ALV标准范例程序介绍

    下面介绍几个学习ALV的SAP自带标准程序实例 1. BALVSD06 : Output flights (simple version + save)这是该系列范例最简单的一个,建议以此入门.使用的 ...

  8. 第一节 SOA的基本概念和设计思想

    WCF一直很火,一直也没有时间来静下心来学习新的技术.不知不觉已经做程序八年了,其中的时间基本都费了,刚入门时很火热,后来慢慢热情被琐事取代.现在开始学习JAVA和WCF,学JAVA的原因就是想做手机 ...

  9. 二叉查找树(binary search tree)详解

    二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于 ...

  10. 在xib中添加手势控件后运行可能会出现的错误

    如果出现错误: // -[UITapGestureRecognizer superview]: unrecognized selector sent to instance 0x8e407a0 // ...