一、知识点总结

(一)用户态、内核态和中断

1.内核态:在高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态

2.用户态:在低级别的指令状态下,代码 只能在级别允许的特定范围内活动。在日常操作下,执行系统调用的方式是通过库函数,库函数封装系统调用,为用户提供接口以便直接使用。

3.在Linux下0级表示内核态,3级表示用户态。

4.内核态cs:eip的值是任意的,即可以访问所有的地址空间。用户态只能访问其中的一部分内存地址。

5.中断处理是从用户态进入内核态的主要方式,系统调用是一种特殊的中断。中断/int指令会在堆栈上保存用户态的寄存器上下文,其中包括用户态栈顶地址、当时的状态字、cs:eip的值,以及内核态的栈顶地址、当时的状态字、中断处理程序入口。中断处理结束前的最后一件事就是恢复现场,退出中断程序,恢复保存寄存器的数据。

例:

interrupt(ex:int 0X80)//发生系统调用 save

cs:eip/ss:esp/eflags(current)to kernel stack //保存cs:eip的值,保存当前堆栈段寄存器当前栈顶和标志位寄存器 load cs:eip(entry of a specific ISR)and ss:eip(point to kenerl stack) //把当前的中断信号或系统调用相关中断服务例程入口加载到cs:eip中,把当前的堆栈段和esp加载到CPU

SAVE_ALL//保存现场 ...//内核代码,完成中断服务,发生进程调度

RESTORE_ALL//恢复现场

iret - pop cs:eip/ss:esp/eflags from kernel stack//iret对应相反的中断指令

(二)系统调用概述

1.系统调用的意义

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

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

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

  • 使用户程序具有可移植性

2.API(应用程序编程接口)与系统调用的关系

  • API是一个系统调用封装成的一个函数定义

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

  • Libc库定义的一些API引用了封装例程,目的是发布系统调用,让程序员写代码的时候可以通过函数调用而非汇编指令触发一个系统调用

  • 一般每个系统调用对应一个封装例程,库再用这些封装例程定义出给用户的API

3.返回值

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

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

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

  • 应用程序、封装例程、系统调用处理程序及系统调用服务例程之间的关系:

  • 系统调用的三层皮:xyz(API)、system_call(中断向量)、sys_xyz(中断服务程序)

4.传参

  • 内核实现了很多不同的系统调用。

  • 进程必须指明需要哪个系统调用,这需要传递一个名为系统调用号的参数

  • 使用eax寄存器传递系统调用号。

超过6个的情况下,使用某一个寄存器作为指针,进入内核态之后可以访问所有的地址空间,通过某一片区域传递参数。

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

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

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

__asm__(

汇编语句模板:

输入部分:

输出部分:

破坏描述部分:);

汇编代码分析:

#include <stdio.h>
#include <time.h>
int main()
{
time_t tt;//int型数值
struct tm *t;
asm volatile(
"mov $0,%%ebx\n\t"//将ebx寄存器清零,系统调用传递第一个参数使用ebx,这里是null
"mov $0xd,%%eax\n\t"//将0xd放入eax中,0xd为13,传递系统调用号13
"int $0x80\n\t"
"mov %%eax,$0\n\t"//通过eax这个寄存器返回系统调用值
:"=m"(tt)
);
t = localtime(&tt);
printf("time:%d:%d:%d:%d:%d:%d\n",t->tm_year+1900,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
return 0;
}

限定符对照表:

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

(四)实验

1.选择20号系统调用,getpid来获取当前进程的pid

2.实验内容:

  • 使用库函数API方式:

  • 使用C代码中嵌入汇编代码方式:

linux第四周的更多相关文章

  1. #Linux第四周学习总结——扒开系统调用的三层皮(上)

    Linux第四周学习总结--扒开系统调用的三层皮(上) 一.用户态.内核态和中断 系统调用通过库函数. 1.用户态和内核态 区分(不同的指令执行级别): 用户态:在相应的低执行状态下,代码的掌控范围受 ...

  2. LINUX第四周学习

    <Linux内核设计与实现>第四周读书笔记——第五章 5.1 与内核通信57 系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: 首先它为用户空间提供了一种硬件的抽 ...

  3. linux第四周作业

    一.用户态内核态与中断 1.库函数把内核调用封装起来. 2.区分内核态和用户态是为了让系统更稳定.Linux里吧用户态定位3级,把内核态定位0级. 3.中断处理就是从用户态进入内核态的主要方法,系统调 ...

  4. 20135337朱荟潼 Linux第四周学习总结——扒开系统调用的三层皮(上)

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 知识点梳理 一.用 ...

  5. 20135316王剑桥 linux第四周课实验笔记

    第三章 程序的机器级表示 3.1历史观点 Intel处理器的换代:8086——80286——i386——i486——Pentium——PentiumPro——PentiumII——PentiumIII ...

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

    Linux第四周作业 1. 堆栈知识 首先回顾了下堆栈相关的知识,堆栈机制是高级语言可以运行的一个基础,这一块需要重点掌握.函数发生调用时,如图 call指令:将eip的按顺序执行的下一条指令(因为在 ...

  7. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

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

    Linux内核设计第四周 ——扒开系统调用三层皮 一.知识点总结 (一).系统调用基础知识 1.用户态和内核态 内核态:在高级别的状态下,代码可以执行特权指令,访问任意的物理地址: 用户态:在相应的低 ...

  9. 《Linux内核分析》第四周学习总结

    <Linux内核分析>第四周学习总结                         ——扒开系统调用的三层皮 姓名:王玮怡  学号:20135116 理论总结部分: 第一节 用户态.内核 ...

随机推荐

  1. 160510、jQuery给input绑定回车事件

    <script type="text/javascript" src="Scripts/jquery-1.6.2.js"></script&g ...

  2. bootstrap datetimepicker 日期插件超详细使用方法

    日期时间选择器 目前,bootstrap有两种日历.datepicker和datetimepicker,后者是前者的拓展. Bootstrap日期和时间组件: 使用示例: 从左到右依次是十年视图.年视 ...

  3. CH5302 金字塔【区间DP】

    5302 金字塔 0x50「动态规划」例题 描述 虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下.经过多年的研究,科学家对这座金字塔的内部结构已经有所了解.首先,金字塔由若干房间 ...

  4. Codeforces Round #427 (Div. 2)—A,B,C,D题

    A. Key races 题目链接:http://codeforces.com/contest/835/problem/A 题目意思:两个比赛打字,每个人有两个参数v和t,v秒表示他打每个字需要多久时 ...

  5. Android /system/build.prop 文件

    # begin build properties (开始设置系统性能) # autogenerated by buildinfo.sh (通过设置形成系统信息) ro.build.id=GRI40 ( ...

  6. 转载(web app变革之rem)

    rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...

  7. Linux磁盘分区工具的使用

    ----------fdisk分区工具----------   一..下面来介绍fdisk分区工具的命令格式:    fdisk是传统的Linux硬盘分区工具,也是Linux系统中最常用的一种硬盘分区 ...

  8. ifram+form方式实现文件、图片上传、预览

    1.前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  9. Python 之父谈放弃 Python:我对核心成员们失望至极!

    Python 之父讲述退位原因,以及 Python 的未来将何去何从. ​ 在 Python 社区,Python 的发明者 Guido Van Rossum 被称为 “仁慈的终生独裁者”(BDFL,B ...

  10. 【云安全与同态加密_调研分析(2)】国外云安全标准建议组织——By Me

    国际上比较有影响力的云安全组织: ◆2. 国外云安全标准建议组织(云安全建议白皮书)◆ ◆云安全标准建议组织(主要的)◆ ◆标准建议组织介绍◆ ◆相关建议白皮书制定◆ ◆建立的相关模型参考◆ ◆备注( ...