关于段及相关概念的一些自己的阐述

原创 2006年06月09日 12:07:00

1.
void sched_init(void)
{...
00392    

set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss));

00393    

set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt));
...}
gdt:全局描述符,一共定义256个描述符,GDT本身不是一个段而是线形空间

的一个数据结构。GDT的基地址和长度需要加载进GDTR寄存器。GDT的基地

址要以8个字节对齐获得最佳的运行效率。因为GDT描述符号以8字节为单位


2.结构相关解释
typedef struct desc_struct {
     unsigned long a,b;
 } desc_table;
这里使用两个标准long四字节的存放gdt和ldt。
首先程序运行在虚拟地址上的(实际程序都如此在保护模式下)虚拟地址是

由两部分组成 段选择符号(16)+偏梁量(有效地址32位);通过段选择符号来

访问相应的段描述符号,由段描述符中提供的段基地址,限长,属性及虚拟地

址另外的偏移来构造线形地址。
a.段选择符:是虚拟地址组成部分见上面描述。其中前16位是段的唯一标志

,并且提供了段描述符表GDT中的一个字段的偏移量。具体的组成如下面表

示:
|15-3描述符索引index|2是TI|1-0是RPL|
index:索引值用于寻找对应的描述符表中的具体段
TI: 表示是GDT还是LDT
RPL:类似权限的东西
Remark:段选择符总共提供6个,CS DS SS ES FS GS,其实段描述符信息在访

问的时候由cpu自动通过对16位段选择符的解码来加载到一个所谓的影子寄

存器中,这样速度会非常快。可以直接使用当然对于我们用户可能是看不到

这个寄存器的存在和操作。
b.段描述符表,如同gdt上面的也属于段描述符表的一种,用于提供段选择符

号的最终访问获得存储的段信息。
c:最终的线形地址确立是由段描述符中提供的段基址+虚拟地址的段偏移。

然后再根据分页的方法获得最终的物理地址。

3.描述格式
//这个两个低层调用及最后一个实现宏用于调用设置TSS,LDT段描述孵内容


//n:为描述符的地址,即后面会往n开始到n+7位置中写入一个完整的8个字

节的段描述符。
//add:基地址,即段信息中所保存的段基址
//0x8X是属性描述表示是何种类型的段TSS or LDT or the other
#define  set_tss_desc(n, addr)   _set_tssldt_desc(((char *)

(n)),((int)(addr)),"0x89")
#define  set_ldt_desc(n, addr)   _set_tssldt_desc(((char *)

(n)),((int)(addr)),"0x82")
段描述符的格式
高32位中
|31-24:基地址

31..24|23:G|22:D/B|21:0|20:AVL|19-16:Limit19..16|15:P|14-13:DPL|1

2:S|11-8:TYPE|7-0:基地址23..16|
低32位中
|31-16:base address 15..0|15-0:Segment Limit|

4.
//看具体实现加载段描述符的过程
#define _set_tssldt_desc  (  n,  addr,  type)
//104是段限长,TSS最长104个字节放到低2个字节 15-0:Segment Limit
__asm__ ("movw $104,%1/n/t" /
//ax段基地址的低16位放入 31-16:base address 15..0
    "movw %%ax,%2/n/t" /
//右移16位 ax中变成高16位地址
    "rorl $16,%%eax/n/t" /
//将高16位地址中的低8位放入 7-0:基地址23..16
    "movb %%al,%3/n/t" /
//将type放入|15:P|14-13:DPL|12:S|11-8:TYPE
    "movb $" type ",%4/n/t" /
//|23:G|22:D/B|21:0|20:AVL|19-16:Limit19..16|全部置零
    "movb $0x00,%5/n/t" /
//高基地址8位放入最高位
    "movb %%ah,%6/n/t" /
    "rorl $16,%%eax" /
    //输入规则%0指定eax存放addr段基址,%1~%6均为指定m内存地址分别

为n,n+2,n+4...地址内容
    ::"a" (addr), "m" (*(n)), "m" (*(n+2)), "m" (*(n+4)), /
     "m" (*(n+5)), "m" (*(n+6)), "m" (*(n+7)) /
    )
5.加载任务TSS,LDT等段选择符和段描述符加载到任务寄存器中的实现
n:第n号任务或局部表的段偏移
//ltr或者lldt命令加载%%ax的段选择符,此段选择可以看到是由低层的一

个宏_TSS和_LDT来返回来实现。
#define ltr  (n)     __asm__("ltr %%ax"::"a" (_TSS(n)))
#define lldt (n)     __asm__("lldt %%ax"::"a" (_LDT(n)))
//_TSS _LDT将返回一个当前任务信息或者局部描述符的对应段偏移是相对

于GDT中的偏移,这里使用一个简单的计算公式 n*(8+8)+起始偏移数目*8,

这里我们要看下这些TSS和LDT在GDT中位置。
#define _TSS  (n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3))
#define _LDT  (n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3))
6.GDT具体分布
0 |NULL   |  不可以使用的GDT(0)
1 |系统代码段CS |  操作系统的自己使用
2 |系统数据段DS |  操作系统的数据段
3 |系统调用 |  一些调用的信息符
4 |TSS0  |  这里很容易看到FIRST_TSS_ENTRY=4
5 |LDT0  |  这里很容易看到FIRST_LDT_ENTRY=5
....
每个域都是8个字节所以第n个TSS地址 = TSS0的基址+ (n*LSSi-LSSi-1)
= FIRST_TSS_ENTRY*8 + n*(8+8)
= FIRST_TSS_ENTRY<<3+n<<4
同理可以推导出LDT的地址进行加载

至此基本清楚段选择符 描述符 段一些关系和如何设置的操作
#define str  (n)  
__asm__("str %%ax/n/t" /
    "subl %2,%%eax/n/t" /
    "shrl $4,%%eax" /
    :"=a" (n) /
    :"a" (0),"i" (FIRST_TSS_ENTRY<<3))

 

51单片机之——中断的概念

前面讲了许多51单片机的外设部分,大致有一些芯片,以及元器件。而这篇博文就走进单片机内设——中断系统。 首先,搞清楚什么是中断? 引用资料书的话:对于单片机而言,中断是指CPU在处理某一件事A时,...
  • xiaocheng_sky
  • xiaocheng_sky
  • 2016年08月09日 21:24
  • 2086

Java中的流(概念和示例)

首先,流是什么? 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。 流具有方向性,至于是输入...
  • superjunjin
  • superjunjin
  • 2014年03月13日 17:08
  • 2310

SQL(一)-基本概念

1:(数据库简介 数据库是以便于访问的方式组织的数据的集合,方便有效的管理和更新。 数据库由存储相关信息的表组成。 例如,如果您要创建包含大量信息(如视频,用户名,密码和评论)的YouTube网站,您...
  • cho3en1
  • cho3en1
  • 2016年11月21日 13:43
  • 240

SPSS——基本的统计概念

SPSS——基本的统计概念
  • liuyuan_jq
  • liuyuan_jq
  • 2016年05月12日 08:17
  • 1011

三、物理地址和段的概念

1.   物理地址的概念:        a. 物理地址就是指CPU的内存地址空间中的地址;        b. 内存地址空间将所有不同存储设备的存储空间都整合成了一个以为线性的地址空间;      ...
  • u011767511
  • u011767511
  • 2013年09月17日 20:30
  • 1115

矩阵论中的常见概念

学校时候学的线性代数都忘光了,总结一下常用的东西 矩阵的行列式性质:  where In is the n × n identity matrix.{\displaystyle \det(A...
  • u011722133
  • u011722133
  • 2017年06月12日 16:36
  • 200

网页设计部分概念简述

WWW(World  Wide Web)是一个基于超文本(Hypertext)方式的信息检索服务工具。采用指针链接的超网状结构,将任何地方的信息联系在一起。WWW系统允许所指向目标信息不仅可以是文本,...
  • weixin_38077630
  • weixin_38077630
  • 2017年04月02日 02:32
  • 209

关于java中的锁的理解(通俗易懂)

这是我看过的极好的一篇关于锁的机制的介绍,通俗易懂,非常好,采纳,接受,给赞...
  • u012291108
  • u012291108
  • 2016年05月08日 23:41
  • 3771

字符串相关概念

本文简单讲解字符串的相关概念。如:回文、子串、子序列、前缀树、后缀树、后缀数组、匹配、字典序。...
  • CodingEnding
  • CodingEnding
  • 2017年03月16日 18:02
  • 357

ucos-II中的一些基本概念①

 一、实时系统 软实时系统:软实时系统中系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成 硬实时系统:在硬实时系统中,各任务不仅要执行无误而且要做到准时   ...
  • Eleanor_12
  • Eleanor_12
  • 2016年09月09日 22:27
  • 265
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于段及相关概念的一些自己的阐述
举报原因:
原因补充:

(最多只允许输入30个字)