linux0.11源码分析-fork进程

如题所述

在操作系统中,Linux0.11源码中的fork函数执行流程分为启动和系统调用两个阶段。启动阶段首先在init/main.c中执行init用于启动shell,让用户执行命令。

在include/unistd.h中定义了宏,表示将__NR_fork的值复制给eax寄存器,并将_res与eax绑定。使用int 0x80中断后,系统调用函数system_call被调用,从sys_call_table中找到对应的函数执行。fork函数执行时,操作系统会在内核栈里保存相关寄存器,准备中断返回。

接着,操作系统通过int80调用system_call,在kernel/system_call.s中执行call _sys_call_table(,%eax,4)指令。内核栈中,因为是段内跳转,所以cs不需要入栈。ip指向call指令的下一句代码。执行call指令进入系统调用表。

在includ/linux/sys.h中,系统调用表是一个数组,根据eax即系统函数编号找到对应的函数执行。对于fork,__NR_fork值2被放入eax寄存器,%eax * 4找到sys_fork。执行sys_fork后,调用find_empty_process函数找到可用的进程号,并放入eax寄存器返回。

接着,系统调用执行copy_process函数建立新进程结构体并复制数据。新进程的ip出栈,执行完copy_process后,系统调用返回,内核栈状态改变。此阶段最后通过iret指令弹出寄存器,恢复中断前状态。

总结,fork函数通过复制当前进程结构体、处理信号并初始化新进程,实现父进程与子进程的创建与共享。子进程返回值为0,父进程返回新子进程的pid。通过fork函数的执行,操作系统能够高效地创建进程,实现多任务处理。
温馨提示:内容为网友见解,仅供参考
无其他回答

linux0.11源码分析-fork进程
在操作系统中,Linux0.11源码中的fork函数执行流程分为启动和系统调用两个阶段。启动阶段首先在init\/main.c中执行init用于启动shell,让用户执行命令。在include\/unistd.h中定义了宏,表示将__NR_fork的值复制给eax寄存器,并将_res与eax绑定。使用int 0x80中断后,系统调用函数system_call被调用,从sys...

通过do_execve源码分析程序的执行(上)(基于linux0.11)
execve函数是操作系统的关键功能,它允许程序转变为进程。本文通过剖析do_execve源码,揭示程序转变成进程的机制。do_execve被视为系统调用,其运行过程在前文已有详细解析,此处不再赘述。分析将从sys_execve函数开启。在执行_do_execve前,先审视内核栈。接下来,我们将深入理解do_execve的实现。在加载可...

Linux0.11main函数启动初始化(二)
在执行\/bin\/sh后,shell程序启动,至此,Linux0.11的初始化过程完成。用户可通过控制台输入命令与内核交互。printf函数产生格式化信息并输出至标准输出设备stdout,即屏幕显示。接下来,将详细分析进程管理。

windows 进程管理源代码详解,要详细的,
\/\/注意,内核态任务是不可抢占的,在0.11中,除非内核任务主动放弃处理器,它将一直运行。if(!cpl)return;\/\/调度schedule();} 4.进程的终止进程可以自己中止,也可以被中止信号中止。do_exit执行退出。如果它有子进程的话,子进程就会成为孤儿进程,这里会将它的孩子托付给进程1(即init进程)管理。在成为僵死进程之后,...

linux内核0.11 获取第一个空闲物理内存页的函数 get_free_page函数 问题...
1、std:方向位DF置位,即DI进行自减操作。2、repne; scasb 这两条组合指令实现循环比较。ecx初值为15*1024,al=0,di初值为&mem_map[15*1024-1],即从数组mem_map的最后一项开始,依次与al(=0)进行比较。假设数组第i项mem_map[i]==0,则结束循环,此时ecx=i, edi=&mem_map[i-1](...

如何开始学习Linux内核
对于Linux基本知识的学习,对一些初学者来说是枯燥乏味的,可以通过理解再背诵的方式先进行代码及语法的学习,然后进行实践操作,必须手动输入命令行,不要借助工具,这样可以更快速有效的掌握Linux。2. 学以致用 Linux学习的目的是应用,Linux基本知识是一些零散的技术,当没有应用在项目上时,我们无法理解...

如何排查expire
fork操作(在主线程中被执行)本身会引发延迟。在大多数的类unix操作系统中,fork是一个很消耗的操作,因为它牵涉到复制很多与进程相关的对象。而这对于分页表与虚拟内存机制关联的系统尤为明显。 对于运行在一个linux\/AMD64系统上的实例来说,内存会按照每页4KB的大小分页。为了实现虚拟地址到物理地址的转换,每一个进程...

相似回答
大家正在搜