《Linux内核分析》(五)——Linux系统调用的执行过程_linux dispatch();-程序员宅基地

技术标签: 系统调用  linux  内核  Linux内核分析课  system-cal  

作者:Sandy 原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
实验环境:c+Linux64位 (32位系统可能结果会不同)
依照学术诚信条款,我保证此回答为本人原创,所有回答中引用的外部材料已经做了出处标记。


一,系统调用的内核源码

1,内核中关于系统调用的源码。
上一周的课程分析了系统调用的整体流程,本文主要是从Linux内核源码的层次来分析系统调用的执行;本文使用到的内核的源码都能够在这里查看Linux内核源码;其中系统调用分派表(dispatch table)位于文件\arch\x86\syscalls\syscall_32.tbl,该文件标志了内核的系统调用的系统调用号;而系统调用的内核源码则位于/linux-3.18.6/arch/x86/kernel/entry_32.S,该文件的内核源码是系统调用执行的主要代码,也是本文分析的重点。

2,系统调用在内核中的调用方式。
在之前的分析Linux内核启动的课程中,在\init\main.c 的start_kernel中有这样的调用:

trap_init()

当时分析过这一模块主要是对系统调用进行初始化,该函数的位置:/arch/x86/kernel/traps.c,其中有如下代码:


#ifdef CONFIG_X86_32
    set_system_trap_gate(SYSCALL_VECTOR, &system_call);
    set_bit(SYSCALL_VECTOR, used_vectors);
#endif

其中SYSCALL_VECTOR是系统调用中断向量,而system_call虽然声明成了函数的形式(asmlinkage int system_call(void);),但是其实是一段汇编代码的入口;上述代码实现的功能是:一旦执行命令 “int $0x80”后,就会转移到system_call处,即通过软中断实现了向内核态的转变。
再次回想一下system_call的位置及重要功能:
call_flow

程序执行系统调用大致可归结为以下几个步骤:
1、程序调用libc 库的封装函数。
2、调用软中断int 0x80 进入内核。
3、在内核中首先执行system_call 函数(首先将系统调用号(eax)和可以
用到的所有CPU寄存器保存到相应的堆栈中(由SAVE_ALL完成)),
接着根据系统调用号在系统调用表中查找到对应的系统调用服务例程。
4、执行该服务例程。
5、执行完毕后,转入ret_from_sys_call 例程,从系统调用返回

system_call定义在/linux-3.18.6/arch/x86/kernel/entry_32.S内,接下来,通过分析system_call的代码来研究系统调用的实现流程。

二,系统调用处理程序

在entry_32.S内定义的系统调用处理程序太过于繁琐, 首先把其中的上千行代码简化为下面这段简短表述,来对系统调用的处理做一个整体的把握:

8

这是课件中孟宁老师对entry_32.S的代码进行的简化

从system_call开始到iret结束之间的代码就是对系统调用的处理,接下来通过分析这段代码来理解系统调用的处理过程。
首先,系统调用也是一种中断,所以会有上下文的保存,所以在system_all开始的就是是SAVE_ALL保存现场的命令,保存的是需要用到的寄存器的数据,其定义如下:
9

将寄存器中的值压入到核心栈中,这样内核才能使用用户传递的参数;在不同的特权级(0与3)之间控制转换时,int指令不同于call指令,它不会将外层堆栈的参数自动拷贝到内层堆栈中。所以在调用系统调用时,必须把参数指定到各个寄存器中。

与之对应的是恢复现场的命令,在系统调用返回的时候恢复保存的数据,也就是上述代码中的第21行

restore_all:
    RESTORE_INT_REGS

其定义为:
11

在保存现场之后的代码是:

syscall_call:
  call *sys_call_table(,%eax,4)
  movl %eax,PT_EAX(%esp)

其中sys_call_table 是系统调用表,%eax传递的是系统调用号,这在上周课中已经分析过了,所以这段代码实现的功能是根据系统调用号来调用对应的系统调用处理程序。
关于系统调用号的使用方法:
11
在执行了系统调用的代码之后,是系统调用的退出处理:

syscall_exit:
    testl $_TIF_ALLWORK_MASK, %cx #current->work
    jne syscall_exit_work

这是在检测在系统调用的处理过程中是否有进程的调度发生,如果期间没有发生进程调度,那么该系统调用就可以之间返回;如果有进程调度,那么就需要对这些调度进行处理之后才能够返回。
第33行的代码:

work_resched:
  call schedule
  jz restore_all

schedule就是在重新进行调度。

第23行代码:

irq_return:
  INTERRUPU_RETURN

是系统调用的返回,至此系统调用的处理结束(即iret)。


通过上述分析,可以用下图来表达系统调用处理的流程:
12


三,实验内容

首先在删除系统的menu目录,然后从新下载一个新的:
1.1

重新编译系统 :
2.1

可以发现多了连个命令:time与time-asm,其功能都是获取当前系统的时间:
3.1

然后把上一周课程中的getppid命令也加入到系统调用中;第一步,打开menu目录下的test.c文件,在其中的main函数是:
4

在main函数中添加两行代码:
6

然后在这个文件内增加两个函数:

int getPPid(int argc,char *argv[])
{

    pid_t pid;
    pid=getppid();
    printf("The number of parent process is: %d\n",pid);
    return 0;
}
int getPPidAsm(int argc,char *argv[])
{

    pid_t pid;
    asm volatile(
        "mov $0,%%ebx\n\t"    
        "mov $0x40,%%eax\n\t"    
        "int $0x80\n\t"    
        "mov %%eax,%0\n\t"    
        :"=m" (pid)    
    );
    printf("The number of parent process is: %d\n",pid);
    return 0;
}

完成后重新编译一下,结果如下:
7



参考文档:
http://blog.chinaunix.net/uid-28458801-id-3468966.html
https://git.oschina.net/exiahan/LinuxKernelStudy/blob/master/4/asmSCI.md

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/FIELDOFFIER/article/details/44859305

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签