窥探 kernel --- 系统调用过程分析

2024-06-10 22:18

本文主要是介绍窥探 kernel --- 系统调用过程分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



本系列文章由张同浩编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7518568

邮箱:muge0913@sina.com






过程分析:

1、系统调用需要一个用户空间到内核空间的转换,不同的平台有不同的指令来完成这样的转换,这个指令也叫做操作系统陷入(operating systemtrap)指令。在linux中对于x86来说是用软中断0x80,也即是int $0x80。软中断由软件指令触发,硬中断由硬件触发。

通过软中断,系统会跳到一个预定的内核空间。它指向了系统调用处理程序(不是系统调用服务程序)system_call函数(arch/x86/kernel/entry32.h)。如上图。


2、system_call到服务程序

显然所有的系统调用都会跳到这个地址执行system_call函数。在执行int 0x80时系统调用号会被放入eax寄存器中。因为sys_call_table每个项占用4个字节。所以sys_call_table作为基地址,eax*4作为偏移量就可以找到对应的服务程序的地址。

系统调用的参数通过其他寄存器来传递。如


[cpp] view plain copy print ?
  1. write(unsignedint fd,const char *buf,size_t count)  
write(unsignedint fd,const char *buf,size_t count)

寄存器ebx,ecx,esi,edx来传递。但是前面我们说过,asmlinkage表示内核从堆栈中提取参数,而不是寄存器。因为在system_call执行时首先把这些寄存器压入堆栈了。从下面的代码中就可找到答案~~~

[cpp] view plain copy print ?
  1. ENTRY(system_call)  
  2.   
  3.      RING0_INT_FRAME             # can't unwind into user spaceanyway  
  4.   
  5.      pushl_cfi%eax              # save orig_eax  
  6.   
  7.      SAVE_ALL  
  8.   
  9.      GET_THREAD_INFO(%ebp)  
  10.   
  11.                        #system call tracing in operation / emulation  
  12.   
  13.      testl$_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)  
  14.   
  15.      jnzsyscall_trace_entry  
  16.   
  17.      cmpl$(nr_syscalls), %eax  
  18.   
  19.      jaesyscall_badsys  
  20.   
  21. syscall_call:  
  22.   
  23.      call*sys_call_table(,%eax,4)  
ENTRY(system_call)RING0_INT_FRAME             # can't unwind into user spaceanywaypushl_cfi%eax              # save orig_eaxSAVE_ALLGET_THREAD_INFO(%ebp)#system call tracing in operation / emulationtestl$_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)jnzsyscall_trace_entrycmpl$(nr_syscalls), %eaxjaesyscall_badsyssyscall_call:call*sys_call_table(,%eax,4)



系统服务程序从堆栈中获取参数,并修改,最后再通过堆栈返回修改后的数值。

不是所有的系统调用都有实际内容,如sys_ni_syscll在kernel/sys_ni.c中定义:

[cpp] view plain copy print ?
  1. asmlinkage long sys_ni_syscall(void){  
  2.   
  3. return -ENOSYS;  
  4.   
  5. }  
asmlinkage long sys_ni_syscall(void){return -ENOSYS;}



你会发现在sys_call_table中sys_ni_syscall占据了很多内容,其实它代表着已被淘汰的系统调用。

[cpp] view plain copy print ?
  1. .longsys_ni_syscall   /* old stty syscallholder */  
  2.   
  3. .longsys_ni_syscall   /* old gtty syscallholder */  
  4.   
  5. .longsys_access  
  6.   
  7. .longsys_nice  
  8.   
  9. .longsys_ni_syscall   /* 35 - old ftime syscallholder */  
  10.   
  11. .longsys_sync  
  12.   
  13. .longsys_kill  
  14.   
  15. .longsys_rename  
  16.   
  17. .longsys_mkdir  
  18.   
  19. .longsys_rmdir        /* 40 */  
  20.   
  21. .longsys_dup  
  22.   
  23. .longsys_pipe  
  24.   
  25. .longsys_times  
  26.   
  27. .longsys_ni_syscall   /* old prof syscallholder */  
     .longsys_ni_syscall   /* old stty syscallholder */.longsys_ni_syscall   /* old gtty syscallholder */.longsys_access.longsys_nice.longsys_ni_syscall   /* 35 - old ftime syscallholder */.longsys_sync.longsys_kill.longsys_rename.longsys_mkdir.longsys_rmdir        /* 40 */.longsys_dup.longsys_pipe.longsys_times.longsys_ni_syscall   /* old prof syscallholder */

如上面可知sys_ni_syscall代替了不用的stty和gtty和prof。其实只要是被内核淘汰的系统调用都会被sys_ni_systcall代替。之所以这样是为了老的程序在新的内核上运行时不至于出现大的问题。如不应调用这个系统调用却调用了那个系统调用了。

这篇关于窥探 kernel --- 系统调用过程分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049424

相关文章

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

Spring Boot 3 整合 Spring Cloud Gateway实践过程

《SpringBoot3整合SpringCloudGateway实践过程》本文介绍了如何使用SpringCloudAlibaba2023.0.0.0版本构建一个微服务网关,包括统一路由、限... 目录引子为什么需要微服务网关实践1.统一路由2.限流防刷3.登录鉴权小结引子当前微服务架构已成为中大型系统的标

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程