chapter 1:
内存寻址
逻辑地址: 包含在机器语言指令中用来指定一个操作数或一条指令的地址。
逻辑地址的组成:
(1) 段(段选择符) 16位
(2) 偏移量 :指明了从段开始的地方到实际地址之间的距离。32位
线形地址:
32位无符号整数,表示高达4G的地址。用十六进制表示。
范围:0x00000000-0xffffffff
物理地址:
用于内存芯片级内存单元寻址。由32位或36位无符号整数表示。
内存控制单元(MMU)
逻辑地址通过分段单元硬件电路转换为线形地址。
线形地址通过分页单元硬件电路转换为物理地址。
硬件中的分段:
(1) 段选择符:16位:
0-1:RPL(请求者特权级)
2:Tl (表指示器) 0:GDT 1:LDT
3-15:索引号
(2) 段寄存器:
作用:为了快速方便的找到段选择符。
目的:存放段选择符。
种类:cs,ss,ds,es,fs,gs.
解释:cs:代码段寄存器。指向包含程序指令的段。
ss:栈段寄存器。 指向包含当前程序栈的段。
ds:数据段寄存器。指向包含静态数据或全局数据段。
其他3个段寄存器作一般用途,可以指向任意的数据段。
cs:0代表内核态。3代表用户态。
段描述符:
每个段由8个字节的段描述符表示。描述了段的特征。
位置:在全局描述符表中(GDT),或局部描述符表中。(LDT)
GDT的地址和大小的位置:放在gdtr控制寄存器中。
当前正被使用的局部描述符表(LDT)地址和大小放在ldtr控制寄存器中。
分段单元:
逻辑地址转换为相应的线形地址的操作:
1:先检查段选择符的TI字段。(0:GDT;1:LDT),以决定段描述符保存在哪一个描述符表中。
如果TI为0,也就是在GDT中,分段单元从gdtr寄存器中得到GDT的线形地址。
如果TI为1,也就是在LDT中,分段单元从ldtr寄存器中得到LDT的线形地址。
2:从段选择符的索引号字段计算段描述符的地址,index字段的值*8,+gdtr/ldtr寄存器中的内容
3:2的结果(段描述符BASE字段的值)+逻辑地址的偏移量=线形地址。
LINUX GDT:
在linux内核中的位置:arch/i386/kernel/head.s (linux-2.6.18)第476行
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 */
.quad 0x00cf9a000000ffff /* 0x60 kernel 4GB code at 0x00000000 */
.quad 0x00cf92000000ffff /* 0x68 kernel 4GB data at 0x00000000 */
.quad 0x00cffa000000ffff /* 0x73 user 4GB code at 0x00000000 */
.quad 0x00cff2000000ffff /* 0x7b user 4GB data at 0x00000000 */
.quad 0x0000000000000000 /* 0x80 TSS descriptor */
.quad 0x0000000000000000 /* 0x88 LDT descriptor */
/*
* Segments used for calling PnP BIOS have byte granularity.
* They code segments and data segments have fixed 64k limits,
* the transfer segment sizes are set at run time.
*/
.quad 0x00409a000000ffff /* 0x90 32-bit code */
.quad 0x00009a000000ffff /* 0x98 16-bit code */
.quad 0x000092000000ffff /* 0xa0 16-bit data */
.quad 0x0000920000000000 /* 0xa8 16-bit data */
.quad 0x0000920000000000 /* 0xb0 16-bit data */
/*
* The APM segments have byte granularity and their bases
* are set at run time. All have 64k limits.
*/
.quad 0x00409a000000ffff /* 0xb8 APM CS code */
.quad 0x00009a000000ffff /* 0xc0 APM CS 16 code (16 bit) */
.quad 0x004092000000ffff /* 0xc8 APM DS data */
.quad 0x0000920000000000 /* 0xd0 - ESPFIX 16-bit SS */
.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 */
每个GDT包含18个段描述符和14个空的,未使用,或保留的项。具体请看以上代码!
分享到:
相关推荐
《Linux内核学习笔记》.pdf
学习Linux内核解析,不仅需要理解基本的计算机科学概念,还需要熟悉C语言,因为Linux内核主要是用C语言编写的。此外,理解汇编语言也有助于更深入地了解内核的底层运作。通过深入研究内核,开发者可以优化系统性能,...
在《Linux内核设计与实现》第二版的学习笔记中,我们可以深入探讨以下几个关键知识点: 1. **内核架构**:Linux内核采用微内核架构,主要由进程管理、内存管理、文件系统、设备驱动和网络协议栈等模块组成。这些...
Linux内核是操作系统的核心部分,它负责管理计算机的硬件资源,提供给应用程序接口,并协调系统间的各个组件。内核的存在是为了解决操作系统的核心问题,包括处理硬件的直接交互、调度进程、管理内存、实现文件系统...
总之,Linux内核的学习涵盖了从其历史、构成、代码结构到配置编译等多个方面,理解这些知识点对于系统管理员、开发者以及任何对操作系统原理感兴趣的人来说都是至关重要的。通过深入研究和实践,可以更有效地定制和...
Linux内核机制学习笔记带源码及代码注释.zip Linux内核机制学习笔记带源码及代码注释.zip Linux内核机制学习笔记带源码及代码注释.zip Linux内核机制学习笔记带源码及代码注释.zip Linux内核机制学习笔记带源码及...
简单而又系统的学习笔记,版权归作者所有,我只是做了整理(为CHM格式),便于阅读和传播。
这份“Linux0.11 内核学习笔记”详细解读了这个早期内核的结构、工作原理以及相关的编程技术。下面,我们将深入探讨其中的关键知识点。 一、内核架构 Linux 0.11内核采用单内核设计,所有的系统服务都集中在一个可...
这篇“Linux内核学习笔记(2)——内存寻址”将深入探讨Linux内核如何管理内存以及内存寻址的基本原理。内存寻址是计算机科学中的核心概念,它涉及到计算机如何定位并访问存储在内存中的数据。 在Linux中,内存被...
在深入学习《Linux内核完全注释》的过程中,我们首先会遇到的是计算机内存管理的基础概念,特别是关于地址的理解。在操作系统中,尤其是Linux内核,理解内存地址的逻辑、线性和物理层面至关重要。 1. **逻辑地址...
0.11版本虽然相对于现代的Linux内核来说相当古老,但它包含了操作系统基础功能的雏形,如进程管理、内存管理、文件系统、设备驱动等关键模块,是学习操作系统原理和Linux内核开发的入门起点。 在《Linux内核完全...
Linux内核驱动是操作系统的核心组件,负责管理硬件设备与CPU之间的通信。...对于有兴趣深入研究Linux内核驱动的同学来说,这些笔记能够提供深入学习的基础,并帮助他们更好地理解Linux内核的运作机制。
本读书笔记整理了《深入理解Linux内核》的部分内容,旨在帮助新手理解Linux内核是如何通过硬件支持实现内存寻址和分页的。 首先,Linux的内存寻址使用逻辑地址,由两部分组成:段标识符(Segment Selector)和偏移...
Linux Kernel 学习笔记主要涵盖了操作系统核心的...以上内容构成了Linux内核学习的核心部分,理解和掌握这些知识点是深入Linux系统开发和维护的基础。通过实践和不断学习,可以进一步提升对Linux内核的理解和应用能力。
Linux 学习笔记 - Linux 内核配置 本文将深入探讨 Linux 内核的配置过程,从开机启动过程开始,逐步解析 BIOS、MBR、Boot Loader、内核加载等关键步骤。 第一步 - 加载 BIOS 当计算机打开电源时,BIOS 信息首先被...
在学习笔记中,这部分内容可能会涵盖如何编写和调试驱动,以及理解Linux内核中的设备模型。 文件名“s3c2440中文用户手册(单PDF整合).pdf”可能包含的是Samsung S3C2440处理器的详细技术文档。S3C2440是一款基于ARM...
通过深入学习《Linux内核笔记》,开发者可以更好地理解操作系统底层工作原理,提高系统优化和调试能力,为开发高效、可靠的Linux应用打下坚实基础。同时,参与内核开发也是贡献开源社区、提升技术影响力的重要途径。
Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记...
Linux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序...
这份"Linux内核机制学习笔记带源码及代码注释.7z"压缩包包含了丰富的学习材料,可以帮助我们深入理解Linux内核的工作原理。下面我们将详细探讨其中涉及的一些关键知识点。 1. **内核启动与初始化**: - Linux内核...