null第三章 系统的启动和初始化
(include lab1)第三章 系统的启动和初始化
(include lab1)提纲提纲系统的启动
显示输出
JOS操作系统的结构系统的启动系统的启动物理内存的分布
物理内存的0x000A0000 -0x00100000为VGA显示存储、BIOS ROM以及扩展ROM
物理内存的高端0xefffffff-0xffffffff往往被PCI设备的外设I/O所占据。
系统的启动(续)系统的启动(续)BIOS的加载
80386在
的时候必须考虑向下兼容性,所以80386以及其后的机器在启动后,仍然是处于实模式;
在PC启动的时候,首先会在实模式下运行BIOS;
PC启动的Bochs模拟演示系统的启动(续)系统的启动(续)BIOS加载完成后……
BIOS主要完成系统自检、以及启动前的准备工作(如让各个设备做好准备工作)
BIOS的工作完成后,BIOS将会读取硬盘的MBR(Master Boot Record,硬盘的第0柱面、0磁道、0扇区。512字节)到内存的0x7c00到0x7dff的位置(被装入的程序又被称为Boot Loader),紧接着再执行一个跳转指令将CS设置为0x0000,IP设置为0x7c00,即刚被装入的Boot Loader
找到JOS中Boot loader的程序系统的启动(续)系统的启动(续)JOS 中的 Boot Loader
Boot Loader的源程序是由一个叫做的boot.S的AT&T汇编程序与一个叫做main.c的C程序组成的。
boot.S主要是将处理器从实模式转换到32位的保护模式,这是因为只有在保护模式中我们才能访问到物理内存高于1MB的空间;
main.c的主要作用是将内核的可执行代码从硬盘镜像中读入到内存中。
理解boot.S,和main.c系统的启动(续)系统的启动(续)链接地址和加载地址
/boot/Makefrag
$(V)$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o $@.out $^
系统演示
系统的启动(续)系统的启动(续)ELF文件头
.text节:可执行指令的部分
.rodata节:只读全局变量部分
.stab节:符号
部分
.stabstr节:符号表字符串部分
.data节:可读可写的全局变量部分
.bss节:未初始化的全局变量部分,这一部分不会在磁盘有存储空间,因为这些变量并没有被初始化,因此全部默认为0,于是在将这节装入到内存的时候程序需要为其分配相应大小的初始值为0的内存空间
.comment节:注释部分,这一部分不会被加载到内存系统的启动(续)系统的启动(续)ELF文件头的数据结构
e_entry是可执行程序的入口地址
e_phoff和e_phnum可以用来找到所有的程序头表项
e_phoff是程序头表的第一项相对于ELF文件的开始位置的偏移
e_phnum则是表项的个数
e_ shoff和e_ shnum可以用来找到所有的节头表项struct Elf {
uint32_t e_magic; // 标识文件是否ELF文件
uint8_t e_elf[12]; // 魔数和相关信息
uint16_t e_type; // 文件类型
uint16_t e_machine;// 针对体系结构
uint32_t e_version; // 版本信息
uint32_t e_entry; // Entry point 程序入口点
uint32_t e_phoff; // 程序头表偏移量
uint32_t e_shoff; // 节头表偏移量
uint32_t e_flags; // 处理器特定
uint16_t e_ehsize; // 文件头长度
uint16_t e_phentsize;// 程序头部长度
uint16_t e_phnum; // 程序头部个数
uint16_t e_shentsize;// 节头部长度
uint16_t e_shnum; // 节头部个数
uint16_t e_shstrndx; // 节头部字符索引
};系统的启动(续)系统的启动(续)Code walk
ELF文件的装入显示输出显示输出在JOS中实现字符显示的过程
Code walk
8进制数据的显示JOS操作系统的结构JOS操作系统的结构分为boot和kern两个部分
kernel部分的程序链接地址和加载地址的
程序执行时,如何从链接地址转化到加载地址?
为什么要这样设计?JOS操作系统的结构(续)JOS操作系统的结构(续)Kernel部分
在void i386_init(void)函数中,有以下定义:
extern char edata[], end[];
然而,我们发现edata和end并没有在某个.h或者.c文件定义
kern.ld:
PROVIDE(edata = .);
.bss : {
*(.bss)
}
PROVIDE(end = .);
说明这两个变量都是在链接(生成ELF文件时)产生的地址,GCC会在生成二进制文件的时候将这两个符号置换成地址
GCC这一特性非常强大,在后面的实验中也会用到这一特性JOS操作系统的结构(续)JOS操作系统的结构(续)栈的原理(A)出栈操作(B)入栈操作JOS操作系统的结构(续)JOS操作系统的结构(续)简单Shell的实现
Code walk
JOS操作系统的结构(续)JOS操作系统的结构(续)Kern栈(stack)
初始化stack,stack的大小
函数调用时栈的变化
通过栈进行回溯null本章结束