寻址空间一般指的是CPU对于内存寻址的能力。通俗地说,就是能最多用到多少内存的一个问题。数据在存储器(RAM)中存放是有规律的 ,CPU在运算的时候需要把数据提取出来就需要知道数据存放在哪里 ,这时候就需要挨家挨户的找,这就叫做寻址,但如果地址太多超出了CPU的能力范围,CPU就无法找到数据了。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。
寻址空间一般指的是CPU对于内存寻址的能力。通俗地说,就是能最多用到多少内存的一个问题。数据在存储器(RAM)中存放是有规律的 ,CPU在运算的时候需要把数据提取出来就需要知道数据存放在哪里 ,这时候就需要挨家挨户的找,这就叫做寻址,但如果地址太多超出了CPU的能力范围,CPU就无法找到数据了。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。
I/O端口和寻址
CPU为了访问I/O接口控制器或控制卡上的数据和状态信息,需要首先指定它们的地址。这种地址就称为I/O端口地址或者简称端口。通常,一个I/O控制器包含访问数据的数据端口、输出命令的命令端口和访问控制器执行状态的状态端口。端口地址的设置方法一般有两种:统一编址和独立编址。
端口统一编址的原理是把I/O控制器中的端口地址归入存储器寻址地址空间范围内。因此这种编址方式也称为存储器映像编址。CPU访问一个端口的操作与访问内存的操作一样,也使用访问内存的指令。端口独立编址的方法是把I/O控制器和控制卡的寻址空间单独作为一个独立的地址空间对待,称为I/O地址空间。每个端口有一个I/O地址与之对应,并且使用专门的I/O指令来访问端口。
IBM PC及其兼容机主要使用独立编址方式,采用了一个独立的I/O地址空间对控制设备中的寄存器进行寻址和访问。使用ISA总线结构的传统PC,其I/O地址空间范围是0x000~0x3FF,有1024个I/O端口地址可供使用。各个控制器和控制卡所默认分配使用的端口地址范围见表2-1。关于这些端口的使用和编程方法将在后面具体涉及相关硬件时再详细进行说明。
另外,IBM PC也部分地使用了统一编址方式。例如,CGA显示卡上显示内存的地址就直接占用了存储器地址空间0xB800~0xBC00范围。因此若要让一个字符显示在屏幕上,可以直接使用内存操作指令往这个内存区域执行写操作。
端口地址范围 | 分配说明 | 端口地址范围 | 分配说明 |
0x000~0x01F | 8237A DMA控制器1 | 0x1F0~0x1F7 | IDE硬盘控制器0 |
0x020~0x03F | 8259A 可编程中断控制器1 | 0x278~0x27F | 并行打印机端口2 |
0x040~0x05F | 8253/8254A 定时计数器 | 0x2F8~0x2FF | 串行控制器2 |
0x060~0x06F | 8042 键盘控制器 | 0x378~0x37F | 并行打印机端口1 |
0x070~0x07F | 访问CMOS RAM/实时时钟RTC(Real Time Clock)端口 | 0x3B0~0x3BF | 单色MDA显示控制器 |
0x080~0x09F | DMA页面寄存器访问端口 | 0x3C0~0x3CF | 彩色CGA显示控制器 |
0x0A0~0x0BF | 8259A 可编程中断控制器2 | 0x3D0~0x3DF | 彩色EGA/VGA显示控制器 |
0x0C0~0x0DF | 8237A DMA控制器2 | 0x3F0~0x3F7 | 软盘控制器 |
0x0F0~0x0FF | 协处理器访问端口 | 0x3F8~0x3FF | 串行控制器1 |
0x170~0x177 | IDE硬盘控制器1 |
对于使用EISA或PCI等总线结构的现代PC,有64KB的I/O地址空间可供使用。在普通Linux系统下通过查看/proc/ioports文件可以得到相关控制器或设置使用的I/O地址范围:
# cat /proc/ioports 0000-001f : dma1 0020-003f : pic1 0040-005f : timer 0060-006f : keyboard 0070-007f : rtc 0080-008f : dma page reg 00a0-00bf : pic2 00c0-00df : dma2 00f0-00ff : fpu 0170-0177 : ide1 01f0-01f7 : ide0 02f8-02ff : serial(auto) 0376-0376 : ide1 03c0-03df : vga+ 03f6-03f6 : ide0 03f8-03ff : serial(auto) 0500-051f : PCI device 8086:24d3 (Intel Corp.) 0cf8-0cff : PCI conf1 da00-daff : VIA Technologies, Inc. VT6102 da00-daff : via-rhine e000-e01f : PCI device 8086:24d4 (Intel Corp.) e000-e01f : usb-uhci e100-e11f : PCI device 8086:24d7 (Intel Corp.) e100-e11f : usb-uhci e200-e21f : PCI device 8086:24de (Intel Corp.) e200-e21f : usb-uhci e300-e31f : PCI device 8086:24d2 (Intel Corp.) e300-e31f : usb-uhci f000-f00f : PCI device 8086:24db (Intel Corp.) f000-f007 : ide0 f008-f00f : ide1 # |