原文地址https://blog.youkuaiyun.com/nkuzbp/article/details/7421904
PC的I O端口地址表 (I/O端口地址表)
http://tieba.baidu.com/f?kz=16042340
I/O端口地址表
PC只用了10位地址线(A0-A9)进行译码,其寻址的范围为0H-3FFH,共有1024个I/O地址。
这1024个地址中前半段(A9=0,范围为0H-1FFH)是属于主机板I/O译码, 后半段(A9=1,范围为200H-3FFH)则是用来扩展插槽上的I/O译码用。
I/O端口功能表
I/O地址 | 功能、用途 |
---|---|
0 | DMA通道0,内存地址寄存器(DMA控制器1(8237)) |
1 | DMA通道0, 传输计数寄存器 |
2 | DMA通道1,内存地址寄存器 |
3 | DMA通道1, 传输计数寄存器 |
4 | DMA通道2,内存地址寄存器 |
5 | DMA通道2, 传输计数寄存器 |
6 | DMA通道3,内存地址寄存器 |
7 | DMA通道3, 传输计数寄存器 |
8 | DMA通道0-3的状态寄存器 |
0AH | DMA通道0-3的屏蔽寄存器 |
0BH | DMA通道0-3的方式寄存器 |
0CH | DMA清除字节指针 |
0DH | DMA主清除字节 |
0EH | DMA通道0-3的清屏蔽寄存器 |
0FH | DMA通道0-3的写屏蔽寄存器 |
19H | DMA起始寄存器 |
20H-3FH | 可编程中断控制器1(8259)使用 |
40H | 可编程中断计时器(8253)使用,读/写计数器0 |
41H | 可编程中断计时器寄存器 |
42H | 可编程中断计时器杂项寄存器 |
43H | 可编程中断计时器,控制字寄存器 |
44H | 可编程中断计时器,杂项寄存器(AT) |
47H | 可编程中断计时器,计数器0的控制字寄存器 |
48H-5FH | 可编程中断计时器使用 |
60H-61H | 键盘输入数据缓冲区 |
61H | AT:8042键盘控制寄存器/XT:8255输出寄存器 |
62H | 8255输入寄存器 |
63H | 8255命令方式寄存器 |
64H | 8042键盘输入缓冲区/8042状态 |
65H-6FH | 8255/8042专用 |
70H | CMOS RAM地址寄存器 |
71H | CMOS RAM数据寄存器 |
80H | 生产测试端口 |
81H | DMA通道2,页表地址寄存器 |
82H | DMA通道3,页表地址寄存器 |
83H | DMA通道1,页表地址寄存器 |
87H | DMA通道0,页表地址寄存器 |
89H | DMA通道6,页表地址寄存器 |
8AH | DMA通道7,页表地址寄存器 |
8BH | DMA通道5,页表地址寄存器 |
8FH | DMA通道4,页表地址寄存器 |
93H-9FH | DMA控制器专用 |
0A0H | NM1屏蔽寄存器/可编程中断控制器2 |
0A1H | 可编程中断控制器2屏蔽 |
0C0H | DMA通道0,内存地址寄存器(DMA控制器2(8237)) |
0C2H | DMA通道0, 传输计数寄存器 |
0C4H | DMA通道1,内存地址寄存器 |
0C6H | DMA通道1, 传输计数寄存器 |
0C8H | DMA通道2,内存地址寄存器 |
0CAH | DMA通道2, 传输计数寄存器 |
0CCH | DMA通道3,内存地址寄存器 |
0CEH | DMA通道3, 传输计数寄存器 |
0D0H | DMA状态寄存器 |
0D2H | DMA写请求寄存器 |
0D4H | DMA屏蔽寄存器 |
0D6H | DMA方式寄存器 |
0D8H | DMA清除字节指针 |
0DAH | DMA主清 |
0DCH | DMA清屏蔽寄存器 |
0DEH | DMA写屏蔽寄存器 |
0DFH-0EFH | 保留 |
0F0H-0FFH | 协处理器使用 |
100H-16FH | 保留 |
170H | 1号硬盘数据寄存器 |
171H | 1号硬盘错误寄存器 |
172H | 1号硬盘数据扇区计数 |
173H | 1号硬盘扇区数 |
174H | 1号硬盘柱面(低字节) |
175H | 1号硬盘柱面(高字节) |
176H | 1号硬盘驱动器/磁头寄存器 |
177H | 1号硬盘状态寄存器 |
1F0H | 0号硬盘数据寄存器 |
1F1H | 0号硬盘错误寄存器 |
1F2H | 0号硬盘数据扇区计数 |
1F3H | 0号硬盘扇区数 |
1F4H | 0号硬盘柱面(低字节) |
1F5H | 0号硬盘柱面(高字节) |
1F6H | 0号硬盘驱动器/磁头寄存器 |
1F7H | 0号硬盘状态寄存器 |
1F9H-1FFH | 保留 |
200H-20FH | 游戏控制端口 |
210H-21FH | 扩展单元 |
278H | 3号并行口,数据端口 |
279H | 3号并行口,状态端口 |
27AH | 3号并行口,控制端口 |
2B0H-2DFH | 保留 |
2E0H | EGA/VGA使用 |
2E1H | GPIP(0号适配器) |
2E2H | 数据获取(0号适配器) |
2E3H | 数据获取(1号适配器) |
2E4H-2F7H | 保留 |
2F8H | 2号串行口,发送/保持寄存器(RS232接口卡2) |
2F9H | 2号串行口,中断有效寄存器 |
2FAH | 2号串行口,中断ID寄存器 |
2FBH | 2号串行口,线控制寄存器 |
2FCH | 2号串行口,调制解调控制寄存器 |
2FDH | 2号串行口,线状态寄存器 |
2FEH | 2号串行口,调制解调状态寄存器 |
2FFH | 保留 |
300H-31FH | 原形卡 |
320H | 硬盘适配器寄存器 |
322H | 硬盘适配器控制/状态寄存器 |
324H | 硬盘适配器提示/中断状态寄存器 |
325H-347H | 保留 |
348H-357H | DCA3278 |
366H-36FH | PC网络 |
372H | 软盘适配器数据输出/状态寄存器 |
375H-376H | 软盘适配器数据寄存器 |
377H | 软盘适配器数据输入寄存器 |
378H | 2号并行口,数据端口 |
379H | 2号并行口,状态端口 |
37AH | 2号并行口,控制端口 |
380H-38FH | SDLC及BSC通讯 |
390H-393H | Cluster适配器0 |
3A0H-3AFH | BSC通讯 |
3B0H-3BBH | MDA视频寄存器 |
3BCH | 1号并行口,数据端口 |
3BDH | 1号并行口,状态端口 |
3BEH | 1号并行口,控制端口 |
3C0H-3CFH | EGA/VGA视频寄存器 |
3D0H-3D7H | CGA视频寄存器 |
3F0H-3F7H | 软盘控制器寄存器 |
3F8H | 1号串行口,发送/保持寄存器(RS232接口卡1) |
3F9H | 1号串行口,中断有效寄存器 |
3FAH | 1号串行口,中断ID寄存器 |
3FBH | 1号串行口,线控制寄存器 |
3FCH | 1号串行口,调制解调控制寄存器 |
3FDH | 1号串行口,线状态寄存器 |
3FEH | 1号串行口,调制解调状态寄存器 |
3FFH | 保留 |
I/O端口和寻址
http://book.51cto.com/art/200812/102818.htm
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范围。因此若要让一个字符显示在屏幕上,可以直接使用内存操作指令往这个内存区域执行写操作。
I/O端口地址分配
端口地址范围 | 分配说明 | 端口地址范围 | 分配说明 |
---|---|---|---|
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地址范围:
[root@plinux root]# 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 [Rhine-II]
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
[root@plinux root]#
主存储器
当计算机上电初始化时,物理内存被设置成从地址0开始的连续区域。除了地址从0xA0000~0xFFFFF(640KB~1MB,共384KB)和 0xFFFE0000~0xFFFFFFFF(4GB处的最后64KB)范围以外的所有内存都可用做系统内存。这两个特定范围被用于I/O设备和BIOS 程序。假如我们的计算机中有16MB的物理内存,那么在Linux 0.1x系统中,0~640KB将被用做存放内核代码和数据。Linux内核不使用BIOS功能,也不使用BIOS设置的中断向量表。640KB~1MB 之间的384KB仍然保留用作图中指明的用途。其中地址从0xA0000开始的128KB用做显示内存缓冲区,随后部分用于其他控制卡的ROM BIOS或其映射区域,而0xF0000~1MB范围用于高端系统ROM BIOS的映射区。1MB~16MB将被内核用做可分配的主内存区。另外高速缓冲区和内存虚拟盘也会占用内核代码和数据后面的一部分内存区域。该区域通常会跨越640KB~1MB的区域。