386保护模式中段选择子的详细的分析

***************************************************************
386保护模式类的Linux内核源代码分析
***************************************************************
include/asm-i386/segment.h
***************************************************************
#ifndef _ASM_SEGMENT_H
#define _ASM_SEGMENT_H
内核注释分析:
/*
* The layout of the per-CPU GDT under Linux:
*
* 0 - null
* 1 - reserved
* 2 - reserved
* 3 - reserved
分析:
1)GDT中的前面4个描述符共32B,不使用,第一个为NULL,后面3个为保留不用。
2)从号索引的描述符开始使用: 每个GDT描述符占用8字节,8个GDT描述符就占用64B。刚好就读入一个L1Cache中去。
参考资料:
i386体系结构中的有关L1 Cache的大小的定义如下:
#define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT)
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
#define L1_CACHE_SHIFT_MAX 7 /* largest L1 which this arch supports */
实际上从这里看出L1 cache的大小当为可配置,估计默认配置为64B,最大为128B.即:L1_CACHE_SHIFT默认为6。L1_CACHE_BYTES为64。
---------------------------------------------------------------
*
* 4 - unused <==== new cacheline
* 5 - unused
*
* ------- start of TLS (Thread-Local Storage) segments:
*
* 6 - TLS segment #1 [ glibc's TLS segment ]
* 7 - TLS segment #2 [ Wine's %fs Win32 segment ]
* 8 - TLS segment #3
* 9 - reserved
* 10 - reserved
* 11 - reserved
第一个cacheline(64B,8个描述符),专门用于存放TLS描述符。

继续内核注释分析:
*
* ------- start of kernel segments:
*
* 12 - kernel code segment <==== new cacheline
* 13 - kernel data segment
* 14 - default user CS
* 15 - default user DS
* 16 - TSS
* 17 - LDT
* 18 - PNPBIOS support (16->32 gate)
* 19 - PNPBIOS support
分析:
选择子:13位索引:1位TI:2位RPL
12 - kernel code segment : 0x60 : 0000 0000 0110 0 0 00
13 - kernel data segment : 0x68 : 0000 0000 0110 1 0 00
14 - default user CS : 0x73 : 0000 0000 0111 0 0 11
15 - default user DS : 0x7B : 0000 0000 0111 1 0 11
16 - TSS : 0x80 : 0000 0000 1000 0 0 00
17 - LDT : 0x88 : 0000 0000 1000 1 0 00

18 - PNPBIOS support : 0x90 : 0000 0000 1001 0 0 00
19 - PNPBIOS support : 0x98 : 0000 0000 1001 1 0 00
1.这个cacheline将内核的代码段,数据段;用户代码段,用户数据段;TSS;LDT;PNTBIOS描述符一网打尽。

继续内核注释分析:
* 20 - PNPBIOS support <==== new cacheline
* 21 - PNPBIOS support
* 22 - PNPBIOS support
* 23 - APM BIOS support
* 24 - APM BIOS support
* 25 - APM BIOS support
* 26 - ESPFIX small SS
* 27 - unused
分析:
选择子:13位索引:1位TI:2位RPL
20 - PNPBIOS support : 0xa0 : 0000 0000 1010 0 0 00
21 - PNPBIOS support : 0xa8 : 0000 0000 1010 1 0 00
22 - PNPBIOS support : 0xb0 : 0000 0000 1011 0 0 00
23 - APM BIOS support : 0xb8 : 0000 0000 1011 1 0 00
24 - APM BIOS support : 0xc0 : 0000 0000 1100 0 0 00
25 - APM BIOS support : 0xc8 : 0000 0000 1100 1 0 00
26 - ESPFIX small SS : 0xd0 : 0000 0000 1101 0 0 00
27 - unused : 0xd8 : 0000 0000 1101 1 0 00

---------------------------------------------------------------
继续内核注释分析:
* 28 - unused <==== new cacheline
* 29 - unused
* 30 - unused
* 31 - TSS for double fault handler
*/
分析:
选择子:13位索引:1位TI:2位RPL
28 - unused : 0xe0 : 0000 0000 1110 0 0 00
29 - unused : 0xe8 : 0000 0000 1110 1 0 00
30 - unused : 0xf0 : 0000 0000 1111 0 0 00
31 -TSS-double fault handler : 0xf8 : 0000 0000 1111 1 0 00
---------------------------------------------------------------
补充资料:
arch/i386/kernel/head.S
有了以上的分析,下面可以一并吃掉head.S中的有关cpu_gdt_table的初始化的代码段。本着尽可能扩展开来,多学多读懂源代码的思想,决定一并搞掉这一块。
/*
* The Global Descriptor Table contains 28 quadwords, per-CPU.
认为:这里该是32 quadwords,而非28 quadwords
*/
.align PAGE_SIZE_asm
ENTRY(cpu_gdt_table)
.quad 0x0000000000000000 /* NULL descriptor */
.quad 0x0000000000000000 /* 0x0b reserved */
.quad 0x0000000000000000 /* 0x13 reserved */
.quad 0x0000000000000000 /* 0x1b reserved */
.quad 0x0000000000000000 /* 0x20 unused */
.quad 0x0000000000000000 /* 0x28 unused */
.quad 0x0000000000000000 /* 0x33 TLS entry 1 */
.quad 0x0000000000000000 /* 0x3b TLS entry 2 */
.quad 0x0000000000000000 /* 0x43 TLS entry 3 */
.quad 0x0000000000000000 /* 0x4b reserved */
.quad 0x0000000000000000 /* 0x53 reserved */
.quad 0x0000000000000000 /* 0x5b reserved */
分析:
0x00 00 00 00 00 00 00 00的含义分析:
1)最低2B: 00 00为Segment Limit低16位:为0
2)中间3B:00 00 00为Segment Base的低3B:也为0
3)第5,6B:为Attributes:
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

G:0,表示界限粒度为字节,只对Segment Limit有效
D:0,段上界为64KB
0:0,保留位总为0
AVL:软件可利用位
Limit(4bit):0000:Segment Limit的高4位。
P:0,存在位,表示描述符对地址转换无效,该描述符不存在。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:0,说明描述符类型,DT=1:存储段描述符,DT=0:系统段描述符和门描述符
TYPE(4bit):(E-ED-W-A)0000
E:0,数据段
ED:0,向高扩展
W:0,只读
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B
所以:本0x0000000000000000:段基址为0X00000000,段界限为0X00000,以字节为单位,该描述符不存在于内存,特权级为0,为系统段描述符,描述的为数据段,该数据段向高扩展,只读,尚未访问。
实际上,这前面12个描述符为0,有的为NULL,有的为reserved,只有TLS尚未初始化赋值。
---------------------------------------------------------------
继续head.S分析:
.quad 0x00cf9a000000ffff/* 0x60 kernel 4GB code at 0x00000000 */

分析:
0x00 cf 9a 00 00 00 ff ff的含义分析:
1)最低2B: ff ff为Segment Limit低16位,再加上高4位1111,共20位1,所以为1M.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:cf 9a==1100 1111 1001 1010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

1100:G-D-0-AVL
G:1,表示界限粒度为4KB,只对Segment Limit有效,再配合上20位的Segment Limit(1M),故段界限为4GB
D:1,(32位代码段)指令使用32位地址及32或8位操作数,段偏移量为32位地址
0:0,保留位总为0
AVL:软件可利用位

Limit(4bit):1111
Limit(4bit): 1111: Segment Limit的高4位。再配合上低16位,共20位1,所以为1M。

P-DPL(2bit)-DT:1001
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=1:存储段描述符,DT=0:系统段描述符和门描述符

TYPE(4bit):1010
TYPE(4bit):(E-C-R-A)1010
E:1,代码段
C:0,非一致代码段
R:1,可读可执行
A:0,尚未访问

附:一致代码段和非一致代码段的解释:
当转移的目标是一个特权级更高的一致代码段,当前的特权级会被延续下去,而向特权级更高的非一致代码段的转移则会引起一般保护错,除非使用调用门或任务门。所以,为防止低特权级的程序访问而需保护起来的系统代码当放在非一致代码段。

4)最高一个字节00,为Segment Base的最高1B

所以:本0x00cf9a000000ffff:段基址为0X00 00 00 00,段界限为4GB,以4KB为单位,该描述符存在于内存,特权级为0,为存储段描述符,描述的为32位代码段,该代码段为非一致代码段,可读可执行,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x00cf92000000ffff/* 0x68 kernel 4GB data at 0x00000000 */

分析:
0x00 cf 92 00 00 00 ff ff的含义分析:
1)最低2B: ff ff为Segment Limit低16位,再加上高4位1111,共20位1,所以为1M.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:cf 92==1100 1111 1001 0010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

1100:G-D-0-AVL
G:1,表示界限粒度为4KB,只对Segment Limit有效,再配合上20位的Segment Limit(1M),故段界限为4GB
D:1,(数据段)段界限为4G
0:0,保留位总为0
AVL:0,软件可利用位

1111:Limit(4bit)
Limit(4bit): 1111: Segment Limit的高4位。再配合上低16位,共20位1,所以为1M。

1001:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=1:存储段描述符,DT=0:系统段描述符和门描述符

0010:TYPE(4bit)
TYPE(4bit):(E-ED-W-A)0010
E:0,数据段
ED:0,向高扩展
W:1,可写
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B

所以:本0x00cf92000000ffff:段基址为0X00 00 00 00,段界限为4GB,以4KB为单位,该描述符存在于内存,特权级为0,为存储段描述符,描述的为数据段,该数据段为向高扩展,可写,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x00cffa000000ffff/* 0x73 user 4GB code at 0x00000000 */

分析:
0x00 cf fa 00 00 00 ff ff的含义分析:
1)最低2B: ff ff为Segment Limit低16位,再加上高4位1111,共20位1,所以为1M.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:cf fa==1100 1111 1111 1010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

1100:G-D-0-AVL
G:1,表示界限粒度为4KB,只对Segment Limit有效,再配合上20位的Segment Limit(1M),故段界限为4GB
D:1,(32位代码段)指令使用32位地址及32或8位操作数,段偏移量为32位地址
0:0,保留位总为0
AVL:0,软件可利用位

1111:Limit(4bit)
Limit(4bit): 1111: Segment Limit的高4位。再配合上低16位,共20位1,所以为1M。

1111:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):11,3级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=1:存储段描述符,DT=0:系统段描述符和门描述符

1010:TYPE(4bit)
TYPE(4bit):(E-C-R-A)0010
E:1,代码段
C:0,非一致代码段
R:1,可读,可执行
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B

所以:本0x00cffa000000ffff:段基址为0X00 00 00 00,段界限为4GB,以4KB为单位,该描述符存在于内存,特权级为3,为存储段描述符,描述的为用户32位代码段,该代码段为非一致代码段,可读,可执行,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x00cff2000000ffff/* 0x7b user 4GB data at 0x00000000 */

分析:
0x00 cf f2 00 00 00 ff ff的含义分析:
1)最低2B: ff ff为Segment Limit低16位,再加上高4位1111,共20位1,所以为1M.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:cf f2==1100 1111 1111 0010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

1100:G-D-0-AVL
G:1,表示界限粒度为4KB,只对Segment Limit有效,再配合上20位的Segment Limit(1M),故段界限为4GB
D:1,(数据段)段界限为4G
0:0,保留位总为0
AVL:0,软件可利用位

1111:Limit(4bit)
Limit(4bit): 1111: Segment Limit的高4位。再配合上低16位,共20位1,所以为1M。

1111:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):11,3级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=1:存储段描述符

0010:TYPE(4bit)
TYPE(4bit):(E-ED-W-A)0010
E:0,数据段
ED:0,向高扩展
W:1,可写
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B

所以:本0x00cff2000000ffff:段基址为0X00 00 00 00,段界限为4GB,以4KB为单位,该描述符存在于内存,特权级为3,为存储段描述符,描述的为用户数据段,该数据段为向高扩展,可写,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x0000000000000000 /* 0x80 TSS descriptor */
.quad 0x0000000000000000 /* 0x88 LDT descriptor */
分析同前:
TSS,LDT都尚未初始化
---------------------------------------------------------------
继续head.S分析:
/* Segments used for calling PnP BIOS */
.quad 0x00c09a0000000000 /* 0x90 32-bit code */
分析:
0x00 c0 9a 00 00 00 00 00的含义分析:
1)最低2B: 00 00为Segment Limit低16位,再加上高4位0000,共20位0,所以段界限为0.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:c0 9a==1100 0000 1001 1010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

1100:G-D-0-AVL
G:1,表示界限粒度为4KB,只对Segment Limit有效,再配合上20位的Segment Limit(为0),故段界限为0B
D:1,(32位代码段)指令使用32位地址及32或8位操作数,段偏移量为32位地址
0:0,保留位总为0
AVL:0,软件可利用位

0000:Limit(4bit)
Limit(4bit): 0000: Segment Limit的高4位。再配合上低16位,共20位0,所以段界限为0。

1001:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=0:系统段描述符和门描述符

1010:TYPE(4bit)
TYPE(4bit):(E-C-R-A)0010
E:1,代码段
C:0,非一致代码段
R:1,可读,可执行
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B,为00

所以:本0x00c09a0000000000:段基址为0X00 00 00 00,段界限为0B,以4KB为单位,该描述符存在于内存,特权级为0,为系统段描述符,描述的为32位代码段,该代码段为非一致代码段,可读,可执行,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x00809a0000000000 /* 0x98 16-bit code */

分析:
0x00 80 9a 00 00 00 00 00的含义分析:
1)最低2B: 00 00为Segment Limit低16位,再加上高4位0000,共20位0,所以段界限为0.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:80 9a==1000 0000 1001 1010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

1000:G-D-0-AVL
G:1,表示界限粒度为4KB,只对Segment Limit有效,再配合上20位的Segment Limit(为0),故段界限为0B
D:0,(16位代码段)指令使用16位地址及16或8位操作数,段偏移量为16位地址
0:0,保留位总为0
AVL:0,软件可利用位

0000:Limit(4bit)
Limit(4bit): 0000: Segment Limit的高4位。再配合上低16位,共20位0,所以段界限为0。

1001:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=0:系统段描述符和门描述符

1010:TYPE(4bit)
TYPE(4bit):(E-C-R-A)0010
E:1,代码段
C:0,非一致代码段
R:1,可读,可执行
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B,为00

所以:本0x00809a0000000000:段基址为0X00 00 00 00,段界限为0B,以4KB为单位,该描述符存在于内存,特权级为0,为系统段描述符,描述的为16位代码段,该代码段为非一致代码段,可读,可执行,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x0080920000000000 /* 0xa0 16-bit data */
.quad 0x0080920000000000 /* 0xa8 16-bit data */
.quad 0x0080920000000000 /* 0xb0 16-bit data */

分析:
0x00 80 92 00 00 00 00 00的含义分析:
1)最低2B: 00 00为Segment Limit低16位,再加上高4位0000,共20位0,所以为0K.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:80 92==1000 0000 1001 0010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

1000:G-D-0-AVL
G:1,表示界限粒度为4KB,只对Segment Limit有效,再配合上20位的Segment Limit(0),故段界限为0B
D:0,(16位数据段)段界限为64KB
0:0,保留位总为0
AVL:0,软件可利用位

0000:Limit(4bit)
Limit(4bit): 1111: Segment Limit的高4位。再配合上低16位,共20位0,所以为0M。

1001:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=1:存储段描述符

0010:TYPE(4bit)
TYPE(4bit):(E-ED-W-A)0010
E:0,数据段
ED:0,向高扩展
W:1,可写
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B

所以:本0x0080920000000000:段基址为0X00 00 00 00,段界限为0B,以4KB为单位,该描述符存在于内存,特权级为0,为存储段描述符,描述的为16位数据段,该数据段为向高扩展,可写,尚未访问。
---------------------------------------------------------------
继续head.S分析:
/*
* The APM segments have byte granularity and their bases
* and limits are set at run time.
*/
.quad 0x00409a0000000000 /* 0xb8 APM CS code */

分析:
0x00 40 9a 00 00 00 00 00的含义分析:
1)最低2B: 00 00为Segment Limit低16位,再加上高4位0000,所以段界限为0K.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:40 9a==0100 0000 1001 1010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

0100:G-D-0-AVL
G:0,表示界限粒度为B,只对Segment Limit有效,再配合上20位的Segment Limit(为0),故段界限为0B
D:1,(32位代码段)指令使用32位地址及32或8位操作数,段偏移量为32位地址
0:0,保留位总为0
AVL:0,软件可利用位

0000:Limit(4bit)
Limit(4bit): 0000: Segment Limit的高4位。再配合上低16位,共20位0,所以段界限为0。

1001:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=1:存储段描述符

1010:TYPE(4bit)
TYPE(4bit):(E-C-R-A)0010
E:1,代码段
C:0,非一致代码段
R:1,可读,可执行
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B,为00

所以:本0x00409a0000000000:段基址为0X00 00 00 00,段界限为0B,以B为单位,该描述符存在于内存,特权级为0,为存储段描述符,描述的为32位代码段,该代码段为非一致代码段,可读,可执行,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x00009a0000000000/* 0xc0 APM CS 16 code (16 bit) */

分析:
0x00 00 9a 00 00 00 00 00的含义分析:
1)最低2B: 00 00为Segment Limit低16位,再加上高4位0000,所以段界限为0K.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:00 9a==0000 0000 1001 1010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

0000:G-D-0-AVL
G:0,表示界限粒度为B,只对Segment Limit有效,再配合上20位的Segment Limit(为0),故段界限为0B
D:0,(16位代码段)指令使用16位地址及16或8位操作数,段偏移量为16位地址
0:0,保留位总为0
AVL:0,软件可利用位

0000:Limit(4bit)
Limit(4bit): 0000: Segment Limit的高4位。再配合上低16位,共20位0,所以段界限为0。

1001:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=1:存储段描述符

1010:TYPE(4bit)
TYPE(4bit):(E-C-R-A)0010
E:1,代码段
C:0,非一致代码段
R:1,可读,可执行
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B,为00

所以:本0x00009a0000000000:段基址为0X00 00 00 00,段界限为0B,以4B为单位,该描述符存在于内存,特权级为0,为存储段描述符,描述的为16位代码段,该代码段为非一致代码段,可读,可执行,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x0040920000000000 /* 0xc8 APM DS data */

分析:
0x00 40 92 00 00 00 00 00的含义分析:
1)最低2B: 00 00为Segment Limit低16位,再加上高4位0000,共20位0,所以为0K.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:40 92==0100 0000 1001 0010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

0100:G-D-0-AVL
G:0,表示界限粒度为B,只对Segment Limit有效,再配合上20位的Segment Limit(0),故段界限为0B
D:1,(32位数据段)段界限为4G
0:0,保留位总为0
AVL:0,软件可利用位

0000:Limit(4bit)
Limit(4bit): 1111: Segment Limit的高4位。再配合上低16位,共20位0,所以为0M。

1001:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=1:存储段描述符

0010:TYPE(4bit)
TYPE(4bit):(E-ED-W-A)0010
E:0,数据段
ED:0,向高扩展
W:1,可写
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B

所以:本0x0040920000000000:段基址为0X00 00 00 00,段界限为0B,以B为单位,该描述符存在于内存,特权级为0,为存储段描述符,描述的为32位数据段,该数据段为向高扩展,可写,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x0000920000000000 /* 0xd0 - ESPFIX 16-bit SS */
分析:
0x00 00 92 00 00 00 00 00的含义分析:
1)最低2B: 00 00为Segment Limit低16位,再加上高4位0000,共20位0,所以为0K.
2)中间3B:00 00 00为Segment Base的低3B:也为0,再加上其最高字节(Segment Base的高8位,共32位)也为0,所以段基地址为0x00 00 00 00
3)第5,6B:为Attributes:00 92==0000 0000 1001 0010
G-D-0-AVL-Limit(4bit)-P-DPL(2bit)-DT-TYPE(4bit)

0000:G-D-0-AVL
G:0,表示界限粒度为B,只对Segment Limit有效,再配合上20位的Segment Limit(0),故段界限为0B
D:0,(16位数据段)段界限为64KB
0:0,保留位总为0
AVL:0,软件可利用位

0000:Limit(4bit)
Limit(4bit): 1111: Segment Limit的高4位。再配合上低16位,共20位0,所以为0M。

1001:P-DPL(2bit)-DT
P:1,存在位,表示描述符对地址转换有效,该描述符存在于内存中。
DPL(2bit):00,0级,描述符特权级,用于特权检查,以决定对该段能否访问
DT:1,说明描述符类型,DT=1:存储段描述符

0010:TYPE(4bit)
TYPE(4bit):(E-ED-W-A)0010
E:0,数据段
ED:0,向高扩展
W:1,可写
A:0,尚未访问

4)最高一个字节00,为Segment Base的最高1B

所以:本0x0000920000000000:段基址为0X00 00 00 00,段界限为0B,以B为单位,该描述符存在于内存,特权级为0,为存储段描述符,描述的为16位数据段,该数据段为向高扩展,可写,尚未访问。
---------------------------------------------------------------
继续head.S分析:
.quad 0x0000000000000000 /* 0xd8 - unused */
.quad 0x0000000000000000 /* 0xe0 - unused */
.quad 0x0000000000000000 /* 0xe8 - unused */
.quad 0x0000000000000000 /* 0xf0 - unused */
.quad 0x0000000000000000 /* 0xf8 - GDT entry 31: double-fault TSS */
分析同前


来自:http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=linuxK&Number=595904&page=14&view=expanded&sb=1&o=all&vc=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值