窥探 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

相关文章

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作