C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C程序函数调用

C程序函数调用&系统调用

作者:by_mzy

这篇文章主要介绍了C程序函数调用&系统调用,需要的朋友可以参考下

理解程序的执行

我们要知道CPU可以自由地访问寄存器、内存。另外,程序是由操作系统执行的,所以操作系统能够控制程序的所有执行情况,限制程序的行为。

程序地执行过程:

函数调用

C语言函数调用关键

c语言函数调用的几个关键点在于:

系统调用

在 x86-64 架构上,当应用程序需要执行系统调用时,CPU 会从用户态切换到内核态,经历以下过程:

整个切换过程由硬件和操作系统内核共同完成,应用程序感知不到这个切换过程。这种基于硬件支持的用户态 - 内核态切换机制,能够大幅降低系统调用的开销,提高操作系统的整体性能。
需要注意的是,除了 syscall/sysret 指令,Intel 的 x86-64 架构也支持使用 int 0x80 软中断来执行系统调用,不过 syscall/sysret 方式通常更加高效。

cpu的特权级别(privilege level )

chatgpt告诉我们:Linux 系统通过以下几种方式来实现当前特权级别的切换:

在 Linux 中,大多数情况下都是通过系统调用和中断/异常处理来实现特权级切换。内核代码运行在 Ring 0 级别,用户态应用程序运行在 Ring 3 级别。当应用程序需要访问受保护的系统资源时,会通过系统调用陷入内核态,由内核代码执行相应的操作。中断和异常处理也会触发内核态的切换,内核负责处理各种硬件事件。总之,Linux 系统利用 CPU 硬件提供的特权级机制,通过系统调用、中断/异常处理、特权级切换指令等方式,实现了内核态和用户态之间的特权级切换,保证了系统的安全和稳定性。

Ring 0和Ring 3也有其他区别,例如Ring 0 程序可以执行所有的 CPU 指令集,包括特权指令。Ring 3 程序只能执行非特权指令集,无法直接执行特权级别的指令。

到此这篇关于C程序函数调用&系统调用的文章就介绍到这了,更多相关C程序函数调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文