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

相关文章

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

JavaScript中的Map用法完全指南

《JavaScript中的Map用法完全指南》:本文主要介绍JavaScript中Map用法的相关资料,通过实例讲解了Map的创建、常用方法和迭代方式,还探讨了Map与对象的区别,并通过一个例子展... 目录引言1. 创建 Map2. Map 和对象的对比3. Map 的常用方法3.1 set(key, v

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

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中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对