0.11之路(五):激活进程0

linux的第一个进程——进程0。
Linux 0.11 是一个支持多进程的现代操作系统,所以我们需要进程管理信息数据结构:task_struct、task[64]、GDT等的支撑。

我们需要设置物理内存的分布:主内存区、缓冲区和虚拟盘。

memory_end —— 系统有效内存末端位置
main_memory_start —— 主内存区起始位置
buffer_memory_end —— 缓冲区末端位置
main_memory_start = buffer_memory_end —— 缓冲区之后就是主内存
如果要设置虚拟盘,将其放在缓冲区和主内存之间

1MB以内是内核代码和只有由内核管控的大部分数据所在内存空间,是绝对不允许用户进程访问的。1MB以上,特别是主内存区主要是用户进程的代码、数据所在的空间,所以采用专用用来管理用户进程的分页管理机制。这部分工作由mem_init()函数完成。

接下来执行trap_init()函数将中断、异常处理的服务程序与IDT进行挂接,逐步重建中断服务体系。

进程要想与块设备进行沟通,必须经过主机内存中的缓冲区,这是就要借助请求项来进行控制,根据请求项中的记录来决定当前需要处理哪个设备的哪个逻辑块。

接下来对串行口、显示器和键盘进行设置,以及开机启动时间。

tss_struct和task_struct是对一个进程很重要的数据结构,前者保存的是各种寄存器的信息,后者包含进程优先级、用户组、tss、ldt等进程基本运行信息。

我们通过sched_init()函数来初始化进程0,设置时钟中断,设置系统调用总入口(system_call),初始化缓冲区管理结构,初始化硬盘和软盘,之后开启中断。

最后一步,通过move_to_user_mode()将进程0由0特权级翻转到3特权级。CPU执行iret指令会将栈中的值自动按反序恢复给SS、ESP、EFLAGS、CS、EIP这5个寄存器。system_call对应的int 0x80中断会将3特权级翻转到0特权级,iret又会将0特权级翻转回3特权级,因此move_to_user_mode()利用iret的这个特性将进程0的由0特权级成功翻转为3特权级。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值