问题标签 [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 - ioremap - 无法在虚拟地址 XXXXXXXX 处处理内核分页请求
我正在尝试访问 Linux 中 am335x 处理器上的给定内存区域。这个想法是首先指定物理地址,然后使用ioremap
. 我已经在谷歌上搜索了一段时间,但似乎找不到任何好的解决方案。
执行这些任务的函数如下:
获取物理地址的函数:
注册虚拟地址的功能:
这里regArray[]
只是一个包含所有相关物理地址的数组,结构体regref
的定义方式如下:
代码确实可以编译,但是当我尝试加载它时,我最终收到以下错误:
地址可能会有所不同。
我认为我做错了什么,但看不到究竟是什么。当然,代码也可以更好,但我想在进行进一步更改之前解决这个问题。有没有人有什么建议?
mmap - 你能映射(用户)和ioremap_nocache(内核)相同的物理地址吗?
你能 mmap (user) 和 ioremap_nocache (kernal) 相同的物理地址说 fpga 吗?
linux-kernel - 保留系统内存,ioremap()?
调用ioremap()
系统 DRAM 是不是很糟糕。我想在系统 DRAM 中保留一个不会被任何其他进程使用的空间。这会是这样做的方法吗?我知道 DRAM 实际上不是 IO 内存,所以我不确定这是否被认为是不好的做法。
linux-kernel - 写入物理内存地址的数据发生意外变化
平台是MIPS,内核是linux 2.6.31。
首先,我在 64M 的总 RAM 中保留了 8M RAM 区域,因此内核仅使用 56M RAM 区域。其次,我使用该ioremap()
函数将物理地址转换为内核中的虚拟地址,然后写入我的数据。像这样:
然后我读取uboot中的数据:保持电源,重启系统,我进入uboot。Uboot使用的是物理地址,所以我从0x83800000开始读取数据。问题出在:0x83800000(0M)处,1字节数据错误,0x83c00000(4M)处,1字节数据错误,0x84000000(8M)处,1字节数据错误。但是其余的数据都是对的,和buf一样!!这么奇怪!!不知道是什么原因,谁能帮帮我?谢谢...
linux - 列出内核中的 ioremap() 映射地址
您可能知道,可以使用 /proc/$pid/maps 为用户空间应用程序列出所有映射的物理地址及其受尊重的虚拟地址
有没有办法做同样的事情并找到所有映射的物理地址的虚拟地址,由内核空间中的 ioremap() 映射?(假设我们可以在内核空间中运行代码。)
memory-management - 在内核内存启动时间保留上使用 ioremap
首先我必须承认我是一个新手。所以请不要对我太苛刻。我想在启动时保留内存,然后在内核模块中使用这个内存,以确保这个模块是唯一使用这个空间的模块。我会这样:将 mem= 和 memmap= 添加到 kerenl 参数以在启动时保留内存。我的问题从这里开始:
- 如果我在我的模块代码中的这个空间上使用ioremap,它可以在其他模块中访问吗?还是其他内核子系统仍然看不到它?
- 第二个问题:我怎么能确定这个保留的内存永远不会移动到交换空间?
- 第三个:我怎样才能像块设备一样访问这个内存?我的意思是像 /dev/sda 或......
c - 使用 ioremap 从 MTD 闪存读取块
我想知道从 MTD 闪存读取块数据的预期结果,按照以下代码:
那么这段代码会将读取的数据写入物理内存地址0x80000000
吗?还是将数据放在指针dst中?我在哪里可以找到物理内存中的读取数据(memory address
例如使用 gdb x/16x)?
linux-device-driver - 使用 remap_pfn_range 将引导时的保留内存映射到用户空间
我正在尝试使用remap_pfn_range在启动时(启动内核参数mem = 2G memmap = 30M $ 2G)将保留内存(30M,偏移量为2G)映射到用户空间,下面是我的驱动程序代码:
我的用户空间应用程序在下面
当我插入模块时它返回
但是当我执行用户空间应用程序时它返回错误
linux - 为什么我不应该在 ARMv6+ 的系统内存上使用 ioremap?
我需要从内核中保留大量物理上连续的 RAM 缓冲区,并且能够保证该缓冲区将始终使用特定的硬编码物理地址。这个缓冲区应该为内核的整个生命周期保留。我已经编写了一个 chardev 驱动程序作为在用户空间中访问此缓冲区的接口。我的平台是一个带有 ARMv7 架构的嵌入式系统,运行 2.6 Linux 内核。
Linux Device Drivers, Third Edition的第 15 章有以下关于该主题的内容(第 443 页):
保留 RAM 的顶部是通过
mem=
在引导时向内核传递一个参数来完成的。例如,如果您有 256 MB,则该参数mem=255M
会阻止内核使用最高兆字节。您的模块稍后可以使用以下代码来访问此类内存:dmabuf = ioremap (0xFF00000 /* 255M */, 0x100000 /* 1M */);
我已经做到了,还有其他几件事:
memmap
除了那个之外,我还在使用bootargmem
。内核引导参数文档建议在使用时始终使用memmap
以mem
避免地址冲突。- 我
request_mem_region
在调用之前使用过ioremap
,当然,我在继续之前检查它是否成功。
这是我完成所有这些后系统的样子:
到目前为止一切看起来都不错,我的驱动程序运行良好。我可以直接读写我选择的特定物理地址。
然而,在启动过程中,触发了一个可怕的警告( ™<sup>):
这究竟会导致什么问题?它们可以减轻吗?我的替代方案是什么?
c - 使用 writel 将 4 位写入 ioremap-ed 内存地址
我是内核编程的新手,现在尝试将一些值写入设备驱动程序中的 32 位 GPIO 寄存器。I/O 被ioremap()
编辑到一个内存地址。问题是,我不知道writel()
//如何将writeb()
位writew()
写入地址。
供应商文件说登记在上0xE5200000
。我必须写入的位是[0:3]
位,并将剩余的 28 位([4:31]
位)保留为零。
这是迄今为止我编写的设备驱动程序代码的一部分:
上面的代码对你们来说可能是彻头彻尾的胡言乱语,但我不熟悉write(l|w|b)
and ioremap()
。
所以我的问题是:
- 我是否正确地将这些
[0:4]
位映射到 TIMER_CON_ADDR? - 如果没有,我该如何正确映射它们?
- 正确映射 4 位后,如何使用任何
write(1|w|b)
函数以正确的顺序将位 (0100
) 写入 TIMER_CON_ADDR? - 在引擎盖下做什么
write(l|w|b)
来写入位? - 有没有我错过/弄错的信息?
感谢您提前提供的所有帮助。