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-08-02 00:12:25

request_mem_region 与 ioremap【转】的相关文章

内核request_mem_region 和 ioremap的理解【转】

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

经典]Linux内核中ioremap映射的透彻理解【转】

转自:http://blog.csdn.net/lanyang123456/article/details/7403514 几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器.状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址.根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CP

ioremap 与 mmap【转】

转自:http://blog.csdn.net/junllee/article/details/7415732 内存映射     对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB. 进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间.用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间,如下图: 内核

Samsung_tiny4412(驱动笔记06)----list_head,proc file system,GPIO,ioremap

/**************************************************************************** * * list_head,proc file system,GPIO,ioremap * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 本文中有些源代码没有全部帖出来,主要是因为篇幅太大的原因; * 3. 基于2中的原因,本文借鉴了python中的缩进代

hi3531的i2c部分

一.关于编译Hi3531 SDK: 之前编译SDK时编译到make uImage总出错,一是找不到.config文件,这个问题是必须先make menuconfig 然后保存.config文件. 二是编译到make uImage的快结束时,会出现找不到mkimage命令错误. 解决方法:     查看最底层的Makefile:arch/arm/boot/Makefile,可以看到:     quiet_cmd_uimage = UIMAGE  $@       cmd_uimage = $(CO

OpenRisc入门(11)-编写ipcore 的linux driver,然后run helloworld

引言 我觉得ORPSoC的关键在于'P',即programmable.SoC的有优势就在于只要是满足总线interface的ip,可以实现plug & work. 所以一旦完成前面的工作之后,添加属于自己的ip core到ORPSoC的wishbone总线上,并编写它对应的驱动就成为非常关键的一步. 本小节就做一个简单的例子,来说明需要完成的工作步骤及其中遇到的问题和对应的解决方法. 11.1 编写wishbone为interface的ip core(ip_mkg) 1>这一步请参考: ht

Linux下串口驱动解析

原文 一.核心数据结构 串口驱动有3个核心数据结构,它们都定义在<#include linux/serial_core.h> 1.uart_driver uart_driver包含了串口设备名.串口驱动名.主次设备号.串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动无需关心tty_driver). struct uart_driver {     struct module     *owner;           /* 拥有该uart_driver的模块,一般为THIS

linux驱动

知识结构: 1.    Linux驱动程序设计模式(40%)2.内核相关知识(30%)3. 硬件相关知识(30%)z 驱动分类:字符,网络,块 字符设备:以字节为最小单位,不可以乱序读写. 块设备: 一次传送一个整体数据(512字节),Linux可以以字节访问块设备(仅仅是驱动与内核的接口不同,访问的顺序的不同(字符只可顺序访问,块驱动可随机访问))   网络接口:硬件(eth0),纯软件(lo) 驱动的安装:模块,编译进内核(Linux启动的时候会自动加载init段) 使用驱动程序:字符设备文

OTG驱动分析(一)

前一段时间弄了2个礼拜的OTG驱动调试,感觉精神疲惫啊.主要原因还是自己对OTG功能不了解造成的.现在终于完成但是对实质原理还有些模糊.所以自己重新总结一下.因为自己是菜鸟,所以用菜鸟的白话方式分析.高手滤过吧. 所谓OTG功能就是具备该功能的设备即可当主设备(host)去轮询别人,也可以当从设备(device)去被别人轮--(双性人?).正所谓所有的产品和功能都是因为需求存在的,举个最简单的需求,原来MP3想传送一个歌曲都得通过电脑.现在只要两个MP3链接,其中一个MP3有OTG功能作为主设备