- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 2GB 内存的设置,我想将 1GB(或更多)物理内存映射到用户空间虚拟地址。这在理论上是可能的,因为使用 32 位设置,3GB 的虚拟地址可供用户陆地应用程序使用。
我用以下参数更新了内核命令行:mem=1G memmap=1G$1G
强制内核查看 1GB RAM 并保留最后 1GB。
我有我的自定义驱动程序,它将处理用户空间 mmap()
调用并使用函数 remap_pfn_range()
将物理地址 0x40000000 (1G) 映射到用户空间地址>.
但是函数在remap_pte_range()
中触发了一个内核BUG()。同一调用过去使用 300MB 重映射而不是 1GB。
我通常在驱动程序中调用ioremap()
将物理地址映射到内核虚拟地址。在这种情况下,我不能因为 1G/3G 虚拟地址拆分(1G 用于内核,3G 用于应用程序)。所以我想知道是否可以将物理地址映射到用户空间虚拟地址而不在内核中映射这些物理地址?
这是一个 32 位 x86 内核,即“i386”架构。
最佳答案
为什么你的remap_pfn_range调用会触发内核BUG()
根据 here 在 remap_pfn_range
中调用 BUG_ON
宏
2277 BUG_ON(addr >= end);
remap_pfn_range
调用 remap_pud_range
,后者调用 remap_pmd_range
,后者调用 remap_pte_range
。
随后从 remap_pmd_range
调用 BUG_ON
或 VM_BUG_ON
here
2191 VM_BUG_ON(pmd_trans_huge(*pmd));
来自remap_pte_range
here
2171 BUG_ON(!pte_none(*pte));
BUG_ON
宏已定义 here
作为
#define BUG_ON(condition) 做 { if (unlikely(condition)) BUG(); } while(0)
上面定义了BUG
宏it打印消息并 panic 。
不太可能
定义了宏 here
as # define unlikely(x) (__builtin_expect(!!(x), 0))
。
所以当目标用户地址开始于addr
大于等于end
时定义为end = addr + PAGE_ALIGN(size);
,BUG_ON返回1,调用BUG。
或者当 pmd_trans_huge
定义为 here
153 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
154 static inline int pmd_trans_splitting(pmd_t pmd)
155 {
156 return pmd_val(pmd) & _PAGE_SPLITTING;
157 }
158
159 static inline int pmd_trans_huge(pmd_t pmd)
160 {
161 return pmd_val(pmd) & _PAGE_PSE;
162 }
163
164 static inline int has_transparent_hugepage(void)
165 {
166 return cpu_has_pse;
167 }
返回 0,当内核中没有配置 CONFIG_TRANSPARENT_HUGEPAGE 或者如果pmd
(页面元数据)值或 & _PAGE_PSE
或者当pte_none
对应的条目不存在时返回1,存在时返回0。
因此 !pte_none
在相应的页表条目不存在时返回 0,否则返回 1 作为传递给 BUG_ON
的条件。
如果页表条目已经存在,则会调用 BUG
宏。
如果您指定的内存量小于 !GB 且大于 300MB,比如 500MB 或 800MB,会发生什么情况?
所以要么你的起始地址大于你的结束地址,要么你的 CONFIG_TRANSPARENT_HUGEPAGE
没有在内核中配置,或者你指的是页面元数据不存在或页表条目已经存在.
从评论中澄清,您对 remap_pfn_range
的调用引用了已经指向页表条目或 pte
*pte
.
这意味着 set_pte_at(mm, addr, pte, pte_mkspecial(pfn_pte(pfn, prot)));
会失败,因为 pte 指针已经指向页表条目,因此不能设置为 pte
即 pte_mkspecial(pfn_pte(pfn, prot))
。
绕过1G/3G虚拟地址分割
请参阅以下文章 High Memory In The Linux Kernel
请参阅以下邮件列表 post ,其中讨论了一些关于至少 1GB RAM 的 HIGHMEM 的附加信息。
关于将内核和非内核虚拟地址空间映射到用户空间的信息
将内核虚拟地址和非内核(由 vmalloc() 返回)虚拟地址映射到用户空间的一种方法是使用 remap_pfn_range
。参见 Linux Memory Mapping了解更多信息。
在旧内核上替代 nopage 处理程序的另一种方法是 vm_insert_page
函数
其他资源包括:
关于c - 如何在 32 位 Linux 内核下映射 1GB(或更多)的物理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9638035/
我一直在寻找游戏/模拟解决方案,以便在时间流逝时寻找距离,但这不是我要找的。 我正在寻找一个 O(1) 公式来计算(0 或 1 或 2)时钟时间,其中两个圆圈彼此之间的距离恰好为 r1+r2。负时间是
我究竟做错了什么? > crossprod(1:3,4:6) [,1] [1,] 32 根据本网站:http://onlinemschool.com/math/assistance/ve
嗨,我目前正在为类开发一个迷你游戏(第一次做这样的事情),我根本不知道如何开始碰撞检测。好吧,我正在创建的游戏是一款在冰冷的圆形竞技场上自上而下的相扑格斗游戏,您可以四处移动以获得动力和速度,并尝试击
这段代码取自使用 XNA 框架构建的游戏。我想从三角学和物理学的角度解释一下它是如何工作的。 ball.velocity = new Vector2((float)Math.Cos(cannon.ro
因此,我正在努力自学 Canvas (HTML5) 并编写了大部分简单的游戏引擎代码。它是空间场景(行星、恒星、天体等)的二维表示。我的默认“Sprite”类有一个像这样的帧监听器: “baseCla
这个问题在这里已经有了答案: Are the physical memory addresses of an array also stored in order like the virtual o
我正在尝试阅读英特尔软件开发人员手册以了解操作系统的工作原理,这四个寻址术语让我感到困惑。以上是我的理解,如有不对请指正。 线性地址 : 对一个孤立的程序来说,似乎是一长串以地址0开头的内存。该程序的
我尝试在 AndEngine 示例包中复制并粘贴物理示例。 没有出现错误,但当我运行它时,模拟器显示“不幸的是,PhysicsActivity 已停止”。 模拟器使用 API 15,GPU 已开启,磁
当我运行此代码时,第一行 CollisionWithplayer 给了我一个错误的指令错误。该错误不会每次都会出现,只是偶尔出现一次,并且没有类似的条件来确定导致该错误的原因。 func didBeg
您好,我有以下 Canvas 应用程序:http://dev.driz.co.uk/canvas/ 正如您将看到的,它渲染了一堆球。我遇到的问题是当应用程序首次启动时,球被 Canvas 边缘切断。他
我有两个 3d 物理 vector ,带有 (x,y,z) 和方向。我想对它们做一些操作。但我有一些问题: 我应该如何在 C++ 中表示这个 vector ?换句话说,我在下面写了类,但我不知道如何表
我有一个有 body 的 Sprite 。我想通过路径移动 Sprite 。我已经尝试使用 PathModifier 执行此操作, Sprite 会按原样移动,但它的 body 不会跟随 Sprite
我开发了类似投币推土机的游戏。为了硬币的平稳移动,我为每个硬币添加了一种物理 Material ,但这样做之后我的游戏速度非常慢。有没有其他选择,或者我如何在不使用物理 Material 的情况下使硬
我正在开发一款简单的平台游戏,例如 super 马里奥。我将 Java 与 LibGdx 引擎一起使用。我的物理问题与帧率无关。在我的游戏中,角色可以跳跃,跳跃高度显然取决于帧率。 在我的桌面上,游戏
我正在开发一个可能包含数学、物理和化学符号的问答应用程序,因为这是一个实时游戏应用程序,每次问题将从服务器下载并针对特定主题显示。它需要是一个原生的 Android 应用程序,并且性能非常重要(两人游
我的任务是编写一个对象,该对象可以接收不同类型的路径/url,并返回它是什么类型的路径/url。例如路径可以是 1. [drive]:\Temp 2. \\Temp 3. Temp (assuming
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
注意:当我提到层时,我指的是物理层。此站点上与“层”相关的许多问题都指的是逻辑层,这不是我要问的。 我正在设计一个使用标准“3 层”架构的应用程序,包括表示层、业务逻辑 (BLL) 层和数据访问层 (
如何检查设备上的屏幕或物理/电容式导航按钮 最佳答案 您可以使用 ViewConfiguration.get(context).hasPermanentMenuKey() 仅适用于 API 级别 14
我在我的 android 游戏中使用 AndEngine,我从 github 下载了主 AndEngine,但是没有主的 Physics Box2D 扩展。我不知道在哪里下载它或我可以使用它的哪个版本
我是一名优秀的程序员,十分优秀!