[ 1] linux0.11引导程序阅读注释。 [ 2] linux0.11由实模式进入保护模式程序阅读注释 。
篇幅较长,可通过浏览器的搜索功能(Ctrl + f)搜索函数名了解相应函数的实现机制,如 setup_gdt。
[3] linux0.11护模式初始化程序阅读注释
在head.s即[0x0, …]内存中重新设置IDT和GDT。将操作系统数据段加载到各数据段寄存器, 设置ss:esp所维护的栈内存。设置页表目录、页表并开启页机制, 随后跳转执行init/main.c中的main函数。
回想从bootsect.s开始到head.s结束, 在这个过程中所学到的隐藏在其背后的计算机基础知识, 还是有些振奋。
head.s
/*
* linux/boot/head.s
*
* (C) 1991 Linus Torvalds
*/
/*
* head.s contains the 32-bit startup code.
*
* NOTE!!! Startup happens at absolute address 0x00000000, which is also where
* the page directory will exist. The startup code will be overwritten by
* the page directory.
*/
/* head.s包含了32位启动代码。
* 注,启动代码从物理地址0x00000000处开始。从0x00000000开始的部分启动代码将会被页目录覆盖。*/
# head.s中包含了32位初始化程序. #
# 注: 32位启动程序head.s始于物理内存地址0x00000000处,
# 随着head.s的执行, 页目录相关数据结构将覆盖head.s中的部分代码。#
.text
# 声明head.s中的以下标号为全局符号, 供后续C程序使用。
.globl _idt,_gdt,_pg_dir,_tmp_floppy_area
#
# 页表目录(数据结构)起始处。
_pg_dir:
#
startup_32:
# 进入保护模式后, 首先需将段描述符选择符加载给各段寄存器。
# 在给各数据段寄存器赋值时, 若合法的话,
# CPU会将段描述符选择符10h对应的段描述符的内容隐式加载到
# 数据段寄存器的隐藏部分。
movl $0x10,