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

一,用户态、内核态和中断

用户态、内核态和中断的处理过程

用户态和内核态的区分

内核态:代码可以执行特权指令,访问任意的物理地址,CPU的这种执行级别就对应着~

相对的用户态就对应着低级别的执行状态就是用户态,代码所掌控的范围有限。

至于为什么会划分权限,因为操作系统的发展,防止程序员写的代码造成系统运转的崩溃

划分为0、1、2、3四个级别 内核态为0,用户态则为3.

进程地址空间里所提到的地址指的是逻辑地址而不是物理地址。

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

从用户态切换到内核态时必须保存用户态的上下文在寄存器里,int指令会在堆栈上保存一些寄存器的值,

系统调用只是一种特殊的中断。

中断后发生的第一件事就是保护现场,save all,例如:状态字、栈顶地址、cs:eip的值。

最后一件事是恢复现场。

二,系统调用

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

API只是一个函数定义,而系统调用通过软中断向系统内核提出明确请求。

一般情况一个系统调用对应一个封装例程,函数库再用这些封装例程定义出方便程序员使用的函数。

-1表示内核不能满足请求。

系统调用的三层皮:API xyz、中断向量  system_call、 中断服务  sys_xyz。

系统调用号将xyz和sys_xyz关联起来,指名那个系统调用,用eax%来传递。

传递参数方法是 每个参数的长度不能超过寄存器长度,也就是说不能超过六个,把寄存器当做一个指针,在内核传递。并没有看到超过六个怎么办。。

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

C语言程序中嵌入式汇编代码的写法:

_asm_(

  汇编代码:

  输出部分:

  输入部分:

  );

前面的笔记里也有提到过的。

用“=m”写到内存里去,不是放在寄存器了。

常用嵌入汇编语言限定符:a、r、=等等。

用汇编方式触发系统调用获取当前时间。

系统调用的第一个参数用ebx%,一般是NULL。

系统调用的返回值用eax存储,和普通函数一样。

四,实验

我使用第20号调用,getpid按照步骤来C语言编译运行:

汇编编译运行:

五,疑惑

1、为什么在保存的时候不保存中断向量?

2、超过六位怎么办。。。。

Linux内核分析04的更多相关文章

  1. Linux内核分析 笔记七 可执行程序的装载 ——by王玥

    一.预处理.编译.链接和目标文件的格式 (一)可执行程序是怎么得来的? 1. 2.可执行文件的创建——预处理.编译和链接 shiyanlou:~/ $ cd Code                  ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 深入浅出Docker(二):Docker命令行探秘

    1. Docker命令行 Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法.但是由于Docker技术的快速发展,此交互式教程已经无法满 ...

  2. flag - 待浏览学习网站

    学习:gulp+jade(pug)+sass 待浏览网站如下:http://www.ydcss.com/archives/18#lesson1 https://nodejs.org/en/ https ...

  3. bootstrap之辅助类

    类 描述 .pull-left 元素浮动到左边 .pull-right 元素浮动到右边 .center-block 设置元素为 display:block 并居中显示 .clearfix 清除浮动 . ...

  4. 键盘event.which属性

    IE中,只有keyCode属性,而FireFox中有which和charCode属性 event.which属性对DOM原生的event.keyCode和event.charCode进行了标准化. f ...

  5. 【BZOJ3678】wangxz与OJ Splay

    [BZOJ3678]wangxz与OJ Description 某天,wangxz神犇来到了一个信息学在线评测系统(Online Judge).由于他是一位哲♂学的神犇,所以他不打算做题.他发现这些题 ...

  6. mysql如何按周统计数据?

    转自:https://www.cnblogs.com/wanghetao/p/3920124.html MySql 按周/月/日统计数据的方法 知识关键词:DATE_FORMAT  select DA ...

  7. 【HTTP header】【Access-Control-Allow-Credentials】跨域Ajax请求时是否带Cookie的设置

    1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...

  8. 聊一聊goroutine stack

    通过阅读这篇文章对内存的处理以及栈的扩容有了新的认识,我们在生产环境中也遇到了内存使用量超大的情况,现在怀疑也可能是由于栈扩容导致的 很好的一片文章: 推送在外卖订餐中扮演着重要的角色,为商家实时接单 ...

  9. You don't have permission to access

    局域网内配置Discuz,web端访问server端,出现以下反馈: Forbidden You don't have permission to access / on this server. 网 ...

  10. docker基本操作命令

    1. 构建镜像 docker build -t centos/tomcat:7.0 2. 创建一个容器 docker run --name test-tomcat centos/tomcat:7.0 ...