request_mem_region 与 ioremap【转】

转自:http://blog.csdn.net/alada007/article/details/7700125

如果从根本上说起的话应该从Intel的处理器芯片与其它的芯片的不同说起,与这两个函数相关的是对 I/OPort与内存的寻址方式,intel的处理器中内存与外部IOPort是独立编址与寻址的,这就有了两种地址空间分别是内存地址空间与IO地址空间,访问IO地址空间需使用不同的指令。与intel不同的是有些处理器(如PowerPC等)就只有一个地址空间,即内存空间,在这种情况下,外设的I/OPort物理地址就需要被映射到内存地址空间才能被访问,这主就是所说的Memery-Mapped, 而Intel的把I/OPort物理地址映射到I/O地址空间中就是所说的IO-Mapped。

要使用I/OPort内存则需先申请再映射,即先调用request_mem_region,内核发现这样的函数调用会将该I/OPort地址标记为以被使用,如其它人再来申请则告之其该内存已使用。调用申请函数之后可以放心的映射(ioremap)了,当然不调用申请函数直接映射该I/OPort地址到虚拟空间也是可以的,但鬼才知道一个I/OPort地址指向多个虚拟空间什么发生什么事情! 把I/OPort地址映射到虚拟地址空间还有一个好处就是访问I/OPort可以虚拟地址上加一偏移就O啦。

时间: 2024-12-16 05:00:56

request_mem_region 与 ioremap【转】的相关文章

request_mem_region,ioremap 和phys_to_virt()

转载: request_mem_region,ioremap 和phys_to_virt()   Linux在头文件include/linux/ioport.h中定义了三个对I/O内存资源进行操作的宏:(1)request_mem_region()宏,请求分配指定的I/O内存资源.(2)check_mem_region()宏,检查指定的I/O内存资源是否已被占用.(3)release_mem_region()宏,释放指定的I/O内存资源.       这三个宏的定义如下: #define req

内核request_mem_region 和 ioremap的理解

request_mem_region仅仅是linux对IO内存的管理,意思指这块内存我已经占用了,别人就不要动了,也不能被swap出去.使用这些寄存器时,可以不调用request_mem_region,但这样的话就不能阻止别人对他的访问了. http://blog.csdn.net/skyflying2012/article/details/8672011\ 几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器.状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址.根据CP

内核request_mem_region 和 ioremap的理解【转】

转自:http://blog.csdn.net/skyflying2012/article/details/8672011 版权声明:本文为博主kerneler辛苦原创,未经允许不得转载. 几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器.状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址.根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地

Linux LCD驱动(四)--驱动的实现

目录(?)[-] 基本原理 写 framebuffer 驱动程序要做什么 LCD 模块 驱动程序 控制器 什么是 frame buffer 设备 Linux Frame Buffer 驱动程序层次结构 数据结构 接口 一个 LCD controller 驱动程序 分配系统内存作为显存 实现 fb_ops 结构 基本原理 通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来: 驱动程序分配系统内存作为显存:实现

PLATFORM设备驱动

字符设备,杂项设备虽然简单,但是在工程中,比如SDK中,通常都使用platform设备驱动来实现硬件驱动,为什么呢?先看看platform设备驱动的结构: platform由两部分组成:设备--platform_device和驱动--platform_driver.它们之间通过platform总线来绑定,这个我们不需要关心,内核里面的东西. platform总线是一个虚拟的总线,跟其他总线(比如:I2C,SPI,USB,PCIE)一样,当系统注册一个设备(platform_device)的时候,

led设备驱动(s3c_led.c)

s3c_led.c分析:http://blog.csdn.net/hurry_liu/article/details/8770206 1,注册设备号int register_chrdev_region(dev_t from, unsigned count, const char *name)动态分配设备号 int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name) // 无法再

LINUX内核中断(ioremap,内部watchdog中断,外部中断)

一:ioremap 在内核中有关与物理地址到虚拟地址的映射全都是有mmu,统一开启,而物理地址到虚拟地址的映射关系全都存在一张对应的表格里面,这张表,在开启mmu的时候一起建好,比如在建表的时候是将物理地址0x11111111映射到44444444,那么问题就是: 比如以后我们如果要将0x11111111的地址映射到66666666地址怎么办?在内核中,通过特定的物理地址到虚拟地址的自动对应映射通过ioremap()函数来实现 1 #include <linux/init.h> 2 #incl

linux模块驱动之led(ioremap)

一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的Device Drivers /Character devices目录下,进行完裁剪之后重新编译linux源码: (2)ioremap() define ioremap(cookie,size)        __arm_ioremap((cookie), (size), MT_DEVICE) 编写

Linux内核访问外设I/O--动态映射(ioremap)和静态映射(map_desc) (转载)

[转](转)Linux内核访问外设I/O资源的方式-静态映射(map_desc)方式 Linux内核访问外设I/O资源的方式 Author: Dongas Date: 08-08-02 我们知道默认外设I/O资源是不在Linux内核空间中的(如sram或硬件接口寄存器等),若需要访问该外设I/O资源,必须先将其地址映射到内核空间中来,然后才能在内核空间中访问它. Linux内核访问外设I/O内存资源的方式有两种:动态映射(ioremap)和静态映射(map_desc). 一.动态映射(iorem