Selector Descriptor

操作系统进行段式寻址时,将seg:offset形式的逻辑地址转换成线性地址。
例如

jmp dword SelectorCode32:0 

SelectorCode32是段选择子,它指向GDT/LDT表中的一个表项,GDT/LDT中的每个表项中有所指向的代码或数据的段地址

[SECTION .gdt]
;GDT FOUND
;

LABEL_GDT: Descriptor 0,0,0;
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len -1, DA_C + DA_32;
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW;

GdtLen equ $-LABEL_GDT ; length of GDT
GdtPtr dw GdtLen-1
dd 0

;GDT selector
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT

;end of [SECTION . gdt]

%macro Descriptor 3
dw %2 & 0FFFFh
dw %1 & 0FFFFh
db (%1 >> 16) & 0FFH
dw ((%2 >> 8) & 0F00H) | (%3 & 0F0FFh)
db (%1 >> 24) & 0FFH
%endmacro

在上面的代码中,初始化了GDT表和选择子。选择子的值是表项的偏移量。GDT中的表项指向一个数据结构,其中包含有段基址,段界限和其他的属性。

时间: 2024-10-11 13:35:01

Selector Descriptor的相关文章

[转载]使用 int n 调用系统例程

IDT(Interrupt Descriptor Table)仅能存放 interrupt-gate.trap-gate 和 task-gate. 指令: int 0x80 ----------------------------------- 0x80 是 vector (中断向量号) 在 x86 下,gate-descriptor 是 8 个字节,所以:gate = IDTR.base + vector * 8,在 long mode 下,gate-descrptor 是 16 字节,所以:

[转载]使用 call/jmp 直接调用/跳转目标 code segment

直接调用/跳转的形式是: call / jmp selector:offset 这里的 selector 是 code segment selector 直接使用 selector 来索引 code segment,这将引发 CS 的改变,code segment descriptor 最终会被加载到 CS 寄存器里. 在 code segment descriptor 加载到 CS 之前,processor 会进行一系列的检查,包括权限检查.type 检查.limit 检查等,在通过检查后,p

[转载]x86 的 TSS 任务切换机制

segment descriptors 构建保护模式下的最基本.最根本的执行环境.system descriptors 则构建保护模式下的核心组件: 1.TSS descriptor 提供硬件级的进程切换机制 2.LDT descriptor 供进程使用多个 descriptor 3.Gate descriptor 提供 processor 权限级别的切换机制. 5.7.1. TSS 提供的进程切换机制 TSS 是一段内存区域,存放进程相关的执行环境信息.初始化的 TSS 是由用户提供,进程切换

IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表

原文:  IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表 IDT,Interrupt Descriptor Table,中断描述符表是CPU用来处理中断和程序异常的. 一.有关IDT的基本知识 1.中断时一种机制,用来处理硬件需要向CPU输入信息的情况. 比如鼠标,键盘等. 2.中断和异常的产生是随机的,在CPU正常运行过程中随时可能产生.CPU的中断处理机制 3.中断可以由硬件产生(称为外部中断),也可以由软件产生(称为内部中断),在程序中写入

[转载]long mode 模式下 system/gate descriptor 的疑惑

1. 32 位的 system descriptor 与 64 位的 system descriptor (1)compatibility 模式下,LDT / TSS descriptor 还是原来的 32 位的 descriptor,与原来 x86 的 LDT / TSS 意义一致. (2)64 bit 模式下,LDT / TSS descriptor 扩展为 64 位的 descriptor. descriptor 的 type 被相应改烃.由原来的 32 bit-LDT 改为 64 bit

[转载]使用 TSS selector 进行任务切换

指令: call 0x20:00000000 jmp 0x20:00000000 ----------------------------------- selector 0x20 是个 TSS descriptor 的 selector. TSS descriptor 与 segment descriptor 的格式一致,不同的是 type,在 x86 和 long mode 的 compatibility 模式下有: available/busy 16-TSS 和 available/bus

Java NIO——Selector机制源码分析---转

一直不明白pipe是如何唤醒selector的,所以又去看了jdk的源码(openjdk下载),整理了如下: 以Java nio自带demo : OperationServer.java   OperationClient.java(见附件) 其中server端的核心代码: public void initSelector() { try { selector = SelectorProvider.provider().openSelector(); this.serverChannel1 =

[转载]LDT descriptor

显然,GDT(global descriptor table)是系统与所有进程共用的.相对于 LDT(local descriptor table)则是进程独享的.GPRs.selector registers.stack pointers.eflags.LDT descriptor.CR3 构成了一个进程的执行环境. TSS segment 包含了上述几个环境资源.LDT 是进程独享的一个资源,是基于进程生命周期内该 LDT 进程外不可见的.每个进程有自己的 LDT (前提是系统使用了 LDT

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ 浅谈 Linux