0.11之路(六):创建进程1

进程0要做的第一件事就是作为父进程调用fork函数创建第一个子进程——进程1。

内核用last_pid来存放系统自开机以来累计的进程数,也将此变量用作新建进程的进程号。BTW,linux 0.11 的task[64]只有64项,最多只能同时运行64个进程。fork函数中有个很重要的函数叫 copy_process() 函数。

进程0依靠它完成对进程1的创建:

1) 为进程1创建task_struct,将进程0的task_struct的内容复制给进程1

2) 为进程1的task_struct、tss做个性化设置

3) 为进程1创建第一个页表,将进程0的页表项内容赋给这个页表

4) 进程1共享进程0的文件

5) 设置进程1的GDT项

6) 最后将进程1设置为就绪状态,使其可以参与进程间的轮转。

在copy_process内部还有一个重要的函数 get_free_page(),它在主内存申请一个空闲页面,并将申请到的页面清零,用于进程1的task_struct及内核栈。

完成进程1的task_struct设置后,接下来——

设置进程1的分页管理。每个进程都要加载属于自己的代码、数据。这些代码、数据的寻址都是用段加偏移的形式,也就是逻辑地址形式表示的。CPU硬件自动将逻辑地址计算为CPU可寻址的线性地址,再根据操作系统对页目录表、页表的设置,自动将线性地址转换为分页的物理地址。

线性地址(32位)= 页目录项(10位)+ 页表项(10位)+ 页内偏移 (12位)

CR3是页目录基址寄存器,保存页目录表的物理地址,页目录表总是放在以4K字节为单位的存储器边界上,因此,它的地址的低12位总为0,不起作用,即使写上内容,也不会被理会。

时间: 2024-10-06 00:41:31

0.11之路(六):创建进程1的相关文章

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 -- 缓冲区之后

0.11之路(四):从实模式到保护模式

(一)关中断并将system移动到内存地址起始位置 0x00000 将CPU的标志寄存器(EFLAGS)中的中断允许标志(IF)置0.这样系统不会再响应中断,直到main函数中能够适应保护模式的中断服务体系重建完毕才会打开,那时候响应中断的服务程序将不再是BIOS提供的中断服务程序,而是系统自身提供的. 就是要完成实模式下的中断向量表和保护模式下的中断描述符表(IDT)的交接工作.借助关中断(cli)和开中断(sti)完成这个过程的创建,即在创建过程中不能去响应中断,否则没有对应的中断程序,系统

0.11之路(三):system模块

现在载入第三批代码--system模块,仍然使用 int 0x13 中断. 这批代码要比之前多很多,所以需要一点时间,于是出现了 "Loading system -"的字样.但是,此时操作系统的main函数还没有执行,所以它是用汇编来实现的. system模块被加载至内存的 0x10000 往后的120KB空间中.这样整个操作系统的代码都加载至内存,最后要再次确定一下根设备号. 什么是根设备? 根文件系统设备(Root Device): 0.11使用的是Minix操作系统的文件系统管理

0.11之路(一):BIOS引导过程

BIOS在内存最开始的位置构建中断向量表,紧接着是BIOS数据区,此外还要有与中断向量表相应的中断服务程序.我们正是利用这些中断服务程序把内核加载到内存中. 中断是操作系统里的一个意义重大的概念,是一个技术手段. 加载内核程序并为保护模式做准备 对于Linux 0.11来说,计算机将分三批次逐次加载操作系统的内核代码,第一批由BIOS中断 int 0x19 把第一扇区 bootsect 的内容加载到内存:第二批.第三批在bootsect的指挥下,分别把其后的4个扇区和随后的240个扇区的内容加载

0.11之路(二):加载setup

BIOS将bootsect这个引导程序载入内存后,接下来就要靠bootsect来加载第二批和第三批程序. bootsect首先要做的工作就是规划内存. 实模式下,寻址最大范围是1MB(0xFFFFF).关于setup程序,在bootsect.s中要指定setup程序的扇区数和被加载到的位置(0x90200),此外还要指定启动扇区(也就是bootsect.s)被BIOS加载的位置(0x07c00)和将要移动到的新位置(0x90000),内核被加载的位置(0x10000)和内核的末尾位置,根文件系统

Thread create 创建进程

1 #include "windows.h" 2 #include "iostream" 3 #include "stdio.h" 4 5 void StartClone(int nCloneID){ 6 TCHAR szFilename[MAX_PATH]; 7 GetModuleFileName(NULL,szFilename,MAX_PATH); 8 9 TCHAR szCmdLine[MAX_PATH]; 10 sprintf(szCmd

20135201李辰希《Linux内核分析》第六周 进程的描述与创建

李辰希 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 操作系统的三大管理功能: 进程管理(最重要的) 内存管理 文件系统 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 进程控制块PCB task_struct: 进程状态 进程打开的文件 进程优先级信息 task_struct总体数据结构的抽象: tty:控制台 fs:文件系统

第六节 进程的描述和进程的创建

第六周 进程的描述和进程的创建 By 20135217 孙小博 本周的主要内容: 如何描述一个进程:进程描述符的数据结构: 如何创建一个进程:内核是如何执行的,以及新创建的进程从哪里开始执行: 使用gdb跟踪新进程的创建过程. 进程的描述 操作系统三大功能: 进程管理(最核心最基础) 内存管理 文件系统 进程描述符task_struct数据结构 task _ struct:为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息.struct task_struct

Linux内核分析:实验六--Linux进程的创建过程分析

刘畅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本次实验在MenuOS中加入fork系统调用,并通过GDB的调试跟踪,近距离的观察Linux中进程创建的过程.阅读Linux进程部分的源码,结合起来理解Linux内核创建新进程的过程. Linux中对进程的描述 Linux中task_struct结构体用于描述系统中的进程,对应x86机器的此结构体定义放在了/include/li