《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 ...
随机推荐
- C++练习 | 求解二叉树的高度
int h(BTree *bt) { if(bt->lchild==NULL&&bt->rchild==NULL) ; if(bt->lchild!=NULL& ...
- [USACO15DEC]最大流Max Flow(树链剖分,线段树)
FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N.所有隔间都被管道连通了. FJ有K(1≤K≤100,000)条运输牛奶的路线,第i条路线从隔间si运输到隔间t ...
- ABAP术语-XML
XML 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/21/1115743.html The "eXtensible Markup ...
- 大数据学习:Spark是什么,如何用Spark进行数据分析
给大家分享一下Spark是什么?如何用Spark进行数据分析,对大数据感兴趣的小伙伴就随着小编一起来了解一下吧. 大数据在线学习 什么是Apache Spark? Apache Spark是一 ...
- 使用Selenium慢慢向下滚动页面
我正试图从航班搜索页面抓取一些数据. 此页面以这种方式工作: 你填写一个表格,然后你点击按钮搜索 – 这没关系.当您单击该按钮时,您将被重定向到包含结果的页面,这就是问题所在.这个页面连续添加结果,例 ...
- 调试日志——基于stm32的智能声光报警器(三)
智能声光报警器基本功能调试完成. 1.通过拨码开关来设置LED闪烁的频率. 2.关门时喇叭不想,灯熄灭. 3.旁路模式时,灯处于闪烁状态,此时关门灯扔闪烁. 关于此次代码我觉得还是有可以优化的地方,电 ...
- scala (1) for 循环
scala if else 判断 (1)在scala中末尾不需要添加 分号 作为语句的终结符. val name = "Leo" (2) 在 scala 中 if else ...
- 20155220 实验一《Java开发环境的熟悉》实验报告
实验一Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验知识点 1.JVM.JRE.JDK的安装位置与区 ...
- 学号20155311 2016-2017-2《Java程序设计》课程总结
学号20155311 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:(http://www.cnblogs.com/gaoziyun11/p/ ...
- 关于正则表达式"\b"
今天刚刚开始看正则表达式就遇到一个十分头疼的问题,原文是这样的: “不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等.用hi来查找的话,这里边的hi也会被找出来. ...

