ioremap,request_mem_region

2024-02-27 20:58
文章标签 request mem region ioremap

本文主要是介绍ioremap,request_mem_region,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章内容来自:http://blog.csdn.net/fudan_abc/archive/2007/10/04/1811451.aspx

 

以我们家 Intel 为代表的 i386 系列处理器中 , 内存和外部 IO 是独立编址独立寻址的 , 于是有一个地址空间叫做内存空间 , 另有一个地址空间叫做 I/O 空间 . 也就是说 , 从处理器的角度来说 ,i386 提供了一些单独的指令用来访问 I/O 空间 . 换言之 , 访问 I/O 空间和访问普通的内存得使用不同的指令 . 而在一些玩嵌入式的处理器中 , 比如 PowerPC, 他们家就只使用一个空间 , 那就是内存空间 , 那像这种情况 , 外设的 I/O 端口的物理地址就被映射到内存地址空间中 , 这就是传说中的 Memory-mapped, 内存映射 . 而我们家那种情况 , 外设的 I/O 端口的物理地址就被映射到 I/O 地址空间中 , 这就是传说中的 I/O-mapped,  I/O 映射 .


要使用 I/O 内存首先要申请 , 然后要映射 , 而要使用 I/O 端口首先要申请 , 或者叫请求 , 对于 I/O 端口的请求意思是让内核知道你要访问这个端口 , 这样内核知道了以后它就不会再让别人也访问这个端口了 . 毕竟这个世界僧多粥少啊 . 申请 I/O 端口的函数是 request_region, 这个函数来自 include/linux/ioport.h,


/* Convenience shorthand with allocation */

#define request_region(start,n,name)    __request_region(&ioport_resource, (start), (n), (name))

#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name))

#define rename_region(region, newname) do { (region)->name = (newname); } while (0)

extern struct resource * __request_region(struct resource *,

                                         resource_size_t start,

                                         resource_size_t n, const char *name);


这里我们看到的那个 request_mem_region 是申请 I/O 内存用的 . 申请了之后 , 还需要使用 ioremap 或者 ioremap_nocache 函数来映射 .对于request_region, 三个参数 start,n,name 表示你想使用从 start 开始的 size  n  I/O port 资源 ,name 自然就是你的名字了 .


这两个函数在内核的驱动中几乎都会出现,例如ohci-at91.c里面的probe函数:

 

[cpp]  view plain copy
  1. hcd->rsrc_start = pdev->resource[0].start;  
  2.     hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1;  
  3.     if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {  
  4.         pr_debug("request_mem_region failed/n");  
  5.         retval = -EBUSY;  
  6.         goto err1;  
  7.     }  
  8.     hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);  
  9.     if (!hcd->regs) {  
  10.         pr_debug("ioremap failed/n");  
  11.         retval = -EIO;  
  12.         goto err2;  
  13.     }  

 

这样的好处是寄存器访问方式比较好看,只要加个偏移地址就可以了。

不过我有时候又不太喜欢用。因为这两句话说到底是为了访问寄存器用的。相当于获得寄存器虚拟地址。但是我们在初始化的时候虚拟地址就已经映射过了,所以我喜欢直接操作寄存器的虚拟地址。

这篇关于ioremap,request_mem_region的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753570

相关文章

Vue3上传图片报错:Current request is not a multipart request

当你看到错误 "Current request is not a multipart request" 时,这通常意味着你的服务器或后端代码期望接收一个 multipart/form-data 类型的请求,但实际上并没有收到这样的请求。在使用 <el-upload> 组件时,如果你已经设置了 http-request 属性来自定义上传行为,并且遇到了这个错误,可能是因为你在发送请求时没有正确地设置

使用http-request 属性替代action绑定上传URL

在 Element UI 的 <el-upload> 组件中,如果你需要为上传的 HTTP 请求添加自定义的请求头(例如,为了通过身份验证或满足服务器端的特定要求),你不能直接在 <el-upload> 组件的属性中设置这些请求头。但是,你可以通过 http-request 属性来自定义上传的行为,包括设置请求头。 http-request 属性允许你完全控制上传的行为,包括如何构建请求、发送请

code: 400, msg: Required request body is missing 错误解决

引起这个错误的原因是,请求参数按照get方式给。 应该给json字符串才对 补充: 1. @RequestBody String resource 加@RequestBody必须给json字符串,否则会报错400,记如标题错误。 不加这个的进行请求的话,其实post和get就没有什么区别了。 2. List<String> indexCodes=(List<String>)json.

FORM的ENCTYPE=multipart/form-data 时request.getParameter()值为null问题的解决

此情况发生于前台表单传送至后台java servlet处理: 问题:当Form需要FileUpload上传文件同时上传表单其他控件数据时,由于设置了ENCTYPE=”multipart/form-data” 属性,后台request.getParameter()获取的值为null 上传文件的参考代码:http://www.runoob.com/jsp/jsp-file-uploading.ht

兔子-(PHP 5.3 and above) Please set 'request_order' ini value to include C,G and P (recommended: 'CGP'

由于在PHP最新的版本中增加了一个配置项目“request_order”,默认值为“GP”,这个存在一定的安全风险。这里我们建议用户将配置更改为“CGP” 可以在php的安装目录下找到php.ini配置目录,找到下面选项: request_order = "GP"  更改为 request_order = "CGP"   重启服务器后即可。 此

青云QingCloud 推出 Region 服务,帮企业轻松构建多活架构

理想情况下,企业通过使用云的方式来消除地域对业务的影响,就像我们在使用水电时,不需要关心发电厂在哪里。但是,一般来说,不同地域之间,只能通过公网联通。 为帮助用户便捷地构建高可用的业务架构,青云QingCloud 推出 Region 服务,通过对基础网络架构进行升级,实现区域( Region )内的可用区( Availability Zone )之间内网高速互联,全面提升整体服务能力。

【python 爬虫】python如何以request payload形式发送post请求

普通的http的post请求的请求content-type类型是:Content-Type:application/x-www-form-urlencoded, 而另外一种形式request payload,其Content-Type为application/json import jsonurl = 'https://api.github.com/some/endpoint'payload

【python requests警告】python3.x requests库取消ssl验证,InsecureRequestWarning: Unverified HTTPS request is be

警告信息: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warni

SpringMVC request生命周期

第一步:用户发起一个请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HanderMapping查找Handler,可以根据xml配置文件,注解进行查找。 第三步:处理器映射器HandlerMapping向前端控制器返回Handler 第四步:前端控制器调用处理器适配器去执行Handler 第五步:处理器适配器去执行Handler 第六步:Handler执行完

perf 基础 -- perf ext_mem_req

perf ext_mem_req ext_mem_req 是 perf 工具事件列表中的一项,主要用于追踪处理器对外部内存的访问请求。它在以下几种情况下会触发: 数据缓存未命中:当处理器访问的数据未命中缓存时,处理器会向外部内存发送请求,加载所需的数据。指令缓存未命中:处理器在获取指令时,如果指令未命中缓存,也会触发外部内存请求,加载所需的指令。内存控制器交互:ext_mem_req 还用于衡