因为每一个外设都是通过总线(内部总线+外部总线)与处理器建立联系,每个外设在内存中都用规定的地址,处理器通过地址,即可与外设取的联系。
同时外设有自己寄存器(控制寄存器+状态寄存器+数据寄存器),也叫“I/O端口”,其寄存器也有地址,在使用外设之前,必须对外设寄存器进行相关配置,这是寄存器开发。
CPU对外设IO端口物理地址的编址方式 有两种:
一种是I/O映射方式(I/O-mapped)称为端口映射。(X86)
这是一个与CPU地RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专 门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的"I/O映射方式"(I/O-mapped),也就是“独立编址”。
另一种是存储空间映射方式(Memory-mapped),称为内存映射。(ARM体系的CPU均采用这一模式)
有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到 CPU的单一物理地址空间中,而成为内存的一部分,也就是所谓的“统一编址”,这样,CPU就可以像访问一个内存单元那样访问外设I/O端口(理解为I/O寄存器),而不需要设立专门的外设I/O指令。(统一编址)
而具体采用哪一种则取决于CPU的体系结构。
现在流行的一种开发方式是库函数开发,因为寄存器的数量多,功能复杂,直接去配置必须对寄存器每个位的功能了解。所以将寄存器的使用直接封装成可以调用的函数,并提供相应的参数,在以后采用库函数开发时,不需要去查阅数据手册中的寄存器说明,直接调用相应的库函数即可。
CPU与外设交流的方式有两种:轮询和终端,前者为主动,后者为被动。
存储器顺序:寄存器→Cache→内存→外存