系统调用的三层机制(上)

基础知识

1、通过库函数的方式进行系统调用,库函数用来把系统调用给封装起来。

2、CPU有四种不同的执行级别:0、1、2、3,数字越小,特权越高。Linux操作系统中采用了0和3两个特权级别,分别对应内核态和用户态。

3、宏观上Linux操作系统的体系架构分为:用户态和内核态。

区分内核态和用户态的方法就是CS:EIP的指向范围。

  • 内核态(高指令执行级别):对所有的指令包括特权指令都可以执行,CS:EIP的值可以是任意地址
  • 用户态(低级别指令):对于32位的4GB进程地址空间,只能访问0x00000000~0xbfffffff的地址空间。

4、中断:从用户态进入内核态的主要方式。

5、系统调用:为用户态进程与硬件设备进行交互提供了一组接口。

6、系统调用的功能和特性:

  • 把用户从底层的硬件编程中解放出来;
  • 极大地提高系统安全性;
  • 使用户程序具有可移植性。

7、API和系统调用的关系:

API:应用程序编程接口,只是函数定义。

  • 系统调用通过软中断向内核发出了中断请求,int指令的执行就会触发一个中断请求。
  • libc函数库定义的一些API内部使用了系统调用的封装例程,其主要目的是发布系统调用,使程序员在写代码时不需要用汇编指令和寄存器传递参数来触发系统调用。
  • 一个API可能只对应一个系统调用,也可能内部由多个系统调用实现;一个系统调用也可能被多个API调用。
  • 涉及与内核空间进行交互的API内部会封装系统调用,不涉及与内核空间进行交互的API内部不会封装系统调用。
  • 如果内核增加了一个新的系统调用,但libc函数库没有及时更新为其编写API函数,则可以利用libc提供的syscall函数直接调用。

8、系统调用的三层机制:xyz(),system_call和sys_xyz()

9、内核如何知道用户态进程希望调用的是哪个系统调用?

内核通过给每个系统调用一个编号来区分,即系统调用号,将API函数xyz()和系统调用内核函数sys_xyz()关联起来,用EAX寄存器传递系统调用号参数。

使用库函数API和C代码中嵌入汇编代码触发同一系统调用

使用库函数API进行触发

下面以调用系统库函数getpid()来获取进程识别码为例。



执行结果如下:

C代码中嵌入汇编代码进行触发

查询linux系统调用号表可知,getpid()系统调用号为20,十六进制即0x14。

汇编代码分析:

asm volatile(
"mov $0,%%ebx\n\t" /*把EBX寄存器清零*/
"mov $0x14,%%eax\n\t" /*把0x14放到EAX寄存器中,EAX寄存器用于传递系统调用号,getpid()系统调用号为20,十六进制即0x14*/
"int $0x80" /*触发系统调用陷入内核执行20号系统调用的内核处理函数*/
:"=a"(pid)
);

这里代码中刚开始用的是movl编译提示出错,改为mov后通过。



执行结果如下:

含两个参数的系统调用rename

rename在内核中的系统调用处理函数为sys_rename(),系统调用号为38,其功能是给一个文件重命名。

  • 创建文件fxn.c

  • 嵌入式汇编代码进行触发

汇编代码分析:

asm volatile(
"movl %1,%%ebx\n\t" /*把oldname存入EBX寄存器中*/
"movl %2,%%ecx\n\t" /*把newname存入ECX寄存器中*/
"movl $0x26,%%eax\n\t" /*把系统调用号38存入EAX寄存器中*/
"int $0x80\n\t" /*触发系统调用陷入内核执行38号系统调用的内核处理函数*/
:"=a"(ret)
:"b"(oldname),"c"(newname) );



执行结果如下:

成功将文件fxn.c改名为fxn20199319.c

  • 库函数API进行触发

利用库函数API触发rename系统调用将上述改名后的fxn0199319.c改回fxn.c。



执行结果如下:

总结

  Linux下的系统调用是通过中断(int 0x80)来实现的。在执行int 0x80 指令时,寄存器EAX中存放系统调用号,而传给系统调用的参数则按顺序赋值给EBX,ECX,EDX,ESI,EDI,EBP中,参数个数不能超过6个,如果超过则要把某一个寄存器作为指针指向内存。

2019-2020-1 20199319《Linux内核原理与分析》第五周作业的更多相关文章

  1. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  2. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  3. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  4. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  5. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  6. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  7. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  10. 2018-2019-1 20189221《Linux内核原理与分析》第二周作业

    读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...

随机推荐

  1. SSH2配置

    Ubuntu14.04配置openSSH-server时报错,很有可能是因为如下的报错原因 这个问题大概应该是你的/etc/apt/的源有问题,但大概可以这么解决:1.sudo apt-get pur ...

  2. tensorflow卷积神经网络与手写字识别

    1.知识点 """ 基础知识: 1.神经网络(neural networks)的基本组成包括输入层.隐藏层.输出层.而卷积神经网络的特点在于隐藏层分为卷积层和池化层(po ...

  3. MVC - 单点登录中间件 (转)

    http://www.cnblogs.com/wangrudong003/p/6435013.html 本章将要和大家分享的是一个单点登录中间件,中间件听起来高深其实这里只是吧单点登录要用到的逻辑和处 ...

  4. SQLSERVER去除某一列的重复值并显示所有数据\DISTINCT去重\ISNULL()求SUM()\NOT EXISTS的使用

    进入正题,准备我们的测试数据 1.我们要筛选的数据为去除 GX 列的重复项 并将所有数据展示出来,如图所示: ' 2.这种情况下我们是不可以使用DISTINCT来去重的,我们可以来尝试一下: 首先,单 ...

  5. LeetCode.1108-使IP地址无效(Defanging an IP Address)

    这是小川的第393次更新,第426篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第257题(顺位题号是1108).给定有效(IPv4)IP地址,返回该IP地址的无效版本. ...

  6. linux系统查看当前正在运行的服务

    --查看当前服务器所有服务 service --status-all -- 查看当前所有正在运行的服务 service --status-all | grep running --查看指定服务运行状态 ...

  7. docker-compose 部署elk+解决时间不对导致kibana找不到logstash定义的index + docker-compose安装

    1.拉代码 git clone https://github.com/deviantony/docker-elk.git 2.docker-compose配置文件 [root@host7 docker ...

  8. PTA(Advanced Level)1011.World Cup Betting

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  9. Windows 2016 安装单机版本Oracle ASM 的简单说明

    发现这样弄完 启动之后 就挂了 真蛋疼.  改天再研究一下. 1. 需要给磁盘处理一下 建议使用压缩卷的模式进行处理 如图示 需要新建简单卷 注意设置 然后不进行格式化 2. 然后安装oracle的g ...

  10. (一)使用twisted Deferred

    一.开篇 为什么是twisted,twisted作为一个python网络编程框架,出道早,但一直不温不火,这几年和tornado比起来,更是近乎销声匿迹:但作为初学者,觉得twisted还是有很多优点 ...