问题标签 [memory-mapped-io]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
231 浏览

c - 读取内存映射 IO 寄存器如何(来自数据表)并在 mmap 中使用它们

我有英特尔系统Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (Lewisville) (rev 04)。我已经下载了数据表,如数据表Intel ® 82579 Gigabit Ethernet PHY

现在我正在读取 pci 以太网设备的 resource0,例如

我有 x86-64 位系统。卡利 Linux 5.7。所以我 Register_Values_From_Datasheet从上面替换数据表中的寄存器偏移值,例如0x00008for STATUS:Device Status Register=from datasheet

22:EINVAL但 mmap() 的 errno在 mmap 调用后具有价值。表示无效的论点。也许我从数据表中读取的偏移值可能必须以其他方式解释。

我在以太网设备的 sys/bus/pci/devices/0000:00:19.0 中的资源文件是这样的

从上面的资源文本文件(resource0)转储显示我的内存映射 IO 从 0x00000000fe400000 开始。所以我认为应该是 mmap (return (void*)=&0x00000000fe400000)= 的返回地址,但我得到类似的东西0xffffffff,errno 是 22。任何人都可以指导我正确的方向来解释偏移量需要如何解释从数据表。此外,通常需要访问哪些寄存器才能获取 pci 以太网设备的数据包。因为我是设备编程的新手。

0 投票
0 回答
45 浏览

c - 为什么使用 mmap 写入文件时会出现段错误?

我最近从一个 YouTube 视频中了解到,我们可以通过将文件映射到内存来读取或写入文件。该视频展示了如何从文本文件中读取一些内容并将其打印出来并更改文本文件的一些字符。我尝试使用这种技术将一些内容写入文件,但每当我构建和运行我的代码时,我都会遇到分段错误(核心转储)错误,我不知道为什么。

我的操作系统是 ubuntu 18.04,我使用 GCC 7.3.0 编译器。

0 投票
0 回答
35 浏览

memory-address - 在哪里可以找到 BIOS 的 I/O 地址范围?

我一直在阅读这个芯片组数据表,寻找 BIOS I/O 地址范围,但我没有找到。

在哪里可以找到 BIOS 地址范围?是在这个数据集上还是我应该在其他地方看?

0 投票
1 回答
38 浏览

windows - 检测不干净的文件系统关闭

我有一个项目,我们使用内存映射文件处理大量缓存数据。我们使用 Windows 10、NTFS 和 .NET。

当用户启动应用程序时,我们检测之前的程序会话是否正确关闭,如果是,我们重用缓存。

但是,这对开发人员来说是调试时的痛苦。停止正在调试的程序是很常见的。下次启动时,需要重新计算缓存的数据,既费时又烦人。

所以,我们一直在考虑我们可以引入一个“事务日志”,这样即使之前的关闭是不干净的,我们也可以恢复。

现在解决实际问题。

似乎无法保证刷新内存映射文件的顺序。如果程序刚刚停止,则没有问题,因为整个内存映射文件将被操作系统刷新到磁盘。如果停电,问题就来了。在这种情况下,无法保证文件处于什么状态。我们的“事务日志”也无济于事,除非我们总是在修改缓存之前将事务日志刷新到磁盘。这将违背我们架构的目的,因为它会引入不可接受的性能损失。

如果我们能以某种方式知道磁盘上的内存映射文件之前处于操作系统无法在操作系统关闭之前刷新所有页面的状态,我们可以在下次启动时将整个文件丢弃。会有延迟,但这是完全可以接受的,因为它只会在断电或类似事件之后发生。

当操作系统启动时,它知道文件可能已损坏,因为它知道文件系统没有完全卸载。

最后,我的问题:

有什么方法可以询问 Windows 文件系统在挂载时是否干净?

0 投票
3 回答
70 浏览

c++ - 如何拥有指向 CMSIS 定义的硬件外围设备的 constexpr 指针?

对于类型安全和命名空间功能,我想尽可能使用constexpr而不是s。#define

不幸的是,我error: 'reinterpret_cast<SPI_TypeDef*>(1073756160)' is not a constant expression在尝试时得到了这个。

不是在寻找解释为什么reinterperet_cast不能在constexpr.

将 constexpr 指针指向某些内存映射硬件的现代 C++ 方法是什么?

这样做的一个原因是constexpr在模板化代码中使用这些值。

0 投票
0 回答
14 浏览

elasticsearch - 什么是 ElasticSearch 中的最大大小索引

嗨,我是 ElasticSearch 和 Lucene 的新手。

据我所知,在 ElasticSearch 1.x 版本之后,它默认使用内存映射存储模式(通过使用 Lucene MMAPDirectory)。

所以我认为这意味着ES在搜索或索引时需要等于索引大小的内存空间。因此应该有索引大小的限制。

你能检查我的期望是对还是错?

或者有没有解决问题的机制或者解决办法(现在ES版本7.x以上)

0 投票
1 回答
205 浏览

io - 什么是内存映射 io 和基于端口的 io

好吧,我对内存映射 io 和基于端口的 io 有一些困惑。问题是: -

  1. 在基于端口的 io 中,如果我写入端口,是否会影响相应的内存地址,反之亦然。
  2. x86 是否使用基于端口的 io 或内存映射 io。(我认为它取决于主板,x86 可以同时使用,如果我错了,请纠正我)。
  3. 在内存映射 io 中存在一些与缓存相关的问题,这些问题是什么?
  4. 我们可以在设备上同时使用这两种类型的 io 吗?
  5. DMA 如何与 hdd 一起使用?

提前致谢。

0 投票
2 回答
106 浏览

c++ - 内存映射的 C++ 对象非硬件成员

我正在使用 C++ 为一块内存映射硬件开发一个驱动程序,并且我定义了一个代表这个设备的类。它看起来像这样:

该类有两个文件:device.cpp 和 device.h。成员变量代表设备本身的实际寄存器。现在我想在设备本身上定义更多不是实际寄存器的成员,但我不能在类中定义它们,因为如果我这样做,它们将在设备的内存映射位置定义,该位置可能包含其他设备/寄存器. 如果我将它们定义为公共的,这会破坏标准布局并且该类将不再起作用。

所以我所做的就是将它们定义为类定义之外的全局变量。问题是如果我定义了多个对象,它们都会共享这些全局变量,但我希望每个对象都有自己的,我该怎么做呢?

0 投票
0 回答
27 浏览

java - 防止内存映射文件变得太大

我想使用内存映射 IO 在我的两个应用程序之间建立通信(主要是为了避免套接字倾向于泄漏到网络上的其他计算机的问题)。但是,我担心的一个问题是存储空间:当我继续向文件写入命令时,该文件只会变得更大。诚然,大多数命令都很短,并且需要几天的持续运行时间才能成为问题,但我还是想避免它。有没有一种好方法可以定期清除我的收件人应用程序已经读取的“旧”消息文件,从而回收磁盘存储空间?

0 投票
2 回答
262 浏览

c - 如何将变量放在 SDCC 中的特定内存位置

对于低级编程,有时有必要说,在给定的内存位置,这是我的地址所在的位置。对于这篇文章,示例是PIR1PIC16F886 和相关微控制器中的寄存器。它始终位于地址 0x000C。

我采用了这种方法:

现在我可以用类似的东西分配给变量pir1 |= 0x40(好吧,我会使用#defined常量而不是幻数,但你明白我的意思)。这在 GCC 上编译得很好,即使我使用-Wextra -Wall. 为了检查我的假设,GCC 吐出了以下 x86_64:

正是我想要的(好吧,我现在确定为什么它是eax一个又rax一个,这可能是另一个愚蠢的 x86 怪癖,但无关紧要,因为无论如何我都想要 PIC14 代码)

现在,以 PIC14 为目标,我实际上使用的是 SDCC 编译器。我像这样调用它

上面以开头的代码#define给出了以下警告:

我试过这样做:

但这会导致错误消息

当我尝试分配任务时。

所以我的问题是我是否错过了在 C 中执行此操作的惯用方式?为什么 SDCC 会警告我?我在这里忽略了一些特定的 SDCC 特定的放克吗?