问题标签 [ioremap]
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.
c - 为什么我们只能直接访问一个PCI物理地址中的640k-1MB区域?
http://www.mjmwired.net/kernel/Documentation/IO-mapping.txt
有人可以解释为什么会这样We can directly access only the 640k-1MB area
吗?
dictionary - 为什么我不使用 ioremap_cache 时设置了 PCD 位?
我在 x86 系统上使用 ubuntu 12.10 32 位。我有物理内存(大约 32MB,有时更多),它通过 ACPI 表作为设备枚举和保留,因此 linux/OS 无法使用它。我有这个内存设备的 Linux 驱动程序。驱动程序实现 mmap() 以便当进程调用 mmap() 时,驱动程序可以将保留的物理内存映射到用户空间。我有时在 mmap 中什么也不做,除了设置 VMA 并将 vma->vmops 指向 vm_operations_struct 并实现了打开关闭和故障功能。当应用程序访问映射的内存时,我得到一个页面错误并且我的 .fault 函数被调用。这是使用 vm_insert_pfn 将虚拟地址映射到我想要的 32MB 中的任何物理地址。
这是我遇到的问题:在驱动程序中,如果我在初始化期间调用 ioremap_cache(),当我访问此内存中的数据时,我会从应用程序中获得良好的缓存性能。但是,如果我不调用 ioremap_cache(),我会看到对这些物理页面的任何访问都会导致缓存未命中并提供可怕的性能。我查看了 PTE,发现这些虚拟地址->物理转换的 PCD 位已设置,这意味着这些物理页面上的缓存已禁用。我们尝试在 vma_page_prot 字段中设置 _PAGE_CACHE_WB 并将 remap_pfn_range 与新的 vma_page_prot 一起使用,但 PTE 中仍设置了 PCD 位。
有人知道我们如何确保为该内存启用缓存吗?我不想将 ioremap_cache() 用于 32 MB 的原因是因为 32 位系统上的内核虚拟地址有限,我不想持有它们。
linux - 只能从 ioremap() 内存中读取 0
我正在为 linux 开发一个简单的驱动程序,它将通过 SPI 与设备通信。在我使用 request_mem_region 和 ioremap 之后,即使在我向其写入值之后,我可以从返回的地址读取的所有内容都是 0。偏移量 0 处的地址应该是 SPI 控制器(它是 Xilinx Zynq SoC)的控制寄存器。在引导过程中,控制寄存器被设置为初始值。
代码:
插入模块时的输出是:
驱动程序初始化完成。映射到地址 0xE08C2000
0
提前感谢您的帮助。
arm - 带有 MMU 的 ARM 裸机:写入不可缓存、不可缓冲的映射区域失败
我是 2 核的 ARM Cortex A9 CPU。但我只使用 1 个核心,而另一个只是处于繁忙循环中。我使用部分(每个条目 1MB)设置 MMU 表,如下所示:
这很简单。我只想拥有一个 256MB 内存的镜像,用于不可缓存的访问。但是,当我多次写入 0x95000000-0xa4ffffff 的不可缓存内存部分时。我发现在我明确给出缓存刷新之前实际上并未写入写入。
我做错了什么还是这种映射无效?如果是这样的话,我不明白 Linux 的 ioremap 将如何在 ARM 上运行。如果有人能给我一些解释,那就太好了。非常感谢。
linux - 无 MMU 系统中需要内核驱动程序、ioremap 吗?
所以,当谈到内核驱动程序时,我是一个新手,并且对 ioremap 函数有疑问。
我正在编写一个驱动程序,用于访问具有 ARM Cortex-M3 和 FPGA 结构的 SoC 上的自定义 VHDL 模块中定义的一些寄存器。看一下我认为我应该使用 ioremap 的示例,但由于 Cortex-M3 没有 MMU,我真的不明白这一点,如下例所示:
然后返回,当我安装驱动程序时:
据此,我最好改为读取物理地址。或者这是一个坏主意,我应该以更好的方式弄乱我的寄存器?
linux-kernel - 为什么ioremap分配的区域有这么大的对齐?
我有一个无法调用ioremap()
4M 区域的代码。尝试调试原因,我发现如果您调用ioremap
它,它将尝试分配具有非常大对齐的连续地址(取决于您要分配的区域的大小)。计算这种对齐的代码在__get_vm_area_node()
函数 ( mm/vmalloc.c
) 中,它看起来像这样:
在 ARM 上,IOREMAP_MAX_ORDER
定义为23
. 这意味着在我的情况下,ioremap
不仅需要 4M 的区域连续寻址,vmalloc
而且还必须与 4M 对齐。
我找不到任何关于为什么需要这种对齐的信息。我什至尝试使用 git blame 来查看引入此更改的提交,但似乎代码比 git history 旧,所以我找不到任何东西。
linux - 将虚拟地址映射到物理地址是什么意思?
我正在使用“ioremap”来映射 Ti AM3359 数据表中 GPIO 端口的地址。代码运行良好。
问题:
1>问题是,为什么我们需要将虚拟地址映射到物理地址?是不是因为物理地址是我们要访问的硬件的真实地址?
2> 如果上面是真的那么,为什么数据表不直接给出物理地址。
3> “ioremap”返回的物理地址是否会在不同RAM数量的板上有所不同?
linux-kernel - 如何 IOREMAP X86 - 0x2f8 上的串口?
我正在尝试编写一个 ioremap 内核模块 - X86 PC。该模块将从串口读取值。如何在这里找到 SERIAL_ADDR、SERIAL_SIZE?我的驱动程序是否正确读取端口值?我的代码有问题吗?SERIAL_ADDR 和 SERIAL SIZE 是否由硬件制造商固定?
proc 文件如何知道串行的地址范围 - 0x3f8 到 0x3ff?那么,串口的大小应该是 - (0x3ff - 0x3f8) + 1 即 8 ?SERIAL_SIZE 是 8 对吗?但是,这里的基地址应该是什么?基地址是 0x3f8 吗?对我来说,它看起来不像基地址?我需要 SERIAL_ADDR 吗?请帮忙。
linux-kernel - Linux内存中的漏洞是什么意思?
我遇到过一个术语——Linux 中的内存漏洞。我相信这是 I/O 重新映射的内存。我的理解正确吗?
linux-kernel - ioremap() 中的第二个参数是否给出了寄存器-Linux 的位数大小?
我的 NEC 微控制器有一个 8 位的定时器控制器寄存器 - 我需要在 ioremap 的第二个参数中传递 8 吗?
阅读规范后,我了解了它的以下属性。
所以,我认为Timer寄存器TP0CTL0映射到的物理地址是0xFFFFF590。
现在,我将这个寄存器重新映射如下。阅读更多描述后,我知道该寄存器的大小为 8 位。
规范说“TPnCTL0 寄存器是一个控制 TMPn 操作的 8 位寄存器。”
这是正确的吗?我使用基地址为 0xFFFFF590,这个寄存器的大小是 8 位。因此,我将大小设为 8 位。这是对的吗?ioremap_nocache 的第二个参数是位大小吗?我的以下 API 是否正确?我是否在函数中正确使用了参数 - ioremap_nocache。
无效 *tp0ctl0 = ioremap_nocache(0xFFFFF590, 8);
接下来,我正在执行以下操作 -
请在这里纠正我。如果我根据我拥有的微控制器信息正确使用 API,请告诉我。