比如一个C程序helloworld执行的过程来看
#includeint main(int argc,char *argv[]) { puts{("hello world"); return 0; }
第一步:
用户:告诉操作系统执行hello world程序(如何告知?)
可能是命令行执行,双击图标等方法。
第二步:
1、操作系统:找到hello world程序的相关信息,检查类型是否是可执行文件;并通过程序首部信息确定代码和数据在执行文件中的位置并计算出对应的磁盘块地址(文件格式?)
windows(PE格式) linux(ELF格式)
2、操作系统:创建一个新的进程,并将hello world执行文件映射到该进程结构,表示由该进程执行hello world程序。
3、操作系统:为hello world程序设置CPU上下文环境并跳到程序开始处(假设调度程序选中hello world程序)
4、执行helloworld程序的第一条指令,发生缺页异常(缺页异常:是代码要读入内存,但是代码还在磁盘,没有读入内存)
5、操作系统:分配一页物理内存,并将代码从磁盘读入内存,然后继续执行helloworld程序(可能有多次缺页异常,就会分配多页内存,从磁盘写入内存)
第三步:
1、hello world进程执行puts函数(系统调用),在显示器上写一字符串
2、操作系统:找到要将字符串送往的显示设备,通常设备是由一个进程控制的,所以,操作系统将要写的字符串送给该进程
3、操作系统:控制设备的进程告诉设备的窗口系统他要显示的字符串,窗口系统确定这是一个合法的操作,然后将字符串转换成像素,将像素写入到设备的存储映像区
4、视频硬件将像素转换成显示器可接收的一组控制数据信号
显示器解释信号,激发液晶屏,我们就在屏幕上看到了“helloworld”