16位用于选择器(其行为与段选择器相同),然后另外64位用于TSS的基本地址。 GDTR(48bit) 全局描述符表寄存器,CPU现在使用的是分页的内存管理方式,分段的信息存储在GDTR上。在64位的长模式中CS、DS的偏移为0,边界为0xffff。长度这就存储在一个叫全局描述符表(GDT)的表格中,并用gdtr寄存器指向这个表。这个表中的...
当低特权段使用call gate调用高特权段的时候,会发生特权等级切换为更高,然后会导致发生切栈,处理器会自动的进行以下几步:首先,检查被调用段DPL,然后从任务的TSS里,把DPL对应的堆栈段选择子和栈顶指针独出,其次暂存当前的SS和ESP,然后把当读出来的DPL对应的选择子和栈顶指针载入到SS/ESP中,这样就建立了一个新...
1.关中断,首先利用CPUID检查CPU是否支持长模式,如果不支持则打印信息,然后停机(halt)。 2.打开A20线,载入32位保护模式下用的GDT和IDT,其中64位模式下的相关数据结构也包含在了此GDT下,包括64位下的0级代码段描述符,0级数据段描述符,3级代码段和数据段描述符,TSS64描述符;32位的IDT里面的中断处理程序什么也...
定义了描述任务的数据结构TSS,里面存储了一个任务的上下文(一系列寄存器的值),下图是一个32位CPU的TSS结构图: x86CPU的构想是每一个任务对应一个TSS,然后由TR寄存器指向当前的任务,执行任务切换时,修改TR寄存器的指向即可,这是硬件层面的多任务切换机制。 这个构想其实还是很不错的,然而现实却打了脸,包括Linux和Wi...
全部system descriptor(包含:LDT/TSS descriptor 和 call gate descriptor)都扩展为 64 位的 descriptor 注意:这些 system GDT entries 是 16 bytes 128 位的大小,这里所说的 64 位的descriptor 是指 descriptor 的类型是 64 位,它的大小实际上 16 bytes,上文已经提过在 long mode 下“跨 descriptor 边界”问...
中断到来时,借助 TSS,我们可以直接进入核心栈。但 syscall 和 sysret 并不会帮我们做栈的切换工作。 此时,我们遇到一个问题:当前所在的栈是用户栈,当前已经没有任何可以直接使用的寄存器了(它们不是存储了关键数据,就是要求被调方保存后才可用)。在作者的实验系统中,直接将寄存器存放到用户栈是很危险的,如果恰好...
(cpu_tss_rw + TSS_sp2)/* pt_regs->sp */pushq %r11/* pt_regs->flags */pushq $__USER_CS/* pt_regs->cs */pushq %rcx/* pt_regs->ip */SYM_INNER_LABEL(entry_SYSCALL_64_after_hwframe, SYM_L_GLOBAL)pushq %rax/* pt_regs->orig_ax *//* 保存剩余寄存器 */PUSH_AND_CLEAR_...
这些机制包括段式地址变化机制(FS和GS仍然被保留),任务转移门(TSS)机制,以及虚拟86模式。当然,出于向下兼容的考虑,x86-64在"传统模式"(Legacy mode)下,仍然对这些机制进行了保留。 编辑本段 3.虚拟地址 虽然逻辑地址扩展到了64位,但是,现有的设计并没有完全用到这64位的空间(2^64=16EB),因为使用到如此大的...
在新架构的“长模式(long mode)”下,很多在IA32中被提出,但确不经常被操作系统用到的一些机制不再被支持。这些机制包括段式地址变化机制(FS和GS仍然被保留),任务 转移门(TSS)机制,以及虚拟86模式。当然,出于向下兼容的考虑,x86-64在“传统模式”(Legacy mode)下,仍然对这些机制进行了保留。
@昌维的高赞答。x86的兼容性负担是很重没错,但这并非ARM省电的原因。如果生产工艺相同,频率相同的两...