`
skyxiaobai
  • 浏览: 12077 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux内核学习笔记(1)

阅读更多

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个空的,未使用,或保留的项。具体请看以上代码!

 

1
1
分享到:
评论

相关推荐

    《Linux内核学习笔记》.pdf

    《Linux内核学习笔记》.pdf

    linux内核解析笔记

    学习Linux内核解析,不仅需要理解基本的计算机科学概念,还需要熟悉C语言,因为Linux内核主要是用C语言编写的。此外,理解汇编语言也有助于更深入地了解内核的底层运作。通过深入研究内核,开发者可以优化系统性能,...

    linux内核设计与实现第二版 学习笔记

    在《Linux内核设计与实现》第二版的学习笔记中,我们可以深入探讨以下几个关键知识点: 1. **内核架构**:Linux内核采用微内核架构,主要由进程管理、内存管理、文件系统、设备驱动和网络协议栈等模块组成。这些...

    linux 内核学习笔记

    Linux内核是操作系统的核心部分,它负责管理计算机的硬件资源,提供给应用程序接口,并协调系统间的各个组件。内核的存在是为了解决操作系统的核心问题,包括处理硬件的直接交互、调度进程、管理内存、实现文件系统...

    Linux内核学习笔记

    总之,Linux内核的学习涵盖了从其历史、构成、代码结构到配置编译等多个方面,理解这些知识点对于系统管理员、开发者以及任何对操作系统原理感兴趣的人来说都是至关重要的。通过深入研究和实践,可以更有效地定制和...

    Linux内核机制学习笔记带源码及代码注释.zip

    Linux内核机制学习笔记带源码及代码注释.zip Linux内核机制学习笔记带源码及代码注释.zip Linux内核机制学习笔记带源码及代码注释.zip Linux内核机制学习笔记带源码及代码注释.zip Linux内核机制学习笔记带源码及...

    Linux 内核学习笔记

    简单而又系统的学习笔记,版权归作者所有,我只是做了整理(为CHM格式),便于阅读和传播。

    linux0.11 内核学习笔记

    这份“Linux0.11 内核学习笔记”详细解读了这个早期内核的结构、工作原理以及相关的编程技术。下面,我们将深入探讨其中的关键知识点。 一、内核架构 Linux 0.11内核采用单内核设计,所有的系统服务都集中在一个可...

    linux内核学习笔记(2)——内存寻址

    这篇“Linux内核学习笔记(2)——内存寻址”将深入探讨Linux内核如何管理内存以及内存寻址的基本原理。内存寻址是计算机科学中的核心概念,它涉及到计算机如何定位并访问存储在内存中的数据。 在Linux中,内存被...

    《Linux内核完全注释》学习笔记

    在深入学习《Linux内核完全注释》的过程中,我们首先会遇到的是计算机内存管理的基础概念,特别是关于地址的理解。在操作系统中,尤其是Linux内核,理解内存地址的逻辑、线性和物理层面至关重要。 1. **逻辑地址...

    Linux 内核完全注释0.11内核(修正版V3.0).pdf.7z

    0.11版本虽然相对于现代的Linux内核来说相当古老,但它包含了操作系统基础功能的雏形,如进程管理、内存管理、文件系统、设备驱动等关键模块,是学习操作系统原理和Linux内核开发的入门起点。 在《Linux内核完全...

    Linux内核驱动笔记

    Linux内核驱动是操作系统的核心组件,负责管理硬件设备与CPU之间的通信。...对于有兴趣深入研究Linux内核驱动的同学来说,这些笔记能够提供深入学习的基础,并帮助他们更好地理解Linux内核的运作机制。

    深入理解Linux内核笔记

    本读书笔记整理了《深入理解Linux内核》的部分内容,旨在帮助新手理解Linux内核是如何通过硬件支持实现内存寻址和分页的。 首先,Linux的内存寻址使用逻辑地址,由两部分组成:段标识符(Segment Selector)和偏移...

    Linux Kernel学习笔记

    Linux Kernel 学习笔记主要涵盖了操作系统核心的...以上内容构成了Linux内核学习的核心部分,理解和掌握这些知识点是深入Linux系统开发和维护的基础。通过实践和不断学习,可以进一步提升对Linux内核的理解和应用能力。

    linux学习笔记。Linux内核:配置内核

    Linux 学习笔记 - Linux 内核配置 本文将深入探讨 Linux 内核的配置过程,从开机启动过程开始,逐步解析 BIOS、MBR、Boot Loader、内核加载等关键步骤。 第一步 - 加载 BIOS 当计算机打开电源时,BIOS 信息首先被...

    linux课堂学习笔记

    在学习笔记中,这部分内容可能会涵盖如何编写和调试驱动,以及理解Linux内核中的设备模型。 文件名“s3c2440中文用户手册(单PDF整合).pdf”可能包含的是Samsung S3C2440处理器的详细技术文档。S3C2440是一款基于ARM...

    Linux内核笔记

    通过深入学习《Linux内核笔记》,开发者可以更好地理解操作系统底层工作原理,提高系统优化和调试能力,为开发高效、可靠的Linux应用打下坚实基础。同时,参与内核开发也是贡献开源社区、提升技术影响力的重要途径。

    Linux内核与设备驱动程序学习笔记及源码.zip

    Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记及源码.zip Linux内核与设备驱动程序学习笔记...

    Linux内核与设备驱动程序学习资料笔记+源码.zip

    Linux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序学习资料笔记+源码.zipLinux内核与设备驱动程序...

    Linux内核机制学习笔记带源码及代码注释.7z

    这份"Linux内核机制学习笔记带源码及代码注释.7z"压缩包包含了丰富的学习材料,可以帮助我们深入理解Linux内核的工作原理。下面我们将详细探讨其中涉及的一些关键知识点。 1. **内核启动与初始化**: - Linux内核...

Global site tag (gtag.js) - Google Analytics