Linux内核分析04
扒开系统调用的三层皮(上)
一,用户态、内核态和中断
用户态、内核态和中断的处理过程
用户态和内核态的区分
内核态:代码可以执行特权指令,访问任意的物理地址,CPU的这种执行级别就对应着~
相对的用户态就对应着低级别的执行状态就是用户态,代码所掌控的范围有限。
至于为什么会划分权限,因为操作系统的发展,防止程序员写的代码造成系统运转的崩溃
划分为0、1、2、3四个级别 内核态为0,用户态则为3.
进程地址空间里所提到的地址指的是逻辑地址而不是物理地址。
中断处理是从用户态进入内核态的主要方式。
从用户态切换到内核态时必须保存用户态的上下文在寄存器里,int指令会在堆栈上保存一些寄存器的值,
系统调用只是一种特殊的中断。
中断后发生的第一件事就是保护现场,save all,例如:状态字、栈顶地址、cs:eip的值。
最后一件事是恢复现场。
二,系统调用
应用程序编程接口(API)和系统调用是不同的。
API只是一个函数定义,而系统调用通过软中断向系统内核提出明确请求。
一般情况一个系统调用对应一个封装例程,函数库再用这些封装例程定义出方便程序员使用的函数。
-1表示内核不能满足请求。
系统调用的三层皮:API xyz、中断向量 system_call、 中断服务 sys_xyz。
系统调用号将xyz和sys_xyz关联起来,指名那个系统调用,用eax%来传递。
传递参数方法是 每个参数的长度不能超过寄存器长度,也就是说不能超过六个,把寄存器当做一个指针,在内核传递。并没有看到超过六个怎么办。。
三,使用库函数API和C代码中嵌入汇编代码触发同一个系统调用
C语言程序中嵌入式汇编代码的写法:
_asm_(
汇编代码:
输出部分:
输入部分:
);
前面的笔记里也有提到过的。
用“=m”写到内存里去,不是放在寄存器了。
常用嵌入汇编语言限定符:a、r、=等等。
用汇编方式触发系统调用获取当前时间。
系统调用的第一个参数用ebx%,一般是NULL。
系统调用的返回值用eax存储,和普通函数一样。
四,实验
我使用第20号调用,getpid按照步骤来C语言编译运行:
汇编编译运行:
五,疑惑
1、为什么在保存的时候不保存中断向量?
2、超过六位怎么办。。。。
Linux内核分析04的更多相关文章
- Linux内核分析 笔记七 可执行程序的装载 ——by王玥
一.预处理.编译.链接和目标文件的格式 (一)可执行程序是怎么得来的? 1. 2.可执行文件的创建——预处理.编译和链接 shiyanlou:~/ $ cd Code ...
- 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代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
随机推荐
- 百度地图地址查询API使用
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgsAAALxCAIAAABdNHLmAAAgAElEQVR4nOy9/VMbZ5rvnf/hbM7zy3 ...
- 谷歌Volley网络框架讲解——第一篇
自从公司新招了几个android工程师后,我清闲了些许.于是就可以有时间写写博客,研究一些没来的研究的东西. 今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley.不久前就听说了但是没有cl ...
- IT English Collection(20) of Object modeling
1 前言 本节简单的介绍了对象建模,以及需要注意的事项. 2 详述 2.1 原文 Objectmodeling is the process of designing the objects or c ...
- adb shell dumpsys的用法
一. 打印出设备中所有service的信息 zh@zh:~$adb shell dumpsys -l (字母l)zh@zh:~$adb shell service list 二.查询到运行的syste ...
- 【黑金ZYNQ7000系列原创视频教程】01.熟悉vivado——纯逻辑led实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36627&extra=page%3D1 爱奇艺地址: http: ...
- Python 3 利用 Dlib 实现人脸 68个 特征点的标定
0. 引言 利用 Dlib 官方训练好的模型 “shape_predictor_68_face_landmarks.dat” 进行 68 个点标定: 利用 OpenCv 进行图像化处理,在人脸上画出 ...
- centos6安装postgresql-(2)
1.Install yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-ce ...
- 170720、springboot编程之properties文件讲解
但是在实际开发过程中有更复杂的需求,我们在对properties进一步的升华.在本篇博客中您将会学到如下知识(这节中有对之前的知识的温故,对之前的升华): (1) 在application.prope ...
- 170522、Linux 平台通过 nginx 和 vsftpd 构建图片服务器
Nginx WEB 服务器 Nginx 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第 ...
- 写一个体验良好的git commit
一直在使用git也看过格式各样commit log , review 代码时最刺激的是看到这类 "." 应付差事,还有 "fix bug","fix& ...