关于IO空间和内存空间(不太懂~)

一、基础知识

1.IO空间和内存空间

在X86处器中存在I/O空间的概念,I/O空间是相对内存空间而言的,他们是彼此独立的地址空间,在32位的x86系统中,I/O空间大小为64K,内存空间大小为4G。、

IO空间X86支持,但是ARM并不支持IO空间。

2.IO端口与IO内存

当以一个寄存器或内存位于IO空间时,称为IO端口。

当一个寄存器或内存位于内存空间时,称为IO内存。

3.IO端口的操作(个人觉得不是很重要,但是老谢讲了)

①申请IO端口

函数:struct resource*request_region(unsignedlong first, unsignedlong n, const char *name)

功能:这个函数告诉内核,你要使用从 first 开始的n个端口,name参数是设备的名字。如果申请成功,返回非 NULL,申请失败,返回 NULL。

注意:系统的IO端口可能已经被占用,所以分配的时候需要查看哪些端口被占用。

②访问IO端口

unsigned inb(unsigned port) 读字节端口( 8 位宽 )

oid outb(unsignedchar byte, unsigned port)  写字节端口( 8 位宽 )

unsigned inw (unsigned port)
v void outw(unsignedshort word, unsigned port)
存取 16-位 端口。
v unsigned inl(unsigned port)
v void outl(unsigned longword, unsigned port)
存取 32-位 端口。

③释放IO端口

void release_region(unsignedlong start, unsignedlong n)

4.IO内存的操作

①申请IO内存

struct resource*request_mem_region(unsigned long start, unsignedlonglen, char *name)

功能:这个函数申请一个从start 开始,长度为len 字节的内存区。如果成功,返回非NULL;否则返回NULL,所有已经在使用的I/O内存在/proc/iomem 中列出。

②映射IO内存

原因:在访问IO内存之前必须进行物理地址到虚拟地址的映射。

函数:void*ioremap(unsigned long phys_addr, unsignedlong size)

③访问IO内存

读函数:

unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)

写函数:

void iowrite8(u8 value, void *addr)
void iowrite16(u16 value, void *addr)
void iowrite32(u32 value, void *addr)

④释放IO内存

1. void iounmap(void * addr)
2. void release_mem_region(unsigned long start, unsignedlonglen)

你可能感兴趣的:(关于IO空间和内存空间(不太懂~))