前言
程序是怎么运行的,其主要包含以下阶段
阶段 | 描述 |
---|---|
编写代码 | 开发者使用编程语言编写源代码。 |
编译代码 | 编译器将源代码转换为机器代码或中间代码。 |
链接 | 链接器将目标文件和库文件合并为可执行文件。 |
加载到内存 | 操作系统将可执行文件加载到内存中。 |
执行程序 | CPU 逐条执行指令,运行时环境提供支持(如 CLR、JVM)。 |
实际就是CPU一条一条指令执行的过程。
一、内核程序VS应用程序
特性 | 内核程序(Kernel) | 应用程序(Application) |
---|---|---|
定义 | 操作系统的核心部分,管理硬件和提供基础服务。 | 运行在操作系统之上的软件,完成特定任务。 |
权限 | 高权限(内核模式),可直接访问硬件。 | 低权限(用户模式),需通过系统调用访问硬件。 |
功能 | 硬件管理、进程调度、内存管理、文件系统等。 | 完成用户任务,如文档编辑、网页浏览等。 |
稳定性要求 | 高,崩溃会导致系统崩溃。 | 较低,崩溃通常不会影响系统。 |
性能要求 | 高效,影响整个系统的性能。 | 视具体应用而定,通常不如内核严格。 |
运行环境 | 内核模式,常驻内存。 | 用户模式,依赖操作系统。 |
与硬件的关系 | 直接管理硬件,与硬件架构相关。 | 通过操作系统间接访问硬件,与硬件无关。 |
普通程序员编写的为“应用程序”,比如浏览器(如 Chrome、Firefox)、QQ这类;类似微软、苹果这类负责操作系统的实现,写的是“内核程序”,比如设备驱动程序(如显卡驱动、网卡驱动)。
- 应用程序运行在操作系统之上,完成用户任务,运行在用户模式;
- 内核程序操作系统的核心,管理硬件和提供基础服务,运行在内核模式=》负责管理电脑的所有硬件(比如 CPU、内存、硬盘、键盘、鼠标等),并且为其他程序提供服务。
其中,由于内核程序是“管理者”,有时会让CPU执行一些“特权指令”,比如“内存清零”这些比较重要的指令,这些指令影响重大,只能由“管理者”进行操作。
因此,应用程序只能使用“非特权指令”(进行加减乘除),内核程序使用“特权指令”。(CPU在设计的时候已经被划分了特权指令和非特权指令),
-》那么CPU如何区分应用程序和内核程序的指令呢?
这里需要引进CPU的两种状态内核态(核心态/管态)和用户态(目态):
当处于内核态的时候,说明此时运行的是内核程序,此时可以执行特权指令;反之,执行非特权指令。
-》如何判断CPU处于哪种状态(内核态/用户态)?
在CPU中有一个程序状态字寄存器(PSW),其中有个二进制位,“1”表示处于“内核态”,“0”表示“用户态”
-》CPU如何实现两种状态的切换?=》修改PSW标志位
1.电脑开机的时候,CPU处于“内核态”,内核程序先在CPU上运行
2.进入电脑的时候,我点开了QQ(应用程序)
3.此时,操作系统内核程序在合适时让出CPU给QQ(利用特权指令修改PSW标志位改为用户态),让QQ在CPU运行
4.此时,处于用户态
假设电脑此时被入侵,QQ被植入特权指令, 但由于此时处于“用户态”,按道理这个指令不能出现,所以此时就会引发中断信号,转换为“核心态”====》操作系统夺回CPU使用权,对异常事件进行处理,处理结束之后在把CPU使用权交给应用程序。
如此,便完成了两种状态的切换。