扒开系统调用的三层皮(上)
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
我选择了02系统调用,fork
库函数API
#include
#include
int main()
{
pid_t f;
f = fork();
printf("f = %d \n",f);
return ;
}
嵌入汇编
#include
#include
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内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程
1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...
Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序
1.可执行文件的格式 在 Linux 平台下主要有以下三种可执行文件格式: 1.a.out(assembler and link editor output 汇编器和链接编辑器的输出) ...
linux内核分析作业6:分析Linux内核创建一个新进程的过程
task_struct结构: struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标识符 u ...
linux内核分析作业5:分析system_call中断处理过程
1.增加 Menu 内核命令行 调试系统调用. 步骤:删除menu git clone (tab) make rootfs 这就是我们将 fork 函数写入 Menu 系统内核后的效果, ...
linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作
一.实验 使用gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与他人雷同 int g(int x) { return x + 3; } in ...
linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码
计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针 (stack pointer) ...
linux内核分析作业3:跟踪分析Linux内核的启动过程
内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell ...
linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
Linux内核分析作业 NO.8 完结撒花~~~
进程的切换和系统的一般执行过程 于佳心 原创作品转载请注明出处 MOOC课程http://mooc.study.163.com/course/USTC-10000 ...
Linux内核分析作业 NO.7
可执行程序的装载 于佳心 原创作品转载请注明出处 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实 ...
随机推荐
关于NK3C使用富文本编辑器(CKEditor)发送HTML邮件的使用说明
目前NK3C发送HTML邮件使用的的编辑器是CKEditor4.6版本,关于CKEditor的使用说明如下: 1.依赖JQuery1.7版本以上,在xxx.vm中
< ...dojo/dom-class源码学习
dom-class模块是dojo中对于一个元素class特性的操作(特性与属性的区别),主要方法有: contains 判断元素是否包含某个css class add 为元素添加某个css class ...
【转】JS函数的定义与调用方法
JS函数调用的四种方法:方法调用模式,函数调用模式,构造器调用模式,apply,call调用模式 1.方法调用模式:先定义一个对象,然后在对象的属性中定义方法,通过myobject.property来 ...
C# SerializableDictionary序列化/反序列化
说明:Dictionary对象本身不支持序列化和反序列化,需要定义一个继承自Dictionary, IXmlSerializable类的自定义类来实现该功能.感觉完全可以把这样的类封装到C#库中,很具 ...
ASCII 大文字生成器
display text in large ASCII art fonts 显示大ASCII艺术字体 这种东西在源码声明或者软件初始化控制台打印时候很有用. 例如打开: http://www.oran ...
PDA开发数据由DB下载至PDA本地
public string DownFile = "\\下载.txt";//下载路径 public string LoadFile = "\\上传.txt";/ ...
CSS样式简介
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不仅可以静态 ...
MariaDB和mySQL到底区别在哪,实验说明问题!
先看图,插入数据和时间的对数图,实验条件一直且关闭了mysql默认事务保证不是单条事务而是批量事务 另外确保了mysql and mariaDB都是在支持事务存储引擎下测试的. MySQL之父Wide ...
Spring MVC + Velocity实现国际化配置
国际化介绍 web开发中,国际化是需要考虑的一个问题,而且这个问题一般是越早敲定越好(不然等到系统大了,翻译是个问题).下面是结合实际项目(Spring MVC+Velocity)对实现国际化的一些总 ...
NSNotification的使用(对观察者模式最通俗、易懂的讲解)
这是一个观察者模式. 首先在你需要监听的类中加入观察者: - (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString ...