Linux内核分析作业 NO.4
扒开系统调用的三层皮(上)
于佳心 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
我选择了02系统调用,fork
库函数API
#include <unistd.h>
#include <stdio.h>
int main()
{
pid_t f;
f = fork();
printf("f = %d \n",f);
return ;
}


嵌入汇编
#include <unistd.h>
#include <stdio.h>
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内核分析作业 NO.4的更多相关文章
- 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 完结撒花~~~
进程的切换和系统的一般执行过程 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 ...
- Linux内核分析作业 NO.7
可执行程序的装载 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实 ...
随机推荐
- 最好用的jquery列表拖动排列(由项目提取)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wuchengzeng/article/details/31766235 最好的jquery列表拖动排 ...
- C# ActiveX 网页打包验证自动升级
原文地址:http://www.cnblogs.com/yilin/p/csharp-activex.html 注意事项:Win10下需要设置兼容模式,F12仿真切换到IE6-8(版本参考——BT90 ...
- Linux chmod +755和chmod +777 各是什么意思呢?
你可以在linux终端先输入ls -al,可以看到如: -rwx-r--r-- (一共10个参数)第一个跟参数跟chmod无关,先不管.2-4参数:属于user5-7参数:属于group8-10参数: ...
- 【webGL】
1.类型化数组 WebGL设计复杂的计算,需要提前知道数值的精度,而标准的javascript数值无法满足需要.WebGL引入了一个概念,叫类型化数组. ArrayBuffer的类型,表示的只是内存中 ...
- 2018-2019-2 20165302 《网络对抗技术》Exp3 免杀原理与实践
一,实验要求 (我是真的不知道为什么截图中都有学号和姓名信息了还要求改主机名......而且实验要求里也没有明确说.做完之后听别人说的,肯定是不能重新截图了,要扣分就扣吧) 通过本部分内容的学习,认识 ...
- scrapy的request的meta参数是什么意思?
作者:乌尔班链接:https://www.zhihu.com/question/54773510/answer/146971644来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- JAVA框架 Spring 注解注入
一.首先需要引入jar包:spring-aop-4.2.4.RELEASE.jar.(在spring解压包libs内). 二.如果注解方式注入依赖的对象,需要引用新的约束. 内的:xsd-config ...
- python高速排序
import random def rand(n): for i in range(n): yield random.randint(0,1000) #创建一个随机数列表 def createList ...
- WPF EventTrigger,BeginStoryboard
<Window x:Class="WpfApplication2.LoginWind" xmlns="http://schemas.microsoft.com/wi ...
- 网络对抗技术 2017-2018-2 20152515 Exp3 免杀原理与实践
基础问题回答 (1)杀软是如何检测出恶意代码的? 答:分析恶意程序的行为特征,分析其代码流将其性质归类于恶意代码. (2)免杀是做什么? 答:一般是对恶意软件做处理,让它不被杀毒软件所检测,也是渗透测 ...