五分钟带你弄清楚系统调用,打通SOC和操作系统的次元壁

博文小编

2025-07-09


系统调用在Linux操作系统中扮演着至关重要的角色,它就像一座坚固而精细的桥梁,巧妙地连接着用户空间与内核空间这两个截然不同的世界。用户空间是应用程序的乐园,而内核空间则是操作系统管理硬件和软件资源的核心区域。由于内核空间拥有对系统硬件的直接访问权限和对系统资源的完全控制权,用户空间的应用程序需要通过系统调用来间接访问这些功能和资源。系统调用不仅是用户空间与内核空间之间的通信接口,更是确保系统安全和稳定的关键机制。通过系统调用,应用程序能够安全地请求操作系统执行底层操作,如文件读写、网络通信、进程管理等,而无须直接操作硬件或干预系统核心。这样,系统调用不仅促进了用户空间与内核空间的和谐共处,也极大地提高了系统的灵活性和可扩展性。
Linux系统调用是操作系统所实现的应用编程接口(Application Programming Interface,API),说简单点就是Linux内核对外提供的接口函数,对外就是指对一个个进程而言,进程通过系统调用完成自身所需的全部功能。
系统调用在每个平台的实现方式都不相同,ARM通过指令svc实现。之后会详细介绍系统调用流程,现在先以open为例讲讲系统调用的定义:

如果要在内核中增加一个系统调用,需先定义一个函数声明。如上所示,声明在open前面加上sys_以组成系统调用sys_open的声明。此函数声明看似简单,只是一个带有三个参数的普通函数,可是如果不知道系统调用辅助宏,用grep是永远也找不到sys_open的具体实现的。
*所以先来看看与系统调用相关的辅助宏定义:

这里,SYSCALL_DEFINE3宏用于定义带有3个参数的系统调用。在下面的代码里,__SYSCALL_DEFINEx把定义拆解成数字参数及参数列表,并定义与此系统调用相关的函数及编译选项。


知道了系统调用的辅助宏,再来看看最终open的具体定义:

接着看do_sys_open,这就是open系统调用的具体实现:


fd是一个整数,它其实是一个数组的下标,用来获取指向file描述符的指针,每个进 程都有一个task_struct描述符来描述进程相关的信息,其中有个files_struct类型的files字 段,里面有一个保存了当前进程所有已打开文件描述符的数组,而通过fd就可以找到具 体的文件描述符,其间的关系可以参考下图。

以上就是一个系统调用所要实现的全部代码,但这样还不够,还要把系统调用函数写进全局的系统调用列表里,此列表的定义如下:

可以看出,定义全局系统调用列表sys_call_table,以4KB对齐,最后还包含了系统调 用列表项的具体定义,如下所示:

这样,sys_openat2 系统调用的入口就写入 sys_call_table 列表里了。至此,系统调 用的定义部分的源码就分析完了,之后是系统调用的处理流程。
本文节选自《打通Linux操作系统和芯片开发》

读者评论

相关博文

  • 社区使用反馈专区

    陈晓猛 2016-10-04

    尊敬的博文视点用户您好: 欢迎您访问本站,您在本站点访问过程中遇到任何问题,均可以在本页留言,我们会根据您的意见和建议,对网站进行不断的优化和改进,给您带来更好的访问体验! 同时,您被采纳的意见和建议,管理员也会赠送您相应的积分...

    陈晓猛 2016-10-04
    5754 749 3 7
  • 迎战“双12”!《Unity3D实战核心技术详解》独家预售开启!

    陈晓猛 2016-12-05

    时隔一周,让大家时刻挂念的《Unity3D实战核心技术详解》终于开放预售啦! 这本书不仅满足了很多年轻人的学习欲望,并且与实际开发相结合,能够解决工作中真实遇到的问题。预售期间优惠多多,实在不容错过! Unity 3D实战核心技术详解 ...

    陈晓猛 2016-12-05
    3466 36 0 1
  • czk 2017-07-29
    6327 28 0 1