文章目录
- 什么是操作系统
- 操作系统的形成
- 从程序看OS
- 提出问题:从hello world文件开始
- 目前编译器帮我们解决了诸多问题
- gcc的编译过程
- CPU的运作
- CPU对任务的切换
什么是操作系统
- 操作系统 Operating System 是一组控制和管理计算机 硬件 和 软件 资源合理地对各类作业进行 调度,方便用户使用计算机的程序集合。
- 操作系统的核心目标是,使系统资源的利用率高,系统的吞吐量大。
操作系统的形成
用户想要调用硬件,需要使用硬件的驱动程序,那么如果换了硬件就需要更换驱动,这样可移植性差,于是出现了操作系统。
操作系统负责提供设备驱动框架来驱动不同的底层设备,同时提供了用户接口框架给上层用户。
后来操作系统一并将软件驱动纳入,形成软件操作系统。
从程序看OS
提出问题:从hello world文件开始
- hello world文件在磁盘中是怎么存储的?
- 怎么存决定了怎么读
- 利用文件系统
- .c文件怎么变成让CPU认识的指令的?
2.1 是否这些指令所有CPU都认识呢?
2.2 是否编译成0101这种二进制文件系统就能运行了呢?- 我们现在的编程大多是 基于OS的程序设计
- 而还有一种就是裸机编程,程序可以不需要操作系统直接调动硬件
- 软件多次运行或者同时运行,CPU如何管理多个任务的?
- 对于运行时的数据如何进行内存存放,内存如何管理?
总结下来就是,操作系统如何进行:
- 管理CPU —— 进程和线程 —— 调度与同步机制
- 管理内存 —— 内存管理
- 管理磁盘 —— 文件系统
- 管理IO —— IO设备
目前编译器帮我们解决了诸多问题
编译器帮助我们解决了前两个问题:管理CPU和管理内存。
- 调用进程线程来运行程序
- 编译器链接内存地址
调用指令
gcc -v
可以看到如下信息:
目标:x86_64-redhat-linux
说明gcc编译的指令集是面向x86架构的CPU,作用于linux操作系统的
gcc(编译器)解决了文件对于不同架构的CPU与不同的操作系统的问题。
gcc的编译过程
指令:
gcc helo.c -E -o a.i # 将hello.c文件预处理
gcc a.i -S -o a.s # 对预处理后的文本文件进行编译
gcc a.s -c -o a.o # 对汇编文件进行汇编,生成二进制文件
gcc a.o -o a.out # 对各种库和文件进行链接,生成可执行文件
cc1 hello.c -o /tmp/cceVNE1I.s # 编译器ccl gcc -S
as -o /tmp/cc8ATX9H.o /tmp/cceVNE1I.s # 汇编器as gcc -c
ld -o build /tmp/cc8ATX9H.o ...../*.o -lc # 链接器ld gcc
指令:
file a.out
可以调出可执行文件适用的CPU,操作系统等信息
CPU的运作
CPU通过缓存对内存进行调度,其中,内存分为两种:
- 数据内存:存放数据。
- 控制器:
- 在硬件通信中,需要高低电压的信号来互相通信,而高低电压的持续时间需要软件控制,而代码中会需要进行休眠来控制电压持续时间,如果CPU自己来做,就会造成CPU休眠(死机),所以创造出了控制器。
- CPU告诉控制器,我需要什么类型的信号,由控制器进行操作,这样就能让CPU在控制器发信号和休眠的时间内做其他事情了。
CPU对任务的切换
CPU在执行程序的时候,如何实现对任务的切换呢?
例如,对一个C程序:
#include <stdio.h>
int reslut() {
int a = 1;
int b = 2;
return a + b;
}
int main() {
int k = reslut();
return 0;
}
- CPU开始执行main()
- 跳转到reslut()
- 在CPU的寄存器内记录下a, b的数据,然后进行运算
- 跳转回main()
那CPU是怎么知道要跳转到哪里的?
- CPU的寄存器中有一个名叫程序计数器(Program Counter, PC),程序计数器指示了下一条需要从内存中提取的指令的地址。当指令被提取后,程序计数器会自动更新为下一条需要提取的指令的地址,从而确保指令能够按正确的顺序执行。
- 另一个重要的寄存器是 栈指针(Stack Pointer, SP)。栈指针指向内存中当前栈的顶端。它包含了函数调用过程中传递的参数、局部变量以及未保存在寄存器中的临时变量。通过堆栈指针,CPU可以管理函数调用期间的数据和返回地址。
- 在进行多任务时,由于CPU内寄存器只有那么多,所以在切换任务前,PC 指针会保存当前任务的下一条语句的地址,然后将栈指针SP以及栈内的数据保存到内存的TCB任务控制块中,之后再跳转到另一个任务中。在任务完毕时,根据PC指针位置跳转,然后将对应数据从内存下载到栈内,这就是CPU和内存间的load/store操作。
- 任务切换,也称上下文切换(Context Switch)