80x86 保护模式极其编程


      首先我不得不说。看这章真的非常纠结。。。看了半天。不知道这个东西能干嘛。我感觉唯一有点用的就是对于内存映射的理解。。。我假设不在底层给80x86写汇编的话。我真不知道这章能对我有什么用。

。。



update:
{

          当我决定暂停下来的时候,暂停这篇blog,我认为反思这样的行为都是伟大的。对于之前“能对我有什么用”的想法有了不同的见解。我发现这个保护模式极其编程还是挺有意思的。我之前不知道APUE里面讲current saved privilege是什么意思,那几种权限搞的我晕。感觉相同是“对我好像没什么用”。可是慢慢的我发现这些东西是有联系的。多看一点看似“无关紧要”的知识,往往对其它的知识的理解可以起到非常大的帮助。

这个保护模式比較难啃,暂停并非停止,我喜欢回过头来看问题。喜欢update。

}



还是留下自己认为重要的理解了的笔记吧。。。




4.1.1标志寄存器--EFLAGS


2014.11.15勘误:PF是不是恢复标志位,是奇偶校验位!



    • TF:trap flag 当设置该位的时候。可为调试操作启动单步调试运行方式,复位时则禁止单步运行。
    • IOPL: I/O privilege level。指明当前执行程序的IO特权级IOPL。当前执行程序的CPL必须小于或者等于这个IOPL才干訪问这个IO地址空间。
    • NT:nested task。控制着被中断任务和调用任务之间的链接关系。

    • RF:resume flag。用于控制处理器对断点指令的响应。当设置时,这个标志位会暂时禁止断点指令产生的调试异常;当标志位复位的时候。断点指令将会产生异常。
    • VM: vitual 8086 Mode。设置则开启虚拟8086方式;复位则回到保护模式。




4.1.2内存管理寄存器-- GDTR, LDTR, IDTR and TR




GDTR: global  descriptor table register

IDTR  : interrupt descriptor table register 

LDTR: local descriptor table register

 TR : task register. 用于存放当前任务(TSS,taks state segment)段的16位选择符,32位基地址。16位段长度,和描写叙述                               符属性值。






4.1.3控制寄存器 CR0-CR3






4.2保护模式的内存寻址


4.2.1内存寻址


        内存是指一组有序的字节组成的数组,每一个字节有唯一的内存地址,内存寻址则是指对内存在内存中的某个指定数据对象的地址。



         80x86支持多种数据类型:1字节。2字节,4字节。最小数据类型的寻址是对1字节数据的定位。

80x86是一种先存小值(small endian)的处理器



         为了进行内存寻址。80x86是使用了一种称作段(segment)的寻址技术。这样的寻址技术把内存空间分成一个或者多个称为段的线性区域,从而对内存中的一个数据对象的寻址就须要使用一个段的起始地址(段地址)和一个段内偏移地址两部分组成。


         程序中由16位的段和32位的偏移构成的48位地址或者长指针称为一个逻辑地址(虚拟地址)。仅由32位偏移地址或者指针确定的地址是基于当前段的对象地址。


          80x86为段部分提供了6个存放段选择符的段寄存器:CS,DS,ES,SS,FS。GS。

          CS(code segment resigter)总是用来寻址代码段.在不论什么指定时刻由CS寻址的段称为当前代码段。

          由段寄存器SS寻址的段称为当前堆栈段(stack segment register)


指令寻址方式:
偏移地址 =  基地址+(变地址*比例因子)+偏移量。


4.2.2 地址变换


       不论什么完整的内存管理系统都包括两个关键部分:保护和地址变换。提供保护措施能够防止一个任务訪问另外一个任务或者操作系统的内存区域。


        程序中的地址是由两部分组成的逻辑地址,这样的逻辑地址并不能直接用于訪问物理内存,而须要使用地址变换机制将它变换或者映射到物理内存地址上。


        在地址比那还过程中,第一阶段的分段变换机制总是存在的,而第二阶段的分页机制则是供选用的









4.3.2 保护


1.任务之间的保护


        80x86使用的方法是通过每一个任务放置在不同的虚拟地址空间中,并给予每一个任务不同的的逻辑地址到物理地址的变换映射。每一个任务中的地址变换功能被定义成一个任务中的逻辑地址映射到物理内存的一部分区域。而还有一个任务中的逻辑地址映射到物理内存中的不同区域中。因为一个任务不可能生成可以映射到其它任务逻辑地址相应使用的物理内存部分,所以全部任务都被隔绝开了。。

。。。

。事实上我认为这里的映射更应该做函数讲,这是数学上的概念,一一相应的映射是函数。




全部任务都具有的同样虚拟地址空间部分被称为全局地址空间(global address space)。

每一个任务唯一的虚拟地址空间部分被称为局部地址空间(local address space)。


2. 特权级保护。


          在一个任务中。定义了4个运行特权级(privilege levels),用于根据段中含有的数据的铭感度以及任务中不同程序部分的受信程度,来运行对任务中各段的訪问。


          当一个程序企图訪问一个段时。当前特权级就会与段的特权级进行比較,以确定是否有訪问许可。

在给定CPL(current privilege level)级别上运行的程序同意訪问同级别或者低级别的数据段。不论什么高级别段的引用都是非法的,而且会引发一个异常来通知操作系统。


          每一个特权级都有自己的程序栈。以避免使用共享栈带来的保护问题。

当一个程序从一个特权级切换到另外一个特权级的时候,堆栈段也随之该换到新的级别的堆栈中。









update : 2014.05.03



果然分页是必不可免的!



于是乎,补呗。

4.4分页机制

分段机制和逻辑地址转换成线性地址,而分页则线性地址转换成物理地址。



分页与分段的最大不同在于分页使用了固定长度的页面。段的长度通常与存放在当中的代码和数据结构具有同样的长度。

与段不同,页面具有固定的长度。假设仅使用分段地址转换,那么储存在物理地址中的一个数据结构包括其全部的部分。但假设使用了分页。那么一个数据结构就能够分一部分储存在物理内存中,而还有一部分保存在磁盘中。

为了降低地址转换所要求的总线周期数量。近期訪问的页文件夹和页表会被存放在处理器缓冲器件中,TLB(http://blog.csdn.net/cinmyheart/article/details/24888847 MOS 的第三章有讲这个)

4.4.1页表结构

1.两级页表结构










2.不存在的页表



           文件夹表项中的存在位还能够用于在虚拟内存中存放二级页表。这意味着在不论什么时候仅仅有部分二级页表须要存放在物理内存中,而其余的可保存在磁盘上。

处于物理内存中页表相应的页文件夹项将被标注为存在。以表明可用他们进行分页转换。处于磁盘上的页表相应的页文件夹项将被标注为不存在。因为二级页表不存在而引发的异常会通知操作系统把缺少的页表从磁盘上载入进物理内存。把页表储存在虚拟内存中降低了保存分页转换表所须要的物理内存量。

4.4.2页表项格式







P 位0是存在标志,用于指明页表项对地址转换是否有效。1有效,0无效



R/W  位1是读写标识。0表示仅仅读或仅仅可运行



U/S 位2是用户/超级用户标识。

1,不论什么特权级都能够訪问该页面。0,那么页面仅仅能被执行在超级用户特权级上的程序訪问。对全部映射的页面有效


A 位5是已訪问位。当处理器訪问这个页面时,会被置1



D 位6是页面已经被改动标识。置1表示是dirty page



AVL 该字段是保留字段。处理器不会改动这些位。


















《linux 内核全然剖析》 chapter 4 80x86 保护模式极其编程的更多相关文章

  1. 80X86保护模式及其编程(一)

    80x86系统寄存器和系统指令 1.标志寄存器(EFLAGS) 标志寄存器EFLAGS的标志位含义如下图: TF 位8是跟踪标志(Trace flag),当设置该位时可为调试操作启动单步执行方式.复位 ...

  2. 《linux 内核全然剖析》 chapter 2 微型计算机组成结构

    微型计算机组成结构 系统的基本组成: 软件是一种控制硬件操作和动作的指令流. 2.1 微型计算机的组成原理 当中CPU通过地址线,数据线,和控制信号线组成的内部总线与系统其它部分进行数据通信.地址线用 ...

  3. 《linux 内核全然剖析》sched.c sched.h 代码分析笔记

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011368821/article/details/25129835 sched.c sched.h ...

  4. 《linux 内核全然剖析》 fork.c 代码分析笔记

    fork.c 代码分析笔记 verifiy_area long last_pid=0; //全局变量,用来记录眼下最大的pid数值 void verify_area(void * addr,int s ...

  5. 《linux 内核全然剖析》 sys.c 代码分析

    sys.c 代码分析 setregid /* * This is done BSD-style, with no consideration of the saved gid, except * th ...

  6. 《linux 内核全然剖析》 mktime.c

    tm结构体的定义在time.h里面 struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_y ...

  7. 《linux 内核全然剖析》编译linux 0.12 内核 Ubuntu 64bits 环境

    我×.. . 最终好了,大概3 4个小时吧...各种毛刺问题.终究还是闯过来了.. .. ubuntu2@ubuntu:~/Downloads/linux-0.00-050613/linux-0.00 ...

  8. 《linux 内核全然剖析》 include/asm/io.h

    include/asm/io.h #define outb(value,port) \ __asm__ ("outb %%al,%%dx"::"a" (valu ...

  9. 《linux 内核全然剖析》 笔记 CODE_SPACE 宏定义分析

    在memory.c里面.遇到一个宏定义,例如以下: #define CODE_SPACE(addr) ((((addr)+4095)&~4095) < \ current->sta ...

随机推荐

  1. NYOJ 170 网络的可靠性 (数学)

    题目链接 描述 A公司是全球依靠的互联网解决方案提供商,也是2010年世博会的高级赞助商.它将提供先进的网络协作技术,展示其"智能+互联"的生活概念,同时为参观者提供高品质的个人体 ...

  2. poj 2406 Power Strings(kmp循环节)

    题目链接:http://poj.org/problem?id=2406 题目大意:如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]. 例如:      a    b  ...

  3. LeetCode 192:Reverse Bits

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  4. js判断处理undefined类型的数据

    code: resFlag = response.result.data.result; /查询客户为白名单用户时,将"*该企业已被列入黑名单"标记清除 if(typeof res ...

  5. 【 Nginx 】proxy_cache 模块的使用记录

    部署环境:nginx + tomcat  同一台服务器. 通过nginx反向代理tomcat. 配置如下: user www www; worker_processes auto; error_log ...

  6. selenium 滚动条操作(JavaScript操作)

    前言 一般我们想到的必须使用滚动条的场景是:注册时的法律条文的阅读.判断用户是否阅读完的标准是:滚动条是否拉到页面底部.当然,有时候为使操作更接近用户行为也会使用滚动条,例如用户要操作的元素在页面的第 ...

  7. poj 1066(枚举+线段相交)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6328   Accepted: 2627 Des ...

  8. 模板—数学—Lucas

    模板—数学—Lucas Code: #include <cstdio> #include <algorithm> using namespace std; #define N ...

  9. Codeforces #449 Div2 D

    #449 Div2 D 题意 交互式类题目. 起始有 n 张纸,会给出 m 次数字 p (\(1 \leq p \leq c\)),每次可选择一张纸,并在纸上写上这个数字,如果纸上已经存在数字,会覆盖 ...

  10. ( 转 ) mysql 实战 or、in与union all 的查询效率

    OR.in和union all 查询效率到底哪个快. 网上很多的声音都是说union all 快于 or.in,因为or.in会导致全表扫描,他们给出了很多的实例. 但真的union all真的快于o ...