介绍Linux下的系统调用过程

admin1个月前笔记28

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

image.png

首先,应用程序能直接调用的是系统提供的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获知想要调用的是哪一个系统调用。这样做的原因是系统调用数量太多,中断号会不够用,所以用一个来集中管理。

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


相关文章

高并发场景下如何优化服务器的性能?

高并发场景下如何优化服务器的性能?

写在前面最近,有小伙伴在群里提问:Linux系统怎么设置tcp_nodelay参数?也有小伙伴说问我。那今天,我们就来根据这个问题来聊聊在高并发场景下如何优化服务器的性能这个话题。其实,tcp_nod...

 如何解决MySQL主从复制太慢的问题

如何解决MySQL主从复制太慢的问题

mysql主从同步延迟原因导致备库延迟的原因主要有如下几种:通常备库所在机器的性能要比主库所在的机器性能差,执行备份自然会更慢。备库的读压力大。在备库过多的执行繁重的查询任务。大事务。因为主库上必须等...

十个方法,让我精通了lamada表达式

十个方法,让我精通了lamada表达式

一共整理了10个工具方法,可以满足 Collection、List、Set、Map 之间各种类型转化。例如将 Collection<OrderItem> 转化为 List<Order...

到底什么是AI框架?AI框架有什么用?

到底什么是AI框架?AI框架有什么用?

到底什么是AI算法?什么是神经网络?神经网络有什么用?为什么神经网络需要训练?什么是模型?AI框架有什么用?AI框架能解决什么问题?上面的几个问题其实还挺有挑战的。下面我们来对清楚一些基本概念:深度学...

专注docker安全:Security Scanning

专注docker安全:Security Scanning

今天我们宣布 Docker Security Scanning(Docker安全扫描,原名项目鹦鹉螺)全面上市。Security Scanning 目前以一个服务附加在 Docker Cloud 私有...

目前AI最火两大软件,MJ和SD有何不同

目前AI最火两大软件,MJ和SD有何不同

今年被称为AI元年,很多AI软件风起云涌的爆发。而众多AI工具中,最被人熟知就是 Midjourney 和 stable diffusion。 那么这两款主流工具有什么区别呢?超级美工, 目前AI最火...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。