《Linux内核与分析》第四周
20135130王川东
一、用户态、内核态和中断处理过程
CPU的几种不同的执行级别:
高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种执行级别对应内核态;
低级别执行状态下,代码的掌握范围会受到限制,只能在对应级别允许的范围内活动。
例:intel x86 CPU有四种不同的执行级别0-3,Linux只使用其中的0级和3级分别来表示内核态和用户态。
区分用户态和内核态:
cs寄存器的最低两位表明了当前代码的特权级别
CPU每条指令的读取都是通过cs:eip两个寄存器:cs:代码选择寄存器,eip:偏移量寄存器。
0xc0000000以上的地址空间只能在内核态下访问,
0x0000000-0xbfffffff的地址空间在二者状态下都可以访问(注:这里的地址空间是逻辑地址不是物理地址)
中断处理是从用户态进入内核态主要的方式
系统调用只是一种特殊的中断
寄存器上下文
—从用户态切换到内核态时,
必须保存用户态的寄存器上下文,同时内核态的相应寄存器的相应的值
中断/int指令会在堆栈上保存一些寄存器的值。如:用户态栈顶地址、当前的状态字、当时的cs:eip的值。
中断发生和结束:
中断发生后第一件是保存现场(进行中断程序 保存 需要用到的寄存器的数据)
中断处理结束前最后一件事是恢复现场(退出中断程序恢复保存寄存器的数据)
二、系统调用概述
意义:操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用
API -:应用编程接口
与系统调用区别:
API只是一个函数定义
系统调用是通过软中断向内核发出一个明确的请求。
不是每一个API都对应一个系统调用:
API可能直接提供用户态服务。如一个数学函数
一个单独的API可能调用几个系统调用
不同的API可能调用了同一个系统调用
返回值: 大部分封装例程返回一个整数,含义依赖于相应的系统调用
-1在大多数情况下表示内核不能满足进程的请求
Libc中errno变量包含特定出错码传参:内核实现很多不同的系统调用,需要传递一个名为系统调用号的参数,使用eax寄存器传递实验:选用24号系统调用:getuid。
代码如下:
1、使用库函数API:
2,嵌入汇编代码:
《Linux内核与分析》第四周的更多相关文章
- Linux内核及分析 第四周 扒开系统调用的三层皮(上)
实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include ...
- Linux内核源代码分析方法
Linux内核源代码分析方法 一.内核源代码之我见 Linux内核代码的庞大令不少人"望而生畏",也正由于如此,使得人们对Linux的了解仅处于泛泛的层次.假设想透析Linux ...
- 2019-2020-1 20199303 《Linux内核原理分析》 第一周作业
2019-2020-1 20199303 <Linux内核原理分析> 第一周作业 1. 环境准备 在众多的Linux发行版中,Ubuntu,小红帽还有类Unix系统的BSD系统,我选择了目 ...
- Linux内核启动分析过程-《Linux内核分析》week3作业
环境搭建 环境的搭建参考课件,主要就是编译内核源码和生成镜像 start_kernel 从start_kernel开始,才真正进入了Linux内核的启动过程.我们可以把start_kernel看做平时 ...
- 从linux内核代码分析操作系统启动过程
朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 在本次的实验中, ...
- Linux内核启动分析
张超<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我的代码可见https://www.shiyanlo ...
- Linux内核及分析 第八周 进程的切换和系统的一般执行过程
学习笔记: 一.进程调度与进程调度的时机分析 1.不同类型的进程有不同需求的调度需求: 第一种分类: —I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 —CPU-boun ...
- Linux内核及分析 第七周 可执行程序的装载
实验步骤 1. 更新menu,用test.c覆盖test_exec.c 2. 把init 和 hello 放到了rootfs.img目录下,执行exec命令的时候自动加载了hello程序 3. 执行e ...
- Linux内核及分析 第六周 分析Linux内核创建一个新进程的过程
实验过程 1.github上克隆相应的mengning/menu.git 2.测试menuOS,测试fork直接执行结果 3.配置调试系统,进入gdb调试,利用file linux-3.18.6/vm ...
- Linux内核及分析 第五周 扒开系统调用的三层皮(下)
实验内容: 1.执行rm menu -rf命令,强制删除原有的menu 2.使用git命令 git clone https://github.com/mengning/menu.git 克隆新的men ...
随机推荐
- MySQL学习【第十二篇事务中的锁与隔离级别】
一.事务中的锁 1.啥是锁? 顾名思义,锁就是锁定的意思 2.锁的作用是什么? 在事务ACID的过程中,‘锁’和‘隔离级别’一起来实现‘I’隔离性的作用 3.锁的种类 共享锁:保证在多事务工作期间,数 ...
- HAProxy负载均衡策略
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理.HAProxy是支持虚拟主机的,HAProxy的优点能够补充Nginx的一些 ...
- 获取当前目录下所有php文件内的函数名
$dir = dirname(__FILE__); $files = scandir($dir); foreach($files as $name){ if($name == '.' || $name ...
- pomelo vscode 调试配置
步骤 config/server.js 配置 .vscode/launch.json 配置 详细 1. 在server的配置中添加 args 参数,此参数为node开启此服务器时命令参数 " ...
- 100-Days-Of-ML-Code 评注版(Day 1)
Day 1_Data PreProcessing(数据预处理) 本文引用自 Day 1_Data PreProcessing, 对其中内容进行了评注与补充说明. 导入数据 dataset = pd.r ...
- 希尔伯特曲线——第八届蓝桥杯C语言B组(国赛)第三题
原创 标题:希尔伯特曲线 希尔伯特曲线是以下一系列分形曲线 Hn 的极限.我们可以把 Hn 看作一条覆盖 2^n × 2^n 方格矩阵的曲线,曲线上一共有 2^n × 2^n 个顶点(包括左下角起点和 ...
- 20155308&20155316 2017-2018-1 《信息安全系统设计基础》实验一
20155308&20155316 2017-2018-1 <信息安全系统设计基础>实验一 此次实验我和黄月同学一起做了1.2.3.5项,第4项在实验课上做完了,但是没有按时提交. ...
- 20155336 《Java程序设计》实验二 (Java面向对象程序设计)实验报告
20155336 <Java程序设计>实验二 (Java面向对象程序设计)实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...
- 20155337 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155337 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 ·命令行下的程序开发 我在windows下 ...
- 20145226夏艺华 EXP5 MSF基础应用
实践目标 · 掌握metasploit的基本应用方式. · 具体需要完成 (1)ms08_067; (2)ms11_050: (3)Adobe (4)成功应用任何一个辅助模块. 报告 本次实验一共用到 ...

