扒开系统调用的三层皮(上)

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

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

我选择了02系统调用,fork

库函数API

#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t f;
f = fork();
printf("f = %d \n",f);
return ;
}

嵌入汇编

#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t f;
f = fork();
asm volatile(
"mov $0x02,%%eax\n\t" /*将系统调用号保存到eax里*/
"int $0x80\n\t" /*中断向量号,执行系统调用*/
"mov %%eax,%0\n\t" /*将返回值保存到f中*/
:"=m"(f)
);
printf("f = %d \n",f);
return ;
}

总结:

这节课我们主要学了系统调用,要学会系统调用。我们首先要知道用户态和内核态的区别。

一般现代CPU都有几种不同的指令执行级别,在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就是对应着内核态。

而在相应的低级别执行状态下,代码的掌握范围会受到限制,只能在对应级别允许的范围内活动

权限级别划分是一个让操作系统稳定的机制

intel x86 CPU有四种不同的级别划分:0,1,2,3

Linux只使用了0和3

0表示内核态,3表示用户态

内核态和用户态的显著区分方法是cs:eip

cs寄存器的最低两位表示当前代码的特权级

CPU每条指令的读取都是通过cs:eip这两个寄存器:

其中cs是代码段选择寄存器,eip是偏移量寄存器

上述判断由硬件完成

一般来说在LInux中,地址空间是一个显著的标志:内核态可以访问全部地址,但0xc0000000以上的地址只能在内核态下访问,0x00000000-0xbfffffff的地址两种状态下都可以访问(这里所说的地址空间是逻辑地址,不是物理地址)

寄存器上下文从用户态切换到内核态时必须保存用户态的寄存器上下文

内核态的值放进CPU

中断/int指令会在堆栈上保存一些寄存器的值,如:用户态栈顶地址、当时的状态字、当时的cs:eip的值

中断发生后得第一件事是保存现场,将其他寄存器的值push到内核 中断中去,结束后再把寄存器pop出来

iret指令与中断信号发生的cpu做的动作相反

中断处理是由用户态进入内核态的主要方式

系统调用的意义:

操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用

把用户从底层的硬件编程中解放出来

极大的提高了系统的安全性

使用户程序具有可移植性

系统调用的一种特殊的中断

应用编程接口(API)和系统调用是不同的

API只是函数的一个定义

系统调用通过软中断向内核发出一个明确的请求

Libc库定义的一些API引起了封装例程(唯一目的就是发布系统调用)

一般每个系统调用对应一个封装例程

库再用这些封装例程定义出给用户的API

不是每个API都对应一个特定的系统调用

API可能直接提供用户态的服务

一个单独的API可能调用几个系统调用

不同的API可能调用了同一个系统调用

大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用

-1在多数情况下表示内核不能满足进程的请求

Libc中定义的errno变量包含特定的出错码

当用户态进程调用一个系统调用时,CPU切换到内核态并执行一个内核函数

在Linux中是通过执行int $0x80来执行系统调用的,这条汇编指令产生向量为128的编程异常

传参:内核实现了很多不同的系统调用,进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号的参数

学的知识越来越难了,有点担心以后学不会。

Linux内核分析作业 NO.4的更多相关文章

  1. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程

    1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...

  2. Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序

            1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...

  3. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

  4. linux内核分析作业5:分析system_call中断处理过程

    1.增加 Menu 内核命令行 调试系统调用. 步骤:删除menu git clone        (tab) make rootfs 这就是我们将 fork 函数写入 Menu 系统内核后的效果, ...

  5. linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作

    一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...

  6. linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码

    计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针  (stack pointer) ...

  7. linux内核分析作业3:跟踪分析Linux内核的启动过程

    内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell ...

  8. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  9. Linux内核分析作业 NO.8 完结撒花~~~

    进程的切换和系统的一般执行过程 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 ...

  10. Linux内核分析作业 NO.7

    可执行程序的装载 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实 ...

随机推荐

  1. spark任务调度和资源分配

    Spark调度模式 FIFO和FAIR     Spark中的调度模式主要有两种:FIFO和FAIR.    默认情况下Spark的调度模式是FIFO(先进先出),谁先提交谁先执行,后面的任务需要等待 ...

  2. [python] os.path模块常用方法汇总

    os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...

  3. 设置webstorm支持ES6语法

    1.  点击File目录下的Default Settings 2.  再依次点击Languages & Frameworks  ----->  JaveScript  ----> ...

  4. Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-1-举例说明

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用 Compose 通过一个配置文件来管理多个Docker容器,在配置文件中 ...

  5. day4-课堂代码

    # ---------------------------------------------------------------------- # def my_function1(name, ad ...

  6. JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果

    JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果 今天是2014年第一篇博客是关于类似于我们的qq空间长图片展示效果,因为一张很长的图片不可能全部把他展示出来,所以外层用了一个容器给他一个高度,超 ...

  7. aips初步设想

    2018年5月10日星期四 目标:设计一个高并发,高性能,可扩展的现代化综合大前置机. 具备以下功能: 协议支持:http.socket.mq 报文支持:xml.json.8583 Tps:500笔/ ...

  8. opencv 显示摄像头数据

    本文章是一个小例子,主要是在ubuntu 系统中利用Opencv 显示摄像头的数据 ,显示到对话框中. 1.建立一个  main.cpp #include<opencv2/core/core.h ...

  9. P1272 重建道路

    题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系 ...

  10. day41

    今日内容: 1.完整查询语句 2.多表查询 3.子查询 1.完整查询语句: 首先对于昨天的学习补充一个复制表 示例:首先我在一个库中创建了一个t1表(id 为int类型 设置为主键 并且设置了自增描述 ...