标签:sys 实现 wait 变量 pid 完成 操作 总结 shell
存储程序计算机的主要思想是将程序存放在计算机存储器中,然后按存储器中的存储程序的首地址执行程序的第一条指令,以后就按照该程序中编写好的指令执行,直至程序执行结束。
冯诺依曼体系结构的主要特点是,CPU和内存是计算机的两个最主要组成部分,内存中保存着数据和程序指令,CPU从内存中取指令执行,其中有些指令让CPU做运算,有些指令让CPU读写内存中的数据。
其中运算器、存储器、控制器、输入设备和输出设备5大基本类型部件组成了计算机硬件。
程序计数器又成为指令指针,即为IP、EIP、RIP寄存器,负责存储将要执行的下一条指令在存储器中的地址。
CPU、内存和I/O设备通过总线连接。内存中存放指令和数据。
冯诺依曼体系结构的核心是存储程序计算机。
有些设备像内存芯片一样连接到处理器接口上,正因为处理器接口上可以挂多个设备和内存芯片所以才叫总线。
总线内部又分为地址总线、数据总线和控制总线。
计算机的三个法宝
函数调用堆栈框架
堆栈可以用来传递函数的参数,还提供局部变量的空间。
操作系统有两把宝剑:
中断上下文用来保存现场和恢复现场。
Linux操作系统采用0和3两个特权级别,分别对应内核态和用户态。用户态和内核态很显著的区分方法就是CS:EIP的指向范围。在内核态时,它可以是任意地址。在用户态时只能访问0x00000000~0xbfffffff的地址空间。
Linux下系统调用通过int 0x80中断完成,中断保存了用户态CS:EIP的值,以及当前的堆栈段寄存器的栈顶。
操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用。
API和系统调用是不同的
xyz,system_call,sys_xyz——API,中断向量,服务程序
当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数
在Linux中是通过执行int $0x80来执行系统调用的,这条汇编指令产生向量为128的编程异常。
内核实现了很多不同的系统调用,进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号的参数——使用EAX寄存器
system_call是Linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由EAX传递的系统调用号。
除系统调用号之外,参数不能超过六个——EBX,ECX,EDX,ESI,EDI,EBP
系统调用号将xyz和sys_xyz关联起来。
进程管理、内存管理和文件系统,对应三个重要的抽象概念进程、虚拟内存和文件。
进程描述符结构示意图如下:
进程状态转换图如下:
进程的创建:以fork函数为例
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char * argv[]) { int pid; /* fork another process */ pid = fork(); if (pid < 0) { /* error occurred */ fprintf(stderr,"Fork Failed!"); exit(-1); } else if (pid == 0) //pid == 0和下面的else都会被执行到(一个是在父进程中即pid ==0的情况,一个是在子进程中,即pid不等于0) { /* child process */ printf("This is Child Process!\n"); } else { /* parent process */ printf("This is Parent Process!\n"); /* parent will wait for the child to complete*/ wait(NULL); printf("Child Complete!\n"); } }
进程的切换
Linux内核调用schedule()函数进行进程调度,并调用context_switch进行上下文切换,调用switch_to来进行进程关键上下文切换。
可执行程序的执行环境
一般我们执行一个程序的Shell环境,我们的实验直接使用execve系统调用。
Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身
Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数
命令行参数和环境串都放在用户态堆栈中
动态链接分为可执行程序装载时动态链接和运行时动态链接(大部分使用前者);
通过这门课程,理解了计算机硬件的核心工作机制和用户态程序如何通过系统调用陷入内核,从实践的角度理解了操作系统内核。疫情期间很遗憾不能进行线下的教学,感谢老师在此期间的辛苦付出。
标签:sys 实现 wait 变量 pid 完成 操作 总结 shell
原文地址:https://www.cnblogs.com/donglinghuanxi/p/13275396.html