内核内存管理详解
1. I/O端口访问
在完成区域预留后,可使用以下函数访问端口:
u8 inb(unsigned long addr)
u16 inw(unsigned long addr)
u32 inl(unsigned long addr)
这些函数分别用于读取8位、16位或32位大小的端口。还有用于写入数据的函数:
void outb(u8 b, unsigned long addr)
void outw(u16 b, unsigned long addr)
void outl(u32 b, unsigned long addr)
这些函数将8位、16位或32位的数据写入指定地址的端口。
PIO(Programmed I/O)使用不同的指令集来访问I/O端口或MMIO(Memory-Mapped I/O),这是一个缺点,因为PIO完成相同任务所需的指令比普通内存访问更多。例如,在MMIO中,1位测试只需一条指令,而PIO需要先将数据读入寄存器再进行位测试,这需要多条指令。
2. MMIO设备访问
MMIO设备的内存映射I/O与内存位于同一地址空间。内核使用通常由RAM使用的部分地址空间(实际上是HIGH_MEM)来映射设备寄存器,这样在该地址处就不是真正的内存(即RAM),而是I/O设备。因此,与I/O设备通信就像对专门用于该I/O设备的内存地址进行读写操作。
例如,如果需要访问i.MX6的IPU - 2分配的