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

相关文章

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添