阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

介绍Linux下的系统调用过程

70次阅读
没有评论

共计 952 个字符,预计需要花费 3 分钟才能阅读完成。

导读 在应用程序中,很多时候都会调用到系统调用来完成一些操作,可是系统调用是在内核态下才能调用,用户态下的应用程序是无法直接调用到的,那么操作系统是怎么处理这一过程的呢?本文的环境是基于 Linux 0.11,没有查证现代操作系统是否有所变化,不过基本思路应该差不多。
过程:

先来看一张图,有个大概的理解。

介绍 Linux 下的系统调用过程

首先,应用程序能直接调用的是系统提供的 API,这个在用户态(Ring3)下就可做到。

然后相应的 API 就会将相应的系统调用号保存到 eax 寄存器中(这一步通过内联汇编实现),之后就是使用 int 0x80 触发中断(内联汇编),进入到中断处理函数中(该函数是完全由汇编代码编写),这个时候就进入到了内核态(Ring0)了。

在中断处理函数中就会调用与系统调用号相对应的那个系统调用。在这个函数中,会把 ds、es 这两个寄存器设置为指向内核空间。这样一来,我们无法把数据从用户态中传到内核态啊(如 open(const char * filename, int flag, …) 中,filename 指针指向的字符串的地址是在用户空间中的,在内核空间相应的地方取的话根本没有该字符串),这该怎么办呢?中断处理函数中的 fs 寄存器被设置为指向了用户空间,所以问题得以解决。

在系统调用中就是进行相应的操作了,如打开文件、写文件等。

处理完后,将会返回到中断处理函数,返回值保存在 eax 寄存器中。

从中断处理函数中返回到 API,依旧是把返回值保存到 eax 寄存器中。这个时候就从内核态恢复成用户态。

在 API 中从 eax 中取出值,做相应的判断返回不同的值,用以表示操作完成情况。

为什么使用 int 0x80 中断能调用那么多系统调用?

在保护模式下,有各种各样的中断,而系统调用就和 0x80 号中断绑定。当要调用系统调用时,就触发 int 0x80,中断处理函数就通过 eax 获知想要调用的是哪一个系统调用。这样做的原因是系统调用数量太多,中断号会不够用,所以用一个来集中管理。

操作系统中有一个表,是用来保存各个系统调用函数的地址的。这个表是一个数组,所以通过下标就可以访问到不同函数的地址。故可以做到一个中断号 + 各样的系统调用号就管理多个系统调用。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计952字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中