20135201李辰希 《Linux内核分析》第四周 扒开系统调用的“三层皮”

李辰希无转载 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

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

1.我们与系统调用打交道是通过库函数的方式

2.一般现代CPU都有几种不同的指令执行级别

因为如果所有程序员写的代码都可以有特权指令的话,系统就会很容易崩溃。

3.区别:

  1. 在高级别的状态下,代码可以执行特权指令,访问任意的物理地址。
  2. 在相应的低级别执行状态下,代码的掌控范围会受到限制。
  3. Intel x86 CPU有四种不同的执行级别0——3,Linux只是用了其中的0和3来表示内核态和用户态。

二.中断处理(中断处理是从用户态进入内核态主要的方式)

1.从用户态进入内核态:必须保存用户态的寄存器上下文

2.中断/int指令在堆栈上保存寄存器的值:用户态/内核态栈顶地址(ss:esp)、状态字(eflags)、cs:eip值(内核态时指向中断服务程序入口)

三.系统调用概述和系统调用的三层皮

1.系统调用的意义:

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

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

2.API和系统调用

  API:应用编程接口,是一个函数定义

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

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

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

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

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

  API可直接提供用户态服务,如数学函数

  API可调用几个系统调用

  不同API可调用同一系统调用

5.返回值

  封装例程返回一个整数,含义依赖与相应系统调用

  -1表示内核不能满足进程的要求

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

6.系统调用的三层皮:

xyz,sysytem_call和sysytem_xyz

(1)中断向量0x80与system_call绑定起来

(2)系统调用号将xyz与sys_xyz关联起来了(使用eax)

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

代码如下:

代码:

time.c
#include <stdio.h>
#include <time.h>
int main()
{
    time_t tt;//int型数值
    struct tm *t;
    tt = time(NULL);
    t = localtime(&tt);//强制类型转换,便于输出
    printf("time:%d:%d:%d:%d:%d:%d:\n",t->tm_year+1960,t->tm_mon,t->tm_mda,t->tm_hour,t->tm_min,t->tm_sec);
    return 0;
}

1.使用库函数API获取系统当前时间

2.C代码中嵌入汇编代码的写法:

_asm_(

汇编语句模板:

输出部分:

输入部分:

破坏描述部分);

3.使用C代码中嵌入汇编代码触发系统调用获取系统当前时间

结果为打印出的系统时间下的年、月、日、时、分、秒。

实验(选择2号系统调用fork)

结果:

编译:


五.总结

1.系统调用是操作系统为用户态进程与硬件设备进行交互提供的一组接口,也是一种特殊的中断,可使用户态切换到内核态。当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。

2.系统调用的工作机制,就是将诸多系统调用视作按照序号排好顺序的黑箱,只要知道了一个系统调用的号,按照其API或者汇编格式的调用方法,就可以使用这个黑箱的功能,完成一定的任务,而黑箱的内容正是系统给我们提供的服务,帮我们从硬件操作中抽离出来,提高系统的安全性。

时间: 2024-11-25 12:34:54

20135201李辰希 《Linux内核分析》第四周 扒开系统调用的“三层皮”的相关文章

20135327郭皓--Linux内核分析第四周 扒开系统调用的三层皮(上)

Linux内核分析第四周 扒开系统调用的三层皮(上) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断 用户态:当进程在执行用户自己的代码时,则称其处于用户态,即此时处理器在特权级最低的(3级)用户代码中运行. 内核态:当一个进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核态,此时处理器处于特权级最高的(0级)内核代码中执行. PS:CPU指令

Linux内核及分析 第四周 扒开系统调用的三层皮(上)

实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(int argc, const char *argv[]) { pid_t tt; tt = getpid(); printf("%u\n&q

Linux内核设计第四周——扒开系统调用三层皮

Linux内核设计第四周--扒开系统调用三层皮 by苏正生 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识点整理 1.用户态 内核态和中断处理程序 我们一般使用系统调用一般通过库函数的方式 用户态和内核态的区分: [CPU有不同的执行级别,高执行级别下,代码可以执行特权指令,访问任何的物理地址:低执行级别下,就会受到一定的限制.(处于系统安全和稳定的目的)Intel X86 C

《Linux内核分析》第四周 扒开系统调用的“三层皮”

[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR(3.14——3.20)扒开系统调用的“三层皮” SECTION 1 用户态.内核态和中断处理过程 1.用户态.内核态区别 在高级别的状态下,代码可以执行特权指令,访问任意的物理地址: 在相应的低级别执行状态下,代码的掌控范围会受到限制. 为什么会有这种级别划分? 没有访问权限划分容易使得系统混乱(毕竟普通程序

LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上)

LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.知识概要 (一)用户态.内核态和中断处理过程 (二)系统调用概述 系统调用概述和系统调用的三层皮 (三)使用库函数API和C代码中嵌入汇编代码触发同一个系统调用 使用库函数API获取系统当前时间 C代码中嵌入汇编代码的方法(复习) 使用C代码中嵌入汇编代码触发系统调

《Linux内核分析》第四周笔记 扒开系统调用的三层皮(上)

扒开系统调用的三层皮(上) 一.用户态.内核态和中断 库函数将系统调用封装起来. 1.什么是用户态和内核态 一般现代CPU都有几种不同的指令执行级别. 在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态. 而在相应的低级别执行状态下(用户态),代码的掌控范围会受到限制.只能在对应级别允许的范围内活动.系统容易崩溃. 在intel X86CPU有四种不同的执行级别0,1,2,3,linux只使用了0级和3级分别来表示内核态和用户态. 2.在linux内核代码

20135201李辰希《Linux内核分析》第六周 进程的描述与创建

李辰希 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 操作系统的三大管理功能: 进程管理(最重要的) 内存管理 文件系统 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 进程控制块PCB task_struct: 进程状态 进程打开的文件 进程优先级信息 task_struct总体数据结构的抽象: tty:控制台 fs:文件系统

20135201李辰希《Linux内核分析》第一周 计算机是如何工作的?

计算机是如何工作的 1冯诺依曼体系结构:即具有存储程序的计算机体系结构 目前大多数拥有计算和存储功能的设备(智能手机.平板.计算机等)其核心构造均为冯诺依曼体系结构 从硬件来看:CPU与内存通过主线连接,CPU上的IP(可能是16.32.64位)总指向内存的某一块区域:IP指向的CS(代码段)也在内存中:CPU总是执行IP指向的指令. 从软件来看:API(应用程序编程接口,与编程人员)与ABI(程序与CPU的借口界面) 是两个比较重要的软件接口 2. x86(32位)的寄存器中,低16位作为16

20135201李辰希 《Linux内核分析》第七周 可执行程序的装载

李辰希  原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 编译链接的过程 1.预处理阶段 gcc -E -o XX.cpp XX.c -m32 XX.cpp是预处理文件 2.编译器生成汇编代码阶段 gcc -x cpp-output -S -o hello.s hello.cpp -m32 XX.s是汇编代码 3.汇编器