0号进程诞生过程(linux0.11)

实模式:

a. bios将MBR引导代码加载到0x7c00, 随后主扇区代码将自己放到0x9000代码段继续执行

b. 主扇区代码加载setup模块,并打印系统加载字符串,跳到setup模块执行

c. setup模块最后用bios的中断程序读取硬件参数,保存到0x9000开始的位置,将系统写到0地址

d. setup模块进入保护模式,随后执行 jmpi 0:8,此时线性地址等价于物理地址,分段。跳到0地址处执行,系统模块开始初始化系统

保护模式:

e. 系统模块引用了sched.c文件定义的栈作为0进程的用户栈

f. 初始化gdt表,idt表,将main函数地址压入用户栈,开始配置页表

g. 将0地址作为0号进程的页目录表。(linux0.11只设置4个页表,寻址16MB)

h. 设置EFLAGS分页位,配置页表完成。

i. 处理器要求开启分页模式后,执行一条转移指令来刷新cpu的预取指令队列,在这里linux0.11用ret弹栈,跳到main函数执行,main函数调用sched_init()函数。

sched_init():

j. 在sched_init()函数中诞生了真正的带有内核栈的0号进程

k. 在gdt中设置了0号进程的ldt和tss段,并设置了ldtr,tr寄存器

l. 清除NT标记位(用于后面切换用户模式,不引起任务切换),填0x80系统调用中断

The previous task link field of the TSS (sometimes called the “backlink”) and the NT flag in the EFLAGS register are used to return execution to the previous task. EFLAGS.NT = 1 indicates that the currently executing task is nested within the execution of another task.

                       引用自intel手册卷3章7 task switching部分

NT位为任务嵌套位标记,当置为1时,执行段跳转指令(jmp,iret,call等)会导致tr寄存器被重新加载,切换到tss描述符中的back_link所引用到的tss,从而回到上一个任务继续执行。

move_to_usermode():

m. 调用move_to_usermode宏模拟非tss切换中断返回,切换到用户态。

n. 0号进程至此创建完成,系统进程环境基本创建完成,随后0号进程通过系统调用初始化系统的其他模块,如根文件系统等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值