mmap 比 ioremap 慢

2024-01-02

我正在为运行 Linux 2.6.37 的 ARM 设备进行开发。我正在尝试尽快切换 IO 引脚。我制作了一个小内核模块和一个用户空间应用程序。我尝试了两件事:

  1. 使用以下命令直接从内核空间操作 GPIO 控制寄存器ioremap.
  2. mmap()GPIO 控制寄存器无需缓存并从用户空间使用它们。

两种方法都有效,但第二种方法比第一种方法慢约 3 倍(在示波器上观察到)。我想我禁用了所有缓存机制。

当然,我希望充分利用这两个世界:用户空间的灵活性和易于开发以及内核空间的速度。

有谁知道为什么mmap()可能会比ioremap() ?

这是我的代码:

内核模块代码

static int ti81xx_usmap_mmap(struct file* pFile, struct vm_area_struct* pVma)
{
  pVma->vm_flags |= VM_RESERVED;
  pVma->vm_page_prot = pgprot_noncached(pVma->vm_page_prot);

  if (io_remap_pfn_range(pVma, pVma->vm_start, pVma->vm_pgoff,
                          pVma->vm_end - pVma->vm_start, pVma->vm_page_prot))
     return -EAGAIN;

  pVma->vm_ops = &ti81xx_usmap_vm_ops;
  return 0;
}

static void ti81xx_usmap_test_gpio(void)
{
  u32* pGpIoRegisters = ioremap_nocache(TI81XX_GPIO0_BASE, 0x400);
  const u32 pin = 1 << 24;
  int i;

  /* I should use IO read/write functions instead of pointer deferencing, 
   * but portability isn't the issue here */

  pGpIoRegisters[OMAP4_GPIO_OE >> 2] &= ~pin;    /* Set pin as output*/

  for (i = 0; i < 200000000; ++i)
  {
     pGpIoRegisters[OMAP4_GPIO_SETDATAOUT >> 2] = pin;
     pGpIoRegisters[OMAP4_GPIO_CLEARDATAOUT >> 2] = pin;
  }

  pGpIoRegisters[OMAP4_GPIO_OE >> 2] |= pin;    /* Set pin as input*/

  iounmap(pGpIoRegisters);
}

用户空间应用代码

int main(int argc, char** argv)
{
   int file, i;
   ulong* pGpIoRegisters = NULL;
   ulong pin = 1 << 24;

   file = open("/dev/ti81xx-usmap", O_RDWR | O_SYNC);

   if (file < 0)
   {
      printf("open failed (%d)\n", errno);
      return 1;
   }


   printf("Toggle from kernel space...");
   fflush(stdout);

   ioctl(file, TI81XX_USMAP_IOCTL_TEST_GPIO);

   printf(" done\n");    

   pGpIoRegisters = mmap(NULL, 0x400, PROT_READ | PROT_WRITE, MAP_SHARED, file, TI81XX_GPIO0_BASE);
   printf("Toggle from user space...");
   fflush(stdout);

   pGpIoRegisters[OMAP4_GPIO_OE >> 2] &= ~pin;

   for (i = 0; i < 30000000; ++i)
   {
      pGpIoRegisters[OMAP4_GPIO_SETDATAOUT >> 2] = pin;
      pGpIoRegisters[OMAP4_GPIO_CLEARDATAOUT >> 2] = pin;
   }

   pGpIoRegisters[OMAP4_GPIO_OE >> 2] |= pin;

   printf(" done\n");
   fflush(stdout);
   munmap(pGpIoRegisters, 0x400);    

   close(file);    
   return 0;
}

这是因为 ioremap_nocache() 仍然在 VM 映射中启用 CPU 写入缓冲区,而 pgprot_noncached() 则禁用缓冲能力和缓存能力。

苹果与苹果的比较将使用 ioremap_strongly_ordered() 代替。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mmap 比 ioremap 慢 的相关文章

  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • Windows 内存映射文件

    我正在尝试研究 Windows 内核在内存映射文件 虚拟内存方面的行为 具体来说 我感兴趣的是确定内存映射文件的内容 由 Windows 刷新到磁盘的频率以及 Windows 使用什么标准来决定是时候这样做 我在网上做了一些研究 除了 MS
  • 使用 MongoDB docker 镜像停止虚拟机而不丢失数据

    我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 映像 并且数据库上已经有数据 如果我停止虚拟机 以节省过夜费用 我会丢失数据库中包含的所有数据吗 在这些情况下我怎样才能让它持久 有多种选择可以实现此目的 但
  • 如何使用 bash 脚本关闭所有终端,在每个终端中有效地按 Ctrl+Shift+Q

    我经常打开许多终端 其中一些正在运行重要的进程 例如服务器 而另一些则没有运行任何东西并且可以关闭 如果您按 重要 则会弹出确认提示Cntrl Shift Q在其中 如下所示 我想要一个 bash 脚本 它可以关闭所有终端 但将 重要 终端
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 如何从“git log”中查看 Git 中的特定版本?

    My git log显示为 enter code here git trial git log commit 4c5bc66ae50780cf8dcaf032da98422aea6e2cf7 Author king lt email pro
  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • Gradle 1.3:build.gradle 不构建类

    这里有一个新问题 我有一个 build gradle 文件apply plugin java在其中 并与 java 项目 包关联 当我跑步时gradle build从命令行我得到 compileJava UP TO DATE process
  • 将 mmap 内核启动参数保留的内存映射到用户空间

    正如中所讨论的this https stackoverflow com q 1911473 143897问题 我在启动时使用内核启动参数保留一个内存块memmap 8G 64G 我写了一个字符驱动程序 http pete akeo ie 2
  • R 未获取用户库

    我有一个带 R 3 6 0 的 Fedora 30 系统 用户库设置在Renviron就像这个 R LIBS USER R LIBS USER R x86 64 redhat linux gnu library 3 6 事实上 它出现在交互
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b

随机推荐

  • run()方法后线程继续运行

    我在游戏中播放声音时遇到问题 当处理声音播放的线程退出它的 run 方法时 它不会终止 结束 停止 我知道正是这种方法导致了问题 因为当我将整个事情注释掉时 就不会创建更多线程了 用 JVisualVM 检查 问题是退出 run 方法后线程
  • 在 UWP 应用程序上使用 VB.net 获取 IPGlobalProperties

    我正在 Visual Studio 2017 中使用 VB 编写一个非常简单的通用 Windows 应用程序 该应用程序应该向用户提供基本的网络信息 因此我想使用以下方式收集数据IPGlobalProperties并打印 作为第一个例子 D
  • 如何将种子数据放入SQL Server docker镜像中?

    我有一个使用 ASP NET Core 和 SQL Server 的项目 我正在尝试将所有内容放入 docker 容器中 对于我的应用程序 我需要在数据库中有一些初始数据 我可以使用来自 microsoft microsoft mssql
  • 如何在react-native中实现刮刮卡/视图?

    我正在寻找一个包来在反应本机中实现刮刮卡 我找到了这个图书馆https github com thebylito react native scratch card https github com thebylito react nati
  • 我可以在云函数中以管理员身份使用通配符查询 firestore 吗?

    exports updateRelatedCards functions firestore document topic newTopic onWrite snap context gt const newTopic snap data
  • 联合中的标量成员是否计入公共初始序列?

    In the union U下面 如果a or b是活动成员 是否定义了访问行为c struct A int a struct B int a double b union U A a B b int c In 类 联盟 https tim
  • Materialise 中的 Roboto 字体在 Firefox 中的显示问题

    我在用物化 http materializecss com设计我的一些网页的样式 我注意到 Roboto 字体在 Firefox v43 0 3 中无法正确呈现 但在 Chrome 中看起来不错 两个浏览器都从我的服务器下载 woff2 字
  • 访问查询会自动被截断吗?

    以前可能有人问过这个问题 但我似乎无法在任何地方找到任何相关答案 几周前 我在 Access 2003 中编写了几个长查询 我今天想使用这些查询 发现它们被截断了 查询按其应有的方式开始 并在中间的某个地方显示AS Alias 其余的都不见
  • 使用 LLVM 创建本地字符串

    我正在尝试使用 LLVM 创建一个局部变量来存储字符串 但我的代码当前抛出语法错误 lli test2 ll 8 23 error constant expression type mismatch 1 load 6 x i8 c hell
  • 使用 p:calendar 相互限制开始和结束日期时间(无验证)

    我们需要向用户呈现两个 p calendar 组件 分别代表开始日期和结束日期 两个日期时间都有日期 小时和分钟 PrimeFaces 拥有完美mindate maxdate minHour maxHour minMinute and mi
  • 如何使用正则表达式找到除某些短语之外的所有内容?

    好的 所以我有一个短语 foo bar 我想找到除 foo bar 之外的所有内容 这是我的文字 ipsum dolor foo bar Lorem ipsum dolor sat amet 脂肪精英协会eiusmod tempor foo
  • 从phpmyadmin导出数据时返回sql查询页面

    我在 phpMyAdmin 上运行以下查询我获得了数据 但是当单击 导出 时 它会重定向到 sql 查询选项卡 Select sad firstname sad lastname sfo base total invoiced sad em
  • C# 加密登录

    我正在尝试创建一个简单的 asp net 网站 允许用户注册和登录 我已成功地将所有数据存储在数据库中 并在登录表单中对用户进行身份验证 然而我现在想做的是每当新用户注册时将密码以 MD5 格式存储在数据库中并匹配哈希值以便用户能够登录 这
  • 在 Python 2.4 中使用 urllib 解析查询字符串

    使用Python2 4 5 不要问 我想解析一个查询字符串并获得一个字典作为返回 我必须像下面这样 手动 进行操作吗 gt gt gt qs first 1 second 4 third 3 gt gt gt d dict x split
  • Python Pandas 重置运行总计

    我想执行以下任务 给定 2 列 好和坏 我想用运行总计替换这两列的任何行 这是当前数据帧以及所需数据帧的示例 编辑 我应该添加我的意图 我正在尝试使用连续变量作为输入来创建同等分箱 在本例中为 20 的变量 我知道 pandas cut 和
  • PHP 循环遍历 HTML 文本框数组

    我有一个 HTML 表单 其中包含动态数量的复选框字段 所有这些字段都封装在提交表单中 提交表单后 我想使用 PHP 脚本循环遍历每个复选框字段的值 同时 我必须保留与复选框字段关联的特定 ID 以便当我循环遍历脚本中的每个字段时 我可以使
  • 使用llvm从桌面交叉编译到arm

    我正在笔记本电脑上编写 C 代码 我想使用 llvm clang 工具链将其交叉编译为 ARM v7 架构 我正在关注这个网站http llvm org docs HowToCrossCompileLLVM html http llvm o
  • 如何将[setup]中AppID的内容转换为[code]中的字符串?

    当我使用 INNO 向导时 我得到一个 iss 文件 其中包含其设置部分 Setup AppId 87E1AD40 F32B 4EF7 A2FF 5B508814068A
  • 如何解决 Visual C++ 编译器中的错误 C1001?

    我刚刚将 Microsoft Visual Studio Enterprise 2015 从 Update 2 升级到 Update 3 现在收到以下错误 致命错误 C1001 编译器中发生内部错误 编译器文件 f dd vctools c
  • mmap 比 ioremap 慢

    我正在为运行 Linux 2 6 37 的 ARM 设备进行开发 我正在尝试尽快切换 IO 引脚 我制作了一个小内核模块和一个用户空间应用程序 我尝试了两件事 使用以下命令直接从内核空间操作 GPIO 控制寄存器ioremap mmap G