贵州八大员考试时间:寄存器编址

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 19:42:38
存储器,I/O端口,寄存器
分析这几个容易混淆的概念.
引用一段资料: 几乎每一种外设都是通过读写设备上的寄存器来进行操作的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。
CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。具体采用哪一种则取决于CPU的体系结构。
有些体系结构的CPU(如PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的“内存映射方式”(Memory-mapped)。主要缺点是是存储器空间变小.
而另外一些体系结构的CPU(如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间”或者“I/O端口空间”。这是一个与CPU的RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点。
在张凡的<微机原理与接口技术>一书中提到的I/O端口的两种编址方式:(1)I/O与存储器统一编址(如单片机);(2)单独编址(X86系统).这和上述的内存映射方式,I/O映射方式分别对应.
我的理解是:寄存器就是I/O端口;而采用内存映射方式的I/O是存储器的一个子集,采用I/O单独映射方式的I/O是和存储器平级的存储空间.
-----------------------------------------------------------------------------------------
寄存器统一编址?
在WDM(Windows Driver Model)中对设备寄存器的访问,有些平台是同一编址的.通过直接访问内存的方式访问设备寄存器.
请老大们解释一下实现统一编址的详细原理(象独立编址分时输出地址和数据方式等).
回复1   cpu架构决定了编址
一般一套总线的risc,把一段内部地址分配给内部寄存器。(一般是高端地址)。所以可以以看起来访问内存的方式来访问寄存器。而且,他所有地址不会重合,这么就叫统一编址。
有2套总线结构的可以分开编址,操作同一地址借由不同指令,比如0地址可以是内存也可以是rom.由指令来分别。
回复2   wdm中两种都支持
io地址空间的编址有两种方式,io独立编址和存储器映像编址。
io独立编址中,io端口操作有独立的指令,如x86中的in,out,相应的io总线中有iord, iowr读写控制信号。
存储器映像编址中用存储器地址对io端口寻址,直接用操作存储器的指令即可操作io,如mov,ld,st等等,51就是这种编址方式。
但是现在很多高级处理器对存储器访问作了优化,如缓存,预取等等,而io操作通常要求实时性,比如一个寄存器当前的某个bit是1,必须在1ms后把它置成0,存储器编址就得花另外的代价解决这个问题,这就是pci总线的内存空间分为prefecth和nonprefetch的原因。存储器编址用c语言比较容易编程,比如要给0x80地址写0x5a,只需*((char*)(0x80)) = 0x5a即可,而在io独立编址中,往往得写一个函数或者是宏。
x86中有64k的io地址空间,外设接口卡可以使用,在pci总线中这是动态分配的,同时还可以使用内存空间,这在pci总线中也得到了很好的支持,在设备枚举时bios或者windows会动态的分配这些io空间和内存空间,一个外设到底使用什么空间这是设计者考虑的事情。
但是对于wdm驱动程序来说,hal.dll导出了一系列的宏,只要用这些宏操作就可以了,不过一般来说,自己写驱动时,除了pci驱动,其他的很少使用到。
====================================================
以前一直以为寄存器只能存别人的内存地址   ,当然我知道那是通用寄存器
昨天看到书上说s3c2410x 处理器有117个输入输出脚,分为8个端口
端口F的管脚为GPF0~GPF7
同时还给出了端口F的寄存器
比如GPFCON 地址是0x56000050
CGPDAT 地址是0x56000054等
看它的汇编代码   似乎向那个寄存器地址写入数值就真得改变了寄存器的值
Assembly code
;定义端口 E 寄存器预定义
rGPFCON EQU 0x56000050
ldr r0,=rGPFCON ;将寄存器rGPFCON 的地址存放到寄存器r0 中
ldr r1,=0x4000
str r1,[r0] ;将寄存器r1 中的数据存放到寄存器rPCONE 中
为什么这些寄存器本身也有地址呢?这个地址是内存里的地址吗?
和I/O编址方式有关 是统一编址还是独立编址。
每个寄存器都是有地址的,只是ARM的外设寄存器等是占用内存地址空间的,不象51系列的特殊寄存器地址,51系列特殊寄存器地址是独立的必须直接寻址
呵呵,还是去先看看你所用芯片的Memory map吧