系统调用初识

作者:xujianguo

 原创作品转载请注明出处,《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

——————————————————————————————————————————————————————-————

实验目的:

       通过gdb调试和编译c文件及汇编嵌入的文件来加强理解系统调用的过程和思想。

实验环境:

  

        实验楼:www.shiyanlou.com和putty。

实验步骤:

 1.配置环境,登录实验楼网站。

由于自身原因,先采用putty登录,测试,结果中途断开连接;然后使用360浏览器来完成。

2.改后的源代码如下:

3.编译和测试程序是否正确。

4.利用gdb并采用如下命令来测试和调试。

$gcc -g -m32 -o fopen fopen.c $gdb fopen -q (gdb)layout split (gdb)b main (gdb)b fopen (gdb)r test

试验结果图如下:

设置open和main处断点。

5.利用汇编代码嵌入,测试:

  • asm volatile(
  • "mov $0,%%ebx\n\t"
  • "mov %1,%%ebx\n\t"
  • "mov %2,%%ecx\n\t"
  • "mov $0x5,%%eax\n\t"
  • "int $0x80\n\t"
  • "mov %%eax,%0\n\t"
  • :"=m"(fd)
  • :"b"(fn),"c"(O_RDWR|O_CREAT)
  • );

6.按照前面的方式完成调试。

实验分析:

  实验参考资料:

http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl

  根据老师的课程资料和视频,系统调用是操作系统为用户态进程与硬件设备进行交互所提供的接口,其优势是减少用户在底层硬件的编程的时间耗费,甚至解放出来;分离客户和内核,可以保证系统的安全性;提供软件的可用性与可移植性。

在Linux系统中,glibc封装例程(wrapper routine),定义用户调用的API(每一系统调用对应一个封装例程,由封装例程定义API);由系统调用号来连接API和内核服务程序。

基本图例:

系统调用具体过程:

  1. 应用程序调用系统提供的API(eg:xyz)。
  2. CPU切换到内核态,并调用执行相应的内核函数。
  3. 如果需要传递参数,见下图,参数过多,是以指令的方式存在;通过int指令来匹配调用系统调用程序。
  4. 内核中的服务处理程序根据系统调用号调用对应的系统调用;如需进程调度,还会调用相关进程调度服务。
  5. 系统完成相应功能,将返回值存入eax,返回到服务处理函数。
  6. 服务处理函数返回到API中。
  7. API将eax,即系统调用的返回值返回给相应的应用程序。

总结:

   系统调用靠C库支持。用户程序通过包含标准头文件并和C库链接,就可以使用系统调用(或者调用库函数,再由库函数实际调用)。Linux本身提供了一组宏,用于直接对系统调用进行访问。它会设置好寄存器并调用陷人指令。这些宏是_syscalln(),其中n的范围从0到6。代表需要传递给系统调用的参数个数,这是由于该宏必须了解到底有多少参数按照什么次序压入寄存器。内核在执行系统调用的时候处于进程上下文。current指针指向当前任务,即引发系统调用的那个进程。当系统调用返回的时候,控制权仍然在system_call()中,它最终会负责切换到用户空间并让用户进程继续执行下去。

参考资料:

1.老师的视频和ppt

2.https://git.oschina.net/exiahan/LinuxKernelStudy/blob/master/4/asmSCI.md

3.http://blog.chinaunix.net/uid-20321537-id-1966859.html

时间: 2024-08-07 14:43:13

系统调用初识的相关文章

Linux内核分析(三)----初识linux内存管理子系统

Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linux的内存管理子系统,linux的内存管理子系统相当的庞大,所以我们今天只是初识,只要对其进行简单的了解就好了,不会去追究代码,但是在后面我们还会对内存管理子系统进行一次深度的分析. 在分析今天的内容之前,我们先来看出自http://bbs.chinaunix.net/thread-2018659-2-1.html的一位大神做的内存管理图,真心佩服大神.其实这张图可以

Redis——学习之路三(初识redis config配置)

我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. 我们就从上到下来理解一下这些配置信息中的某些配置: 1.dbfilename是本地持久化存储数据库文件名,默认为dump.rdb.我可以在安装目录文件夹下找到这个文件. 2.requirepass是密码,即连接服务器的密码,默认为空.下面我来设置一个密码然后用带密码的命令连接一遍. 3.msterauth

Python初识与简介【第一篇】

Python初识 由于是开篇,着实有点儿小激动......此处省略一万字,虽然写博客很伤脑细胞也费时费电,但大王说了,这是牛13的开始.    其实我接触Python的一个契机是在做Nagios监控的时候,发现了Python语言的强大,也可以实现高度的自动化,所以才开始慢慢的触及它,最近看到学好Python还可以成为全栈工程师,全栈是什么,就是什么都能做,能写后端.前端.GUI.科学运算.网络编程.大数据开发等等,掌握了这个工具利器,就有能力成为一名全栈程序员,想想都牛13,故心动不已. Pyt

初识中间件之消息队列

初识中间件之消息队列 测试那点事儿 测试那点事儿 初识中间件之消息队列 1 消息队列概述 消息队列是分布式系统中的重要组件,主要解决应用耦合,异步消息,流量削锋等问题,以实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统中不可缺少的中间件. 目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等,比如我之前用过的RabbitMQ以及kafka. 2 消息队列应用场景 在实际应用中,消息队列常用于异步处理.应用解耦.流量削锋

计算机初识

一.计算机分为两套系统 a.硬件系统     b.软件系统 硬件系统:1.运算器.2.控制器.2.存储器.4.输入设备.5.输出设备 CPU 内存:基于电的方式工作,速度快,然而不能永久保存数据 硬盘:基于磁的方式工作,速度慢,可以永久保存数据 软件系统:1.系统软件. 2.应用软件 系统启动流程:bios===>找到启动介质====>把系统加载到内存===>CPU执行 二.网络通信原理 1.互联网的本质就是一系列的网络协议 2.OSI七层协议 应用层 表示层 会话层 传输层:端口 tc

初识Python,望君多多关照

在学习Python之前,我们接触过数据结构和网页制作.前者让我们学习如何把C语言运用的更加整齐规范,而后者让我们亲身学习如何运用所学,制作一个静态网页.通过这些课程的学习,让我对C语言产生了比较大的压力,以至于对编程.对这学期的Python课程都有一种如临大敌的感觉. 但是真的学习了这门课程,体会了编码过程中的一些固定运用方法和套路之后,也许过程中对这门课程隐隐约约产生了一点点朦胧的感觉,仿佛他也并没有想象中的那么困难,起码现在的学习让我认为,他可能没有C语言那么繁琐和麻烦.当然,以一个初学者的

初识数组排序!!!!

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>初识数组排序</title> <!--调试成功--> <style type="text/css"> *{ padding:0; margin: 0; } li,ul{ list-style: none; } #p

初识操作系统和linux

初识操作系统和linux 1.计算机系统由硬件系统和软件系统两大部分组成:是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动.高速地处理,然后把处理结果输出的现代化智能电子设备. 2.世界上第一台计算机是1946年诞生在美国宾州大学. 3.冯·诺依曼体系结构:1946年数学家冯·诺依曼于提出计算机硬件系统由运算器.控制器.存储器.输入设备.输出设备.摩根定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍.现在计算机技术进本很难遵

JAVA 初识类加载机制 第13节

JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行.这些过程都是我们看不见的,我们能看见的也就是一个.class文件.既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些.class文件呢?虚拟机获得这些.class文件的过程就是类加载了. 所以,总结来说就是:虚拟机将.class文件从磁盘或者其他地