x86内存映射

Contents

  • 1 "Low"
    memory (< 1 MiB)

  • 2 "Upper"
    Memory (> 1 MiB)
  • 3 See
    Also
  • 3.1External
    Links

    这篇文章主要内容是计算机启动时,BIOS跳转到你的bootloader代码后的计算机的物理内存。

    1,“低”内存(<1M)

    x86计算机启动的时候进入实时模式,包含一个可用的BIOS。在CPU处于实时模式期间,IRQ0,时钟中断会重复的引发,用于启动的盘比如软盘,硬盘等都会引起中断,这就意味着,在CPU启动的过程,中断向量表(IVT)要被好好保存,因为它一直有用。

    当中断发生时,会跳到中断向量表中调用BIOS的相应程序去处理这个中断。bootloader也可以访问BIOS的程序。这就意味着在bootloader运行期间要好好保存BIOS的两块内存空间,BDA和EBDA。而且每次BIOS发生时钟中断的时候,BIOS会更新BDA的一些数据,不要试图去存储任何数据到BDA。

    在所有的BIOS的功能已经被调用,你的操作系统已经被加载到内存里面,bootloader或者内核可能要永久的退出实时模式了,一般进入32位的保护模式。如果内核不再使用实时模式,开始的0x500字节可以被重复使用,但是常见的回到实时模式操作,就是处理视频显示模式的时候。

    当CPU处于保护模式的时候,系统管理模式在无形之中被激活,不能关闭,系统管理模式会使用EBDA的区域,多以EBDA不能被覆盖。

    注意:EBDA是变量区内存,对于不同的BIOS。如果它存在。它的地址低于0xa000。它保证小于128K个字节。一般是1K个字节。最大的一个事实上才8K。你可以通过BIOS的12H的中断确定EBDA的大小,或者通过测试0x40e。这两个方法都可以获得EBDA的最低的位置。

    你的bootloader的代码最好加载到0x7c00-0x7dff这512b中。这段区域不可以被占用,知道执行进入了bootloader的第二阶段或者进入了你的内核。

    Overview

    start end size type description
    Low Memory (the first MiB)
    0x00000000 0x000003FF 1 KiB RAM - partially unusable (see above) Real Mode IVT (Interrupt Vector Table)
    0x00000400 0x000004FF 256 bytes RAM - partially unusable (see above) BDA (BIOS data area)
    0x00000500 0x00007BFF almost 30 KiB RAM (guaranteed free for use) Conventional memory
    0x00007C00 (typical location) 0x00007DFF 512 bytes RAM - partially unusable (see above) Your OS BootSector
    0x00007E00 0x0007FFFF 480.5 KiB RAM (guaranteed free for use) Conventional memory
    0x00080000 0x0009FBFF approximately 120 KiB, depending on EBDA size RAM (free for use, if it exists) Conventional memory
    0x0009FC00 (typical location) 0x0009FFFF 1 KiB RAM (unusable) EBDA (Extended BIOS Data Area)
    0x000A0000 0x000FFFFF 384 KiB various (unusable) Video memory, ROM Area

    BIOS Data Area (BDA)

    The BDA is only partially standardized, and almost all the values stored there are completely obsolete and uninteresting. The following is a partial list. See the External Links references below for more detail.

    address (size) description
    0x0400 (4 words) IO ports for COM1-COM4 serial (each address is 1 word, zero if none)
    0x0408 (3 words) IO ports for LPT1-LPT3 parallel (each address is 1 word, zero if none)
    0x040E (word) EBDA base address >> 4 (usually!)
    0x0410 (word) packed bit flags for detected hardware
    0x0417 (word) keyboard state flags
    0x041E (32 bytes) keyboard buffer
    0x0449 (byte) Display Mode
    0x044A (word) number of columns in text mode
    0x0463 (2 bytes, taken as a word) base IO port for video
    0x046C (word) # of IRQ0 timer ticks since boot
    0x0475 (byte) # of hard disk drives detected
    0x0480 (word) keyboard buffer start
    0x0482 (word) keyboard buffer end
    0x0497 (byte) last keyboard LED/Shift key state

    Extended BIOS Data Area (EBDA)

    You may see "maps" of the EBDA if you search the web. However, those maps are for the original IBM BIOS EBDA. They do not apply to any current EBDA, used by any current BIOS. The EBDA area is not standardized. It does contain
    data that your OS will need, but you must do a bytewise pattern search to find those tables. (See Plug-and-Play.)

    ROM Area

    start end size region/exception description
    Standard usage of the ROM Area
    0x000A0000 0x000BFFFF 128 KiB video RAM VGA display memory
    0x000C0000 0x000C7FFF 32 KiB (typically) ROM Video BIOS
    0x000C8000 0x000EFFFF 160 KiB (typically) ROMs and unusable space Mapped hardware & Misc.
    0x000F0000 0x000FFFFF 64 KiB ROM Motherboard BIOS

    2,“高内存”(>1M)

    >1M的内存区域并没有规范的,很好的定义,或者说不连续。区域包括内存映射硬件,设备驱动可以访问的; ACPI表,初始化代码很可能会读取的,然后可以被重新利用;32位计算机的硬件可以被扩展为4G。使用BIOS的中断INT
    15h, EAX=0xE820
    可以获得可靠的高内存映射表。

    start end size region/exception description
    High Memory
    0x00100000 0x00EFFFFF 0x00E00000 (14 MiB) RAM -- free for use (if it exists) Extended memory 1, 2
    0x00F00000 0x00FFFFFF 0x00100000 (1 MiB) Possible memory mapped hardware ISA Memory Hole 15-16MB 3
    0x01000000  ????????  ???????? (whatever exists) RAM -- free for use More Extended memory 1
    0xC0000000 (sometimes, depends on motherboard and devices) 0xFFFFFFFF 0x40000000 (1 GiB) various (typically reserved for memory mapped devices) Memory mapped PCI devices, PnP NVRAM?, IO APIC/s, local APIC/s, BIOS, ...
    0x0000000100000000 (possible memory above 4 GiB)  ????????????????  ???????????????? (whatever exists) RAM -- free for use (PAE/64bit) More Extended memory 1
     ????????????????  ????????????????  ???????????????? Possible memory mapped hardware Potentially usable for memory mapped PCI devices in modern hardware (but typically not, due to backward compatibility)

    1: Different computers have different amounts of RAM, therefore the amount of extended memory you might find will vary and may be anything from "none" (e.g. an old 80386 system) to "lots".

    2: Free for use except that your bootloader (ie. GRUB) may have loaded your "modules" here, and you don‘t want to overwrite those.可以随意使用包括了,你的bootloader如GRUB,很可能调入你的模块在这里,所以你不想覆盖它,

    3: The "ISA Memory Hole" (from 0x00F00000 to 0x00FFFFFF) was used for memory mapped ISA devices (e.g. video cards). Modern computers have no need for this hole, but some chipsets still support it (as an optional feature)
    and some motherboards may still allow it to be enabled with BIOS options, so it may exist in a modern computers with no ISA devices.

时间: 2024-11-08 23:49:43

x86内存映射的相关文章

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动)

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动) 2015-02-22 李海沿 刚刚我们实现了linux系统内存的分配,读写,释放功能,下面,我们一鼓作气将IO端口映射及IO内存映射搞定,加油! (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存.BIOS等).在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址

内存映射

http://www.cnblogs.com/mahaikai/p/6025512.html 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Executables标志也可为1:3).这并不意味着内核使用那么多物理内存,仅表示它可

内存映射与访问机制

通过参考内存布局及访问机制的相关文章,本文试着整合一下相关知识点,希望能对有需要的朋友提供一点参考.但由于所参考文章皆为网友所作,相关知识并没有形成系统的认识,所以有些知识点仍然不够清楚,也难免有谬误之处.如果大家发现错误,敬请指出,另外倘若有关于“系统启动及内存布局”方面的可靠的资料或书籍,恳请大神留言告知. 参考文章(只列出几个重要的):http://www.cnblogs.com/clover-toeic/p/3754433.html http://blog.chinaunix.net/u

高端内存映射之kmap持久内核映射--Linux内存管理(二十)

1 高端内存与内核映射 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途. 重要的是强调以下事实 : 内核提供了其他函数用于将ZONE_HIGHMEM页帧显式映射到内核空间, 这些函数与vmalloc机制无关. 因此, 这就造成了混乱. 而在高端内存的页不能永久地映射到内核地址空间. 因此, 通过alloc_pages()函数以__GFP_HIGHMEM标志获得的内存页就不可能有逻辑地址. 在x86_32体系结构总,

JAVA NIO 内存映射(转载)

原文地址:http://blog.csdn.net/fcbayernmunchen/article/details/8635427 Java类库中的NIO包相对于IO 包来说有一个新功能是内存映射文件,日常编程中并不是经常用到,但是在处理大文件时是比较理想的提高效率的手段.本文我主要想结合操作系统中(OS)相关方面的知识介绍一下原理. 在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数 read().write() ,此时调用此函数的进程(在JAVA中即java进程)由当

Java利用内存映射文件实现按行读取文件

我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好更快的实现方式麻烦也提供一下代码. 代码如下: public class testMemoryMappedFile { public static void main(String[] agrs) throws IOException{ RandomAccessFile memoryMappedFi

内存映射文件

一段内存地址空间,映射着物理存储器上一个已经存在于磁盘上的文件.在对该文件进行操作之前必须首先对文件进行映射.使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作. 内存映射文件,是由一个文件到一块内存的映射.Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping). API: HANDLE CreateFileMapping(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttribute

【转】C#大文件读取和查询--内存映射

笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该不难.研究一天之后,发现这个需要使用内存映射技术. 查阅了相关资料之后 https://msdn.microsoft.com/zh-cn/library/dd997372(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1 发现还是

Linux下C编程-----IO/文件操作/内存映射 实现简单记录存储(3)

利用linux下的文件内存映射可以实现进程共享数据,我们可以把一个文件映射到虚拟内存中使多个进程进行共享, 到这里我们大概能想到他能应用到的领域 是很广泛的 主要涉及到 mmap  munmap   msync 三个函数的应用 下面贴代码 下面一段代码是为文件建立一个简单的记录存储,并且通过内存映射修改文件内容 /************************************************************************* > File Name: memdb