http://www.myexception.cn/operating-system/484288.html http://www.myexception.cn/operating-system/445331.html http://www.myexception.cn/operating-system/445078.html 代码总体过程如下: 1.进入保护模式,显示字符In Protect Mode 2.进入ring3,将TSS(内层堆栈选择子SelectorStack->ss及偏移TopO…
[0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是干货,前面代码仅供参考的,且source code from orange's implemention of a os. ; ========================================== ; pmtest5a.asm ; 编译方法:nasm pmtest5a.asm -o…
[0]README text description from orange's implemention of a os . [1]特权级概述 当当前代码段试图访问一个段或者门时,目标段的DPL将会和 CPL 以及段或门选择子的RPL相比较,如何比较:(这里是干货) (1)数据段: DPL规定了可以访问此段的最低特权级:如一个数据段的DPL=1,那么只有CPL=0或1的程序才有权访问: (2)调用门: DPL规定了当前执行的程序或任务可以访问此调用门的最低特权级(这与数据段是一致的): (3)…
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). [IOT物联网小镇] 目录 目录 CPL:当前特权级 DPL:描述符特权级 RPL:请求者特权级 特权级检查规则 代码段的特权级检查 数据段的特权级检查 栈段的特权级检查 x86 处理器中,提供了4个特权级别:0,1,2,3.数字越小,特权级别越高! 一般来说,操作系统是的重要性.可靠性是最高的,…
①jmp是不负责任的调度,不保存任何信息,不考虑会回头.跳过去就什么也不管了.②call,保存eip等,以便程序重新跳回.ret是call的逆过程,是回头的过程.这都是cpu固有指令,因此要保存的信息,不用我们自己保存.我们直接使用指令即可③同一任务内特权级转移,跟 ②差不多,不过要准备个tss,并加载它,然后call 门一下就行了.④进程调度,进程的界限是我们人为加上的,cpu并不知道进程要切换了,也没有特定的进程指令.因此进程的状态需要我们自己保存.上面的关系好像是在盖房子,越盖越高,越盖越…
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). [IOT物联网小镇] 目录 目录 门描述符 调用门特权级检查规则 调用门的使用过程 安装调用门 把调用门的选择子告诉用户程序 用户程序通过调用门进入系统函数 栈的切换 在之前的文章中Linux从头学10:三级跳过程详解-从 bootloader 到 操作系统,再到应用程序,由于当时没有引入特权级的…
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在前两篇文章(<操作系统篇-浅谈实模式与保护模式>和<操作系统篇-分段机制与GDT|LDT>)中,我们提到过特权级与调用门,特别是在说到保护模式时,我们提到了内存的保护,"保护"这两个字的含义何在呢?不同权级之间是如何相互访问,如何通讯,如何保护,这些东西都跟调用门和不同代码段的特权级紧密相关.本文主要探讨的就是,保护模式下的调用门与特权级,在阅读本文之前,建议大家先看看blog的之前几篇文章…
原文标题:CPU Rings, Privilege, and Protection 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译一下.一来自己复习,二来与大家分享.] 可能你凭借直觉就知道应用程序的功能受到了Intel x86计算机的某种限制,有些特定的任务只有操作系统的代码才可以完成,但是你知道这到底是怎么一回事吗?在这篇文章里,我们会接触到x86的特权级(privilege level),看看操作系统和CPU…
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家讲解 RTX 运行模式的一个重要知识点,特权级模式和非特权级模式,有些资料或者书籍将非特权级模式称为用户模式. RTX 任务特权级知识点说明对于初学者只需记住本小节的知识点即可,如果要深入的了解还是需要花些时间去研究下 Cortex-M3或者 M4 权威指南.对于使用 Cortex-M3 或者 M4 内核的芯片来说,RTX 操作系统可以让任务运行在特权级或者非特权级模式,这两种模式是 M…
page_pde_offset = (__PAGE_OFFSET >> 20); /* __PAGE_OFFSET是0xc0000000,page_pde_offset = 3072 = 0xc00,是页目录中的偏移 */ 36 37 movl $(pg0 - __PAGE_OFFSET), %edi /* 将pg0对应的物理地址送到edi */ 38 movl $(swapper_pg_dir - __PAGE_OFFSET), %edx /* 将swapper_pg_dir(存放临时页全局…
[0]README text description from orange's implemention of a os and for complete code ,please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/p62.asm. [1] 回忆--关于堆栈 通过调用门进行有特权级变换的转移--理论篇 (1)出现的问题: call 指令 执行前后的堆栈已经不再是同一个堆栈 了,那么我们在堆栈A中压入参数和返…
[1]README 1.0)由于实现进程的切换任务,其功能涉及到 LDT + TSS +GATE + INTERRUPT:下面我们对这些内容进行复习: 1.1) source code from orange's implemention of a os . [2]知识复习(LDT+TSS+GATE + INTERRUPT) 2.1)LDT的复习 (1)在GDT中定义 LDT 描述符: (2)然后在实模式下,初始化 GDT中的LDT描述符: (3)还要初始化 LDT中的段描述符(用局部任务代码去…
https://github.com/yyu/osfs00 实验目的: 理解x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式. 关键数据结构.代码组织方式 掌握实模式与保护模式的切换 掌握特权级的概念,以及不同特权之间的转移 实验内容: 1. 认真阅读章节资料,掌握什么是保护模式,弄清关键数据结构: GDT.descriptor.selector.GDTR, 及其之间关系,阅读 pm.inc文件中数据结构以及含义,写出对宏Descriptor的分析 2. 调试代码,/a/ 掌…
进程的切换及调度等内容是和保护模式的相关技术紧密相连的,这些代码量可能并不多,但却至关重要. 我们需要一个数据结构记录一个进程的状态,在进程要被挂起的时候,进程信息就被写入这个数据结构,等到进程重新启动的时候,这个信息重新被读出来. 在很多情况下,进程和进程调度是运行在不同的层级上的.这里本着简单的原则,我们让所有任务运行在ring1,而让进程切换运行在ring0. 诱发进程切换的原因不只一种,比较典型的情况是发生了时钟中断.但并非在每一次时钟中断时都一定会发生进程切换,不过这里为了容易理解和实…
控制转移可以分为两大类  :同一任务内的控制转移    和   任务间的控制转移(任务切换) 同一个任务内的控制转移可以分为段内转移 .特权级不变的段间转移和特权级改变的段间转移 段内转移与实模式相同 不涉及特权级变换和任务切换  只有段间转移才涉及特权级变换和任务切换任务  重点为任务内的特权级变换和任务间的切换   一 任务内无特权级变换的转移 1.段间转移指令 jmp  call    ret    int    iret   都具有段间转移功能   另外中断和异常也将引起段间转移   其…
一.中断初始化 中断的一些硬件机制不做过多的描述,只介绍一些和linux实现比较贴近的机制,便于理解代码. 1.1 关于intel和linux几种门的简介 intel提供了4种门:系统门,中断门,陷阱门,调用门. 调用门:不同特权级之间实现受控的程序控制转移,它是放在GDT或LDT之中.使用调用门需要为CALL或JMP指令的操作数提供一个远指针,该指针中的段选择符用于指定调用门,指向的是GDT或LDT中的一个段,在低特权级代码切换到高特权级代码是会发生代码段的转移.(linux没有使用这种门,感…
OS 第六次实验随笔 第六章6.1-6.3相关的问题 进程状态保存与恢复 哪些状态 何时保存 保存在哪 如何恢复 特权级变换 用户进程到内核 内核回到用户进程 再次理解TSS .堆栈 从外环进入内环(特权级发生变化)时,如何访问TSS?堆栈的变化 P193页,中断发生的开始,ESP的值是刚刚从TSS里面渠道的进程表A中regs的最高地址,上述过程的实现代码在哪? 概述 形成进程的必要考虑.我们需要一数据结构来记录一个进程的状态,这样方便进行进程切换时,可以保存原来的进程状态.进程被挂起时就将信息…
★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重讲TSS如何进行任务切换). 1. 任务,任务的LDT和TSS 程序是记录在载体上的指令和数据,其正在执行的一个副本,叫做任务(Task).如果一个程序有多个副本正在内存中运行,那么他对应多个任务,每一个副本都是一个任务.为了有效地在任务之间进行隔离,处理器建议每个任务都应该具有他自己的描述符表,称…
相关学习资料 <深入理解计算机系统(原书第2版)>.pdf http://zh.wikipedia.org/zh/%E4%B8%AD%E6%96%B7 独辟蹊径品内核:Linux内核源代码导读 李云华著 中文 PDF版 https://www.kernel.org/ http://blog.csdn.net/orange_os/article/details/7485069 http://blog.csdn.net/sunnybeike/article/details/6958473 http…
6.3.4 Gate Descriptors Guard Procedure Entry Points 门描述符守卫程序入口 To provide protection for control transfers among executable segments at different privilege levels, the 80386 uses gate descriptors. There are four kinds of gate descriptors: 为了在不同特权级别的可…
在我们的操作系统中,已经存在的3个进程是运行在ring1上的,它们已经不能任意地使用某些指令,不能访问某些权限更高的内存区域,但如果一项任务需要这些使用指令或者内存区域时,只能通过系统调用来实现,它是应用程序和操作系统之间的桥梁. 所以,一件事情就可能是应用程序做一部分,操作系统做一部分.这样,问题就又涉及特权级变换. 很明显,这已经难不倒我们了,因为进程的切换就是不停地在重复这么一个特权级变换的过程.在那里,触发变换的是外部中断,我们把这个诱因换一下就可以了,变成"int nnn",…
写在前面 添油加醋系列第二弹--剖析GDT 头文件:https://github.com/bajdcc/MiniOS/blob/master/include/gdt.h 实现:https://github.com/bajdcc/MiniOS/blob/master/src/kernel/gdt.c 话说C语言的话除了刷刷OJ外,就是用来实现操作系统这个大头了.C语言比C++少了很多很多臃肿的语法特性,写起来非常优美(至少写操作系统是这样的).虽说C++有许多的奇技淫巧,一个算法有N种实现方法,但…
x86保护模式-七中断和异常 386相比较之前的cpu   增强了中断处理能力   并且引入了 异常概念 一 80386的中断和异常 为了支持多任务和虚拟存储器等功能,386把外部中断称为中断    把内部中断称为异常 最多支持256中断或异常 1.中断 中断是由异步的外部事件引起的.外部事件及中断响应与正执行的指令没有关系. 通常中断对应i/o操作的完成,cpu中intr引脚接受外部的可屏蔽的中断请求,NMI引脚接受外部不可屏蔽的中断请求. EFLAGS标志寄存器中的IF标志决定是否屏蔽可屏蔽…
一.段描述符的分类 在上一篇博文中已经说过,为了使用段,我们必须要创建段描述符.80X86中有各种各样的段描述符,下图展示了它们的分类. 看了上图,你也许会说:天啊,怎么这么多段描述符啊!我可怎么记住呢? 别担心,我会在以后的博文中,跟随原书的作者,为您逐步介绍.我们的学习是循序渐进的,所以不要求一下子掌握所有东西.我们的原则是:用到什么学什么.我们今天的重点是"存储段描述符". 二.段描述符的通用格式[1] 段描述符是GDT和LDT中的一个数据结构项,用于向处理器提供有关一个段的位置…
本文为上海交大 ipads 研究所陈海波老师等人所著的<现代操作系统:原理与实现>的课程实验(LAB)的学习笔记的第一篇. 书籍官网:现代操作系统:原理与实现,里面有实验的参考指南和代码仓库链接. 课程视频与 PPT:SE315 / 2020 / Welcome.建议做实验前至少把每个 LAB 对应的那一节视频看一下,否则可能不知道从哪下手. 我自己的通关代码:ChCore-lab - Kangyupl - gitee 仅是能通过测试集,不保证完全正确.开源的目的是供自学的朋友们误入牛角尖.挠…
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言     在<操作系统篇-浅谈实模式与保护模式>中提到了两种模式,我们说在操作系统中,其实大部分时间是待在保护模式中的.因此若想理解操作系统程序中的启动相关的部分,必须要理解保护模式下的编程,而分段机制是保护模式编程下的基础.而且,由于实模式与保护模式的不同,对保护模式下的分段机制更需要注意. 二.线性地址 在保护模式下编程,访问内存时,需要在程序中给出段地址和偏移量,因为分段是保护模式的基本特征之一.传统上,段地址和偏移地址…
★PART1:进入保护模式 1. 全局描述符表(Global Descriptor Table,GDT)        32位保护模式下,如果要使用一个段,必须先登记,登记的信息包括段的起始地址,段的界限和各种访问属性,如果偏移地址超过了段的界限,就会引发异常中断.和一个段有关的信息需要8个字节来描述,这被称为段的描述符(Segement Descriptor),每个段都需要一个描述符,为了存放描述符,需要在内存中开辟一段空间.这些描述符集中存放,构成了一个描述符表. 为了跟踪全局描述符表,处理…
一.80386CPU介绍 Inter80386CPU是Inter公司于1985年推出的第一款32位80x86系列的微处理器.80386的数据总线是32位的,其地址总线也是32位,因而最大可寻址4GB的存储空间. 80386作为x86系列CPU的一员,保持着对更早生产的x86CPU的向前兼容.80386在当时主要为支持高性能的应用领域和多用户.多任务操作系统而设计,提供了硬件级的特权级保护.多任务切换.内存分页等功能. 80386有三种运行模式:实模式.保护模式和虚拟8086模式. 在实模式下,8…
0x01原因 分段的产生原属于安全问题. 一个程序可以自由的访问不属于它的内存位置,甚至可以对那些内容进行修改.这也导致安全问题 促使一种内存隔离的手段 分段的产生. 0x02分段原理 处理器要求在加载程序时,先定义该程序所拥有的段,然后允许使用这些段.定义段时需要基地址,段界限,特权级别,类型等. 在一个程序访问cs,ss,ds,es 这些段时.处理器将会实施检查,防止内存违规访问. 因此有了段描述符来描述这些段的内容和权限 0x03段描述符 认识段描述符先定义全局描述符表GDT,为了跟踪GD…
x86-3-段式管理(segmentation) 3.1 段式管理概述: 从8086CPU开始,为了让程序在内存中能自由浮动而又不影响它的正常执行,CPU将内存划分成逻辑上的段来给程序使用. x86继续沿用了这一模式,但是保护模式将其管理起来,进行保护.而段式管理正是用来对段进行管理的. 在保护模式下,会将每个段的信息先进行登记. 和段有关的信息需要8 个字节来描述,所以称为段描述符 (Segment Descriptor),每个段都需要一个描述符.为了存放这些段描述符,就在内存中开辟了一段空间…