当前位置: 首页 > article >正文

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-2

文件下载与邀请翻译者

学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。

讲解下载英特尔开发手册的文章

翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么,欢迎你的加入。

另外,我不仅仅是打算翻译这一种手册,以后,可能还需要去翻译许多的英文技术文档,以支持系统底层的教学,培养系统底层程序员。

我有钱了以后,应该是会出私钱来请人翻译一批英文技术文档。当前,暂时没钱,若是有志愿加入的,欢迎啊。

本节翻译

【原文】2.1.1. Global and Local Descriptor Tables
When operating in protected mode, all memory accesses pass through either the global descriptor table (GDT) or the (optional) local descriptor table (LDT), shown in Figure 2-1. These tables contain entries called segment descriptors. A segment descriptor provides the base address of a segment and access rights, type, and usage information. Each segment descriptor has a segment selector associated with it. The segment selector provides an index into the GDT or LDT (to its associated segment descriptor), a global/local flag (that determines whether the segment selector points to the GDT or the LDT), and access rights information. 
To access a byte in a segment, both a segment selector and an offset must be supplied. The segment selector provides access to the segment descriptor for the segment (in the GDT or LDT). From the segment descriptor, the processor obtains the base address of the segment in the linear address space. The offset then provides the location of the byte relative to the base address. This mechanism can be used to access any valid code, data, or stack segment in the GDT or LDT, provided the segment is accessible from the current privilege level (CPL) at which the processor is operating. (The CPL is defined as the protection level of the currently executing code segment.)

【翻译】2.1.1. 全局和局部描述符表
在保护模式运行时,所有内存访问通过全局描述符表(GDT)或(可选)局部描述符表(LDT),如图2 - 1所示。这些表包含称为段描述符的条目。段描述符提供段的基址和访问权限、类型和使用信息。每个段描述符都有一个与之关联的段选择器。段选择器提供GDT或LDT的索引(指向其关联的段描述符)、一个全局/本地标志(决定段选择器是指向GDT还是指向LDT)和访问权限信息。
要访问段中的字节,必须同时提供段选择器和偏移量。段选择器提供对段描述符的访问(在GDT或LDT中)。从段描述符中,处理器在线性地址空间中获得段的基址。然后,偏移量提供了相对于基址的字节偏移位置。此机制可用于访问GDT或LDT中的任何有效代码、数据或堆栈段,前提是可以从处理器运行的当前特权级别(CPL)访问该段。(CPL被定义为当前执行的代码段的保护级别。)

【讲评】上述内容,谈到了段选择器与偏移量的问题。在16位的8086汇编里面,我们给定段地址和偏移地址,则我们要访问的内存位置,便是【(段地址 << 4) + (16位偏移地址)】。而在32位保护模式里面,也是用【段寄存器:偏移地址】的方式来定位某一个内存地址的。只不过,在32位保护里面,段寄存器里面的值,不再叫做段地址,而是叫做段选择器。段选择器里面,包含着索引值,也包含着指示GDT还是LDT的标志位。假定,根据段选择器的内容,它指示,要从GDT中来检测某一个段描述符,且索引为3。假定,GDT中的3号描述符指示,段的基地址为0x3000_0000。再来假定,我们给偏移地址设定的值为0xA000,那么,最终,我们要访问的地址,便是0x3000_A000。

我这里,给出来了一点关于保护模式下之下,分段寻址的示例。然而,我不确定你能看懂。

为了更好地理解保护模式的知识,我还是建议去学习专门的教材。比如,李忠的《X86汇编语言,从实模式到保护模式》,赵炯先生的《Linux内核完全剖析,基于0.12内核》,郑刚先生的《操作系统真象还原》。

有的东西,看教材会好一些,有的东西,看手册会获得更为详细,专业与权威的知识。偏听偏信哪个都不好。

在计算机领域,一般地,老外的教材会比国内的教材写得更好。然而,并不排除说,在局部的地方,老外的东西写得不好,而国人的教材却用比较简单的方式,把知识给讲明白了。

对于保护模式的知识,我还是推荐你,有空的话,去买教材来看。另外,李忠先生的《X86汇编语言 ,从实模式到保护模式》也有对应的视频教程。有空的话,你可以自己去搜,你也可以问我。

保护模式的知识,这算是英特尔开发手册第3卷的一个重要的内容。我本人便是在学习了保护模式以后,并且沉淀了一段时间以后,才来尝试着学习与翻译英特尔开发手册的。

有兴趣学习保护模式,有兴趣一起来学习Linux内核的话,你可以联系我。虽然目前,我的Linux内核的水平,也谈不上多高,但是,我们还是可以一起学习的。另外,如果你在Linux内核方面,还完全是菜鸟的水平,或许我还可以帮你一点忙。我写作这一段文字的时间,为2024年10月22日。

本节,我又将图2-1的内容贴了一遍。对于这个图,需要你自己将其下载下来,放大以后来查看。如果还是看不清楚,那么,我建议你将原版的英特尔开发手册第3卷的PDF文件给下载下来,然后呢,在原版的文件中,放大图片,来查看细节。

【原文】In Figure 2-1 the solid arrows indicate a linear address, the dashed lines indicate a Segment selector, and the dotted arrows indicate a physical address. For simplicity, many of the Segment selectors are shown as direct pointers to a segment. However, the actual path from a Segment selector to its associated segment is always through the GDT or LDT.
The linear address of the base of the GDT is contained in the GDT register (GDTR); the linear address of the LDT is contained in the LDT register (LDTR).

【翻译】在图2-1中,实线表示线性地址,虚线(dashed)表示段选择器,虚线(dotted)表示物理地址。为简单起见,许多段选择器显示为指向段的直接指针。然而,从段选择器到其关联段的实际路径总是通过GDT或LDT。
GDT基址的线性地址包含在GDT寄存器(GDTR)中;LDT的线性地址包含在LDT寄存器(LDTR)中。

【讲评】dashed line和dotted line都表示虚线。实际上,这是两种不同的线。文档中,无论是我这里的翻译文档,还是原版的英特尔开发手册,它给出的图2-1里面的内容,都区分不出【dashed line】与【dotted line】的区别。尽管在图例中,可以看出一点两者的区别。然而,在实际的图示里,依然是看不出二者的区别

关于【dashed line】与【dotted line】,还是微软的Windows API教材与MFC教材给出的区分是较为明确的。我将这几种线条的截图贴在下面,大家可以体会一下。

几种线条的形状

在上图里面,一画两点的这个线条,大家还需要放大以后,再去看。

结束语

关于保护模式的知识,还需要大家找专门的教材来学习。我这里比较推荐的,是李忠先生的《X86汇编语言,从实模式到保护模式》和赵炯先生的《Linux内核完全剖析(基于0.12内核)》。

另外,在学习这种系统级知识的时候,我建议大家,对于微软的Windows系统,与基于Linux内核的 Linux 发行版操作系统,都能够给予尊重。


http://www.kler.cn/news/360919.html

相关文章:

  • Kadane 算法
  • 【含开题报告+文档+PPT+源码】基于springboot的旅游路线推荐系统的设计与实现
  • 开发自定义大模型
  • 力扣 56.合并区间——Java
  • 让你的 IDEA 使用更流畅 | IDEA内存修改
  • 【GIT】.cr、.gitattributes 、 .gitignore和.git各文件夹讲解介绍
  • 使用milvus数据库实现文本相似比较
  • 打造高性能在线电子表格:WebGL 渲染引擎 Kola2d 自研之路
  • Linux·文件与IO
  • 【Vue】Vue(八)Vue3.0 使用ref 和 reactive创建响应式数据
  • 【linux】线程 (三)
  • Linux系统基础-进程间通信(3)_模拟实现匿名管道
  • 曝iPhone 18 Pro Max首发2nm芯片:内存升级12GB
  • leetcode 刷题day44动态规划Part13( 647. 回文子串、516.最长回文子序列)
  • Kubescape 扫描和修复容器镜像漏洞
  • win10系统.net framework 3.5sp1组件怎么开启?
  • 自动化数据处理:使用Selenium与Excel打造的数据爬取管道
  • 【操作系统使用】Linux 命令行基础:文件、目录、磁盘操作及其他常用命令
  • Vision China 2024 | 移远通信以一体化的AI训练及部署能力,引领3C电子制造智能升级
  • usb 接口 线序