pci memory-map region的prefetchable 和 nonprefetchable

2023-10-14 03:38

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

在PCI设备驱动开发过程中,处理板载I/O和内存空间时,常常会遇到prefetchable和nonprefetchable两词,直译为可预取和不可预取。但是两者具体究竟是什么含义呢?在LDD3, Chapter 12: PCI Drivers一章找到了不错的解释,姑且一边翻译一边解读如下(原文:LDD3影印版p316,Accessing the I/O and Memory Spaces 下面一段):PCI设备会实现多至六个I/O地址区间(region)。每个区间由内存或I/O地址组成。大部分设备在 内存区间实现其I/O寄存器 ,这样做也更合理(参考P236),不过,和普通内存不同, I/O寄存器不应该被CPU缓存 因为每次访问可能伴随副作用 (side effect,如何理解这个副作用呢?比如, 有些设备的中断状态寄存器只要一读取,便自动清零 ;这儿所谓副作用就是指 读取某个地址时可能导致该地址内容发生变化 )。把I/O寄存器实现成内存区间的PCI设备可以通过 设定其配置空间寄存器的"内存为可预取"位(bit)来标明某地址区间是否可预取 如果内存区间被标记为可预取 ,那么CPU便会 缓存 其内容, 访问时会进行各种优化方法 ;相反, 访问不可预取内存时就不能进行优化 ,因为每次访问都伴随副作用,就和I /O端口 一样。将其 控制寄存器映射到内存地址范围 的外设会把该范围置为不可预取,不过诸如PCI板卡上的显示内存(video memory)之类都是可预取的。 

在内核中,PCI设备的I/O区间已集成到通用资源管理中。因此,欲知设备是否映射成内存或I/O空间,不需要直接访问配置变量(系统启动时,会将PCI配置空间信息导入到内核数据结构中)。比如:

unsigned long pci_resource_flags(struct pci_dev *dev, int bar); 


可以返回某个资源的标志信息。

资源的标志可以用来定义一些自己独有的特性。比如对PCI I/O区间相关的PCI资源而言,可以从基址寄存器抽取出该信息,当然也能从不是和PCI设备相关联的资源中获取。 

<linux/ioport.h>中定义了所有的资源标志,最重要的如下:

IORESOURCE_IO 
IORESOURCE_MEM 

如果存在相关的I/O区间,会设置如下两个标志之一:

IORESOURCE_PREFETCH 
IORESOURCE_READONLY 

这些标志标明内存区间是否可预取和/或写保护,PCI资源不会用到后面那个标志。

这篇关于pci memory-map region的prefetchable 和 nonprefetchable的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

Map

Map 是 Java 中用于存储键值对的集合接口。以下是对 Map 的详细介绍: 特点 键值对存储:每个元素包含一个键和一个值。 键唯一:键不能重复,但值可以重复。 无序/有序:根据具体实现,键值对的顺序可能无序(如 HashMap)或有序(如 TreeMap、LinkedHashMap)。 主要实现类 HashMap 基于哈希表,无序存储。 允许一个 null 键和多个 null 值。

Java中集合类Set、List和Map的区别

Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。那么它们有什么区别呢? Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对

C++数据结构重要知识点(5)(哈希表、unordered_map和unordered_set封装)

1.哈希思想和哈希表 (1)哈希思想和哈希表的区别 哈希(散列、hash)是一种映射思想,本质上是值和值建立映射关系,key-value就使用了这种思想。哈希表(散列表,数据结构),主要功能是值和存储位置建立映射关系,它通过key-value模型中的key来定位数组的下标,将value存进该位置。 哈希思想和哈希表数据结构这两个概念要分清,哈希是哈希表的核心思想。 (2)unordered

【C++STL(十四)】一个哈希桶简单模拟实现unordered_map/set

目录 前言 一、改造哈希桶 改造结点类 改造主体  模板参数改造  迭代器(重点) 改造完整哈希桶 unordered_map模拟实现 unordered_set模拟实现 前言 前面的文章都有说unordered_map/set的底层结构就是哈希表,严格来说是哈希桶,那么接下来我们就尝试使用同一个哈希桶来模拟实现一下。整体的逻辑和一棵红黑树封装map/set类似,所以

Java中Map取值转String Null值处理

Map<String, Object> 直接取值转String String value = (String)map.get("key") 当map.get(“key”)为Null值时会报错。 使用String类的valueOf静态方法可以解决这个问题 String value = String.valueOf(map.get("key"))

Creating OpenAI Gym Environment from Map Data

题意:从地图数据创建 OpenAI Gym 环境 问题背景: I am just starting out with reinforcement learning and trying to create a custom environment with OpenAI gym. However, I am stumped with trying to create an enviro

【Java编程的逻辑】Map和Set

HashMap Map有键和值的概念。一个键映射到一个值,Map按照键存储和访问值,键不能重复。 HashMap实现了Map接口。 基本原理 HashMap的基本实现原理:内部有一个哈希表,即数组table,每个元素table[i]指向一个单向链表,根据键存取值,用键算出hash值,取模得到数组中的索引位置index,然后操作table[index]指向的单向链表。 存取的时候依据键的

RDD的map和flatMap

在 Apache Spark 中,map 和 flatMap 是 RDD(弹性分布式数据集)中最常用的转换操作之一。 map 假设你有一个包含整数的 RDD,你想要计算每个元素的平方。 from pyspark import SparkContextsc = SparkContext(appName="MapExample")# 创建一个包含整数的 RDDnumbers = sc.para

如何编写Linux PCI设备驱动器 之一

如何编写Linux PCI设备驱动器 之一 PCI寻址PCI驱动器使用的APIpci_register_driver()pci_driver结构pci_device_id结构 如何查找PCI设备存取PCI配置空间读配置空间APIs写配置空间APIswhere的常量值共用部分类型0类型1 PCI总线通过使用比ISA更高的时钟速率来实现更好的性能;它是时钟运行在 25 或 33 M