6.1 受限制的直接执行

6.1 受限制的直接执行

受限制的直接执行:分成两部分来进行阐述“直接执行”和“受限制的操作”

直接执行协议

操作系统 程序
在进程列表上创建条目
微程序分配内存
将程序加载到内存
根据 argc/argv 设置程序栈
 
清除寄存器
执行call main()方法
 
  执行main()
从main中执行return
释放进程的内存
将PCB从进程列表移除
 

受限制的操作

处理器模式

处理器模式(一):用户模式

在用户模式下,运行的代码会受到限制,例如:在用户模式下运行时,进程不能发出I/O请求。如果执行特权代码,会引发异常,操作系统可能会终止进程。

处理器模式(二):内核模式

操作系统(内核)在内核模式下运行。在该模式下,运行的代码可以进行特权操作。

系统调用

用户进程希望执行特权操作:系统调用

它允许内核小心地向用户程序暴露某些关键功能,例如访问文件系统、创建和销毁进程、与其他进程通信、分配内存等。

系统调用过程:执行系统调用,程序必须执行特殊的陷阱指令。该指令跳入内核并将处理器模式转变为内核模式,然后执行系统调用的功能。完成之后,操作系统调用一个特殊的从陷阱返回指令,返回用户程序的同时,将处理器模式转变为用或是。

陷阱表

陷阱表存放各个系统调用(系统调用本身也是程序)的入口地址。内核在启动时设置陷阱表。

C的系统调用

C语言的许多库函数就是系统调用,比如open()、read()等。它们看起来是函数的调用,在更底层(真正的系统调用)的部分,使用的是汇编手工编码,因为要仔细遵循约定,一边正确处理参数和放回置。

受限制的直接执行

操作系统@启动时(内核模式) 硬件 用户程序(用户模式)
初始化陷阱表 记住系统调用处理程序的地址  
在进程列表上创建条目
微程序分配内存
将程序加载到内存
根据 argc/argv 设置程序栈
用寄存器/程序计数器填充内核栈
从陷阱返回
   
操作系统@运行时(内核模式) 硬件 用户程序(用户模式)
从内核栈恢复寄存器
转向用户模式
跳转到main
   
    运行main
...
调用系统调用
陷入操作系统
  将寄存器保存到内核栈
转向内核模式
根据陷阱表跳到陷阱处理程序
 
处理陷阱
做系统调用的工作
从陷阱返回
   
  从内核栈恢复寄存器
转向用户模式
跳回用户程序调用
 
    ......
从main返回
陷入系统调用(通过exit())
释放进程的内存
将PCB从进程列表移除
   
发布了213 篇原创文章 · 获赞 116 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/104081478
6.1