本文为我学习孟宁老师的linux内核课程的总结,同时也作为课程学习的作业。

唐建,《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

1、系统调用概述

  通常用户空间是无法直接访问内核空间的,但是有时候确实需要这样做,于是就产生的系统调用,系统调用是操作系统对用户空间提供的访问内核空间的API。

  系统调用分为:系统调用API、封装例程、系统调用处理程序、系统调用服务程序,其中系统调用处理程序和服务程序在内核空间。

API 1         系统调用例程1                                         处理程序1

API2         系统调用例程2              system_call         处理程序2

API3          系统调用例程3                                          处理程序3

……          ……                                                   ……

四者对应关系如上,多个API可能对应一个系统调用,一个API也可能对应对个系统调用,一个系统调用对应一个封装例程。

2、系统调用流程

用户态调用系统调用API时,调用到系统调用封装例程,例程通过命令触发一个软终端(系统调用专用,中断号:0x80),系统进入内核态,并走到

  system_call,可以认为这个就是此软终端的中断服务程序入口,然后通过传递过来的系统调用号来决定调用相应的系统调用服务程序。

3、详细流程,及举例

下面我通过跟踪和模拟系统调用来展示整个流程。

  (1)/下图是一个简单的程序,里面使用了open、read 这两个最常用的系统调用。右边是输出结果。

(2)、下面我们将API改成汇编,直接通过汇编来调用系统调用,进而分析系统调用的过程。

首先查看系统调用号到文件/arch/x86/syscalls/syscall_32.tbl 或者syscall_64.tbl 文件。如下图,第四列就是对应的内核中的处理函数。

  

上述代码与前面的c代码对比。第一部分是 open系统调用,第二部分是read 系统调用。

__asm__ __volatile__ (
"mov %1, %%ebx\n\t"   ——将open需要的参数准备好,文件路径
"mov %2, %%ecx\n\t"   ——准备参数,文件打开权限
"mov $5,%%eax\n\t"    ——系统调用号,open的系统调用号为5
"int $0x80\n\t"             ——触发中断0X80
"mov %%eax, %0\n\t"  ——系统调用返回了,将返回参数取出来。
:"=m"(fd)
:"p"(path), "c"(O_RDONLY)
);

__asm__ __volatile__ (
"mov %2, %%ecx\n\t"   ——准备入参
"mov $3, %%eax\n\t"   ——系统调用号
"int $0x80\n\t"             ——触发中断
"mov %%eax, %0\n\t"  ——取出返回值
:"=m"(n)
:"b"(fd),"p"(buf),"d"(20)
);

4、总结

(1)、 每个系统调用都对应一个系统调用号,而系统调用号就对应内核中的相应处理函数。

(2)、所有系统调用都是通过中断0x80来触发的。

(3)、使用系统调用时,通过eax 寄存器将系统调用号传递到内核,系统调用的入参通过ebx、ecx……依次传递到内核

(4)、和函数一样,系统调用的返回值保存在eax中,所有要从eax中取出

转载于:https://www.cnblogs.com/tjyuanxi/p/9221975.html

linux 系统调用分析相关推荐

  1. Linux系统调用的实现机制分析

    [摘要]本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口有怎样的关系.然后,我们考察了内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递系统调用号和 ...

  2. LINUX内核分析第四周——扒开系统调用的三层皮

    LINUX内核分析第四周--扒开系统调用的三层皮 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

  3. linux内核分析——扒开系统调用的三层皮(上)

    20135125陈智威 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 系统调用 ...

  4. 《Linux内核分析》 第四节 扒开系统调用的三层皮(上)

    黄胤凯   原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.视频学习 1 ...

  5. Linux系统调用getuid的简单分析

    陈铁 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000. Linux内核启 ...

  6. Linux系统调用详解(实现机制分析)--linux内核剖析(六)

    本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系.然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递 ...

  7. Android 6.0 JNI原理分析 和 Linux系统调用(syscall)原理

    JNI原理 引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: fram ...

  8. 《Linux内核分析》 第四节 扒开系统调用的三层皮(上)

    <Linux内核分析> 第四节 扒开系统调用的三层皮(上) 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com ...

  9. Linux系统调用详解(实现机制分析)

    为什么需要系统调用   linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于内核态,而普通的函数调用由函数库或用户 ...

最新文章

  1. 如何查看和停止Linux启动的服务
  2. 图解WindowsXP修改MAC地址
  3. HTTPS加密越来越流行,为何要加密?
  4. #2002 - 服务器没有响应 (or the local MySQL server's socket is not ...
  5. 腾讯和阿里巴巴考虑互相开放生态,是真开放还是新的垄断?
  6. 了解Java的发展史
  7. Linux内存管理:函数调用图谱-1
  8. jQuery基础(传智播客学习笔记)
  9. 与postman的第一次亲密接触
  10. Lan Xiang's Square nyoj 1099(已经四边形四点坐标 如何判断正方形)
  11. 数据包络分析DEA有哪些指标?
  12. 公钥,私钥,对称密钥
  13. ef常见面试题_C#基本面试题
  14. 面试中被问到“为什么从上一个单位离职”怎么回答
  15. php安装zend loader,PHP5.3安装Zend Guard Loader图文教程
  16. 什么是OA系统?OA系统的协同门户平台有哪些特点?
  17. 领存技术至强 E5-2648L 6U VPX 通用密集计算刀片
  18. vue的一些心得总结
  19. Install Mercury MW150US WIFI dongle on RPi
  20. B. Ordinary Numbers

热门文章

  1. 运维自动化—ansible的使用
  2. python excel 操作
  3. golang内置数据类型作为函数参数
  4. RDIFramework.NET V2.9版本多语言的实现
  5. 剖析基于IOS的华为交换机配置口令设置
  6. XP系统和Sever2003系统现实定时开关机
  7. 在Windows服务器上开启SNMP代理程序
  8. 血压测量:很重要的事情!
  9. my paper in EI
  10. 剑桥的商学院硕士的创业项目找我做tech lead,稳得一批