操作系统学习(五) 、代码段和数据段描述符

一、代码段和数据段描述符格式

  • 段描述符通用格式如下所示:

  • 代码段和数据段描述符中各个位的含义如下所示:

二、代码段和数据段描述符类型

当段描述符中S标志位(描述符类型)被置位,则该描述符用于代码段或数据段。此时类型字段中最高比特位(第二个双字的位11)用于确定是数据段描述符(复位)还是代码段描述符(置位)。

  • 代码段和数据段描述符类型如下所示:

  • 对于数据段描述符,类型字段的低3位(位8,9,10)分别用于表示已访问A,可写W,和扩展方向E,根据可写比特位W的设置,一个数据段可以是只读的,也可以是可读可写的。
  • 已访问比特位指明从上次操作系统复位该位之后一个段是否被访问过。每当处理器把一个段的段选择符加载进段寄存器,它就会设置该位。该位需要明确地清除,否则一直保持置位状态,该位可用于虚拟内存管理和调试。
  • 堆栈段必须是可读可写的数据段,若使用不可写的数据段的段选择符加载到SS寄存器,将导致一个一般保护异常。如果堆栈段的长度需要动态地改变,那么堆栈段可以是一个向下扩展的数据段(扩展标志位置位)。动态地该百年段限长将导致栈空间被添加到栈底部。
  • 对一代码段,类型字段的第三位被解释成已访问A,可读R,和一致的C。根据可读R标志的设置,代码段可以是只能执行、可执行/可读。当常数或其它静态数据以及指令码被放在了一个ROM中就可以使用一个可执行/可读代码段,这里,通过使用带CS前缀的指令或者把代码段选择符加载进一个数据段寄存器(DS,ES,FS或GS),我们可以读取代码段中的数据,在保护模式下,代码段是不可写的。
  • 代码段可以是一致性的或非一致性的。向更高特权级一致性代码段的执行控制转移,允许程序以当前特权级继续运行,向一个不同特权级的非一致性代码段的转移导致一般保护异常,除非使用了一个调用门或任务门。不访问保护设施的系统工具以及某些异常类型的处理过程可以放在一致性代码段中。需要防止低特权级程序或过程访问的工具应该存放在非一致性代码段中。
  • 所有的数据段都是非一致性的,即意味着它们不能被低特权级的程序或过程访问,与代码段不同,数据段可以被更高特权级的程序或过程访问,而无需使用特殊的访问门。

如果GDT或LDT中一个段描述符被存放在ROM中,那么若软件或处理器试图更新在ROM中的段描述符时,处理器就会进入一个无限循环(why?),为了防止这个问题,需要存放在ROM中的所有描述符的已访问位应该预先设置成置位状态,同时,删除操作系统中任何试图修改ROM中段描述符的代码。

原文地址:https://www.cnblogs.com/ay-a/p/9091223.html

时间: 2024-07-29 01:48:23

操作系统学习(五) 、代码段和数据段描述符的相关文章

操作系统--UNIX代码段和数据段分开

(1)代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像.代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作----它是不可写的. (2)数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量. (3)BSS段:BSS段包含了程序中未初始化的全局变量,在内存中bss段全部置零. (4)堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或者缩减.当进程调用ma

C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域.数据段属于静态内存分配. 代码段: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于 

代码段、数据段、堆栈段、数据段辨析

1.高位地址:栈(存放着局部变量和函数参数等数据),向下生长   (可读可写可执行) 2.           堆(给动态分配内存是使用),向上生长             (可读可写可执行) 3.           数据段(保存全局数据和静态数据)                    (可读可写不可执行) 4.地位地址:代码段(保存代码)                                (可读可执行不可写) 代码段就是存储程序文本的,所以有时候也叫做文本段,指令指针中的指令就

代码段、数据段、堆栈段辨析

1.高位地址:栈(存放着局部变量和函数参数等数据),向下生长   (可读可写可执行) 2.               堆(给动态分配内存是使用),向上生长                  (可读可写可执行) 3.               数据段(保存全局数据和静态数据)                             (可读可写不可执行) 4.地位地址:代码段(保存代码)                                             (可读可执行不可写)

转:程序内存空间(代码段、数据段、堆栈段)

https://blog.csdn.net/ywcpig/article/details/52303745 在冯诺依曼的体系结构中,一个进程必须有:代码段,堆栈段,数据段. 进程的虚拟地址空间图示如下: BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域.数据

BSS段、数据段、代码段、堆与栈

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域. BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域. 数据段属于静态内存分配. 代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区 域.这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读

内存分配(堆、栈、BSS、代码段、数据段)

这两天看了马士兵老师的视频.视频中提到了一个万能钥匙.就是了解程序运行中对内存的操作.主要讲了堆.栈.Data.说真的有点晕.看了两遍.也就略懂一二.在这做个小小知道总结 简介 我们程序运行的时候都是放在内存里的.根据静态.成员函数.代码段.对象.等等.放在不同的内存分块里.大概分为5块 1  栈 2  堆 3 BSS段-全局区-(静态区) 4 代码段 5 数据段 栈 存放局部变量.临时变量.声明.返回值.指向堆对象的地址(指针).总之存放一些小的东西.当不需要时候.栈会自动清除.比如一个加法方

可执行程序包括BSS段、数据段、代码段

可执行程序包括BSS段.数据段.代码段(也称文本段). 一.BSS BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域.特点是:可读写的,在程序执行之前BSS段会自动清0.所以,未初始的全局变量在程序执行之前已经成0了. 注意和数据段的区别,BSS存放的是未初始化的全局变量和静态变量,数据段存放的是初始化后的全局变量和静态变量. UNIX下可使用size命令查看可执行文件的段大小信息.如size a.out. 二.数据段 在采

程序运行中(BSS段、数据段、代码段、堆栈)

程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域.数据段属于静态内存分配. 代码段: 代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域.这部分区域的大小