linux 内存映射 外设,IO映射和内存映射

CPU对外设端口物理地址的编址方式有两种:一种是IO映射方式,另一种是内存映射方式。

IO映射方式:CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4G,IO空间是16位可以寻址到64K。内存映射方式:arm,powerpc在这一类的嵌入式处理器中,IO Port的寻址方式是采用内存映射,也就是IO bus就是Mem bus。系统的寻址能力如果是32位,IO Port+Mem(包括IO Mem)可以达到4G。Linux将基于IO映射方式的和内存映射方式的IO端口统称为IO区域(IO region)。

所以至此我觉得我们应该分清楚,io端口,io内存,io映射方式,内存映射方式。

参考下面文章:

http://blog.chinaunix.net/u3/94284/showart_2030412.html

http://blog.chinaunix.net/u3/94284/showart_2030419.html

linux管理io口是通过下面一组函数来的:1) request_region()

把一个给定区间的IO端口分配给一个IO设备。

2) check_region()

检查一个给定区间的IO端口是否空闲,或者其中一些是否已经分配给某个IO设备

3) release_region()

释放以前分配给一个IO设备的给定区间的IO端口。

Linux中可以通过以下辅助函数来访问IO端口:

inb(),inw(),inl(),outb(),outw(),outl()“b”“w”“l”分别代表8位,16位,32位。

linux管理io内存是通过下面一组函数来的

1) request_mem_region()

请求分配指定的IO内存资源。

2) check_mem_region()

检查指定的IO内存资源是否已被占用。

3) release_mem_region()

释放指定的IO内存资源。

其中传给函数的start address参数是内存区的物理地址(以上函数参数表已省略)。

驱动开发人员可以将内存映射方式的IO端口和外设内存统一看作是IO内存资源。

ioremap()用来将IO资源的物理地址映射到内核虚地址空间(3GB - 4GB)中,参数addr是指向内核虚地址的指针。

Linux中可以通过以下辅助函数来访问IO内存资源:

readb(),readw(),readl(),writeb(),writew(),writel()。

Linux在kernel/resource.c文件中定义了全局变量ioport_resource和iomem_resource,来分别描述基于IO映射方式的整个IO端口空间和基于内存映射方式的IO内存资源空间(包括IO端口和外设内存)。

访问io映射方式的io函数组如下:unsigned inb(unsigned port);

void outb(unsigned char byte, unsigned port);

unsigned inw(unsigned port);

void outw(unsigned short word, unsigned port);

unsigned inl(unsigned port);

void outl(unsigned longword, unsigned port);访问内存映射方式的io函数组如下:

和访问io内存是一样的

最后可以通过ioport_map吧io映射方式变成内存映射方式,可以和内存映射一样使用,这些只是给软件设计带来方便,底层还是io映射方式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值