第四周—扒开系统调用的“三层皮”

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

 第四周 扒开系统调用的“三层皮”

一、本周学习内容总结



 

1.系统调用的“三层皮”

  • xyz函数—API
  • systemcall—中断向量
  • sysxyz—中断服务程序

2.系统调用的意义及API与系统调用的关系

(1)系统调用的意义:

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

(2)API和系统调用:

  • API与系统调用是不同的—API只是一个函数定义,系统调用通过软中断向内核发出一个明确请求。
  • Libc库定义的一些API引用了封装例程—一般每个系统调用对应一个封装例程,库再用这些封装例程定义出给用户的API 。
  • 不是每个API都对应一个特定的系统调用
  • 返回值—大部分封装例程返回一个整数,-1多数情况下表示内核不能满足进程的要求。

3.用户态、内核态、中断

  • Intel x86 CPU有四种不同的执行级别0——3,Linux只是用了其中的0和3来表示内核态和用户态
  • 用户态—在相应的低执行状态下,代码的掌控范围受到限制,只能在对应级别允许的范围内活动
  • 内核态—在高执行级别下,代码可以执行特权指令,访问任意的物理地址
  • 中断处理是从用户态进入内核态的主要方式。系统调用是一种特殊的中断。
  • 从用户态切换到内核态时必须保存用户态的寄存器上下文。中断/int指令会在堆栈寄存器上保存一些寄存器的值。
  • 中断发生之后第一件事就是保存现场。保护现场就是进入中断程序,保存需要用到的寄存器的值,恢复现场就是退出中断程序,回复保存寄存器的数据。中断处理结束最后一件事就是恢复现场

4.系统调用的参数传递方法

 

二、实验内容总结



  以C语言和嵌入式汇编两种方式编写通过API进行系统调用的实例

  选用20号系统调用getpid

  • 库函数API使用系统调用

  • C代码中嵌入汇编代码使用系统调用

  • 实验结果

 

三、小结



  这周学习到系统调用的过程,及三个关键点:应用程序在用户态调用API函数,该函数将对应的系统调用号及参数保存,触发软中断,然后陷入内核态,中断向量根据系统调用号调用对应的内核函数,内核函数执行完毕后将结果存放的eax中并返回给程序,程序返回的用户态。并通过实验进行了系统调用实例。

时间: 2024-08-10 14:22:55

第四周—扒开系统调用的“三层皮”的相关文章

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.用户态.内核态区别 在高级别的状态下,代码可以执行特权指令,访问任意的物理地址: 在相应的低级别执行状态下,代码的掌控范围会受到限制. 为什么会有这种级别划分? 没有访问权限划分容易使得系统混乱(毕竟普通程序

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

李辰希无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断处理过程 1.我们与系统调用打交道是通过库函数的方式 2.一般现代CPU都有几种不同的指令执行级别 因为如果所有程序员写的代码都可以有特权指令的话,系统就会很容易崩溃. 3.区别: 在高级别的状态下,代码可以执行特权指令,访问任意的物理地址. 在相应的低级别执行状态下,代码的掌控范围会受到限制. Intel x86 CPU有四

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

用户态,内核态和中断 和系统调用打交道的方式:通过库函数,把系统调用给封装起来 用户态vs内核态: 一般现代CPU都有几种不同的指令执行级别 在高级别的状态下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别对应着内核态 在相应的低级别执行状态下,代码的掌控范围会受到限制,只能在对应级别允许的范围内活动 为什么有权限级别的划分:为了防止系统崩溃以及恶意代码的入侵,通过划分权限级别来让系统更稳定 举例:Intel x86 CPU有四种不同的执行级别0-3,Linux只使用了其中的0级和

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

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

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

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

实验五:扒开系统调用的三层皮(下)

实验五:扒开系统调用的三层皮(下) 王朝宪20135114 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuOS增加time和time-asm命令 1. 通过内核的方式(跟踪调试系统调用)来理解并使用系统调用. rm menu -rf //强制删除当前menu git clone http://github.com/mengning/menu.git //重新克隆新版本的m