假设我在一个只有 320KB RAM 的嵌入式系统中有一个 x86-64 处理器。那么,我应该使用长模式(64 位模式)还是更喜欢使用实模式(16 位模式)来运行您的程序?
PS~我在博客的评论中看到了这个问题。这就是我掌握的所有信息。
提前非常感谢。
假设我在一个只有 320KB RAM 的嵌入式系统中有一个 x86-64 处理器。那么,我应该使用长模式(64 位模式)还是更喜欢使用实模式(16 位模式)来运行您的程序?
PS~我在博客的评论中看到了这个问题。这就是我掌握的所有信息。
提前非常感谢。
假设我在一个只有 320KB RAM 的嵌入式系统中有一个 x86-64 处理器。那么,我应该使用长模式(64 位模式)还是更喜欢使用实模式(16 位模式)来运行您的程序?
大多数 x86-64 处理器都有几个 MiB 的缓存,并且此缓存可以配置为“回写,不获取”,因此它实际上最终表现得像 RAM。实际上使用 320 KiB 的 RAM 会很愚蠢(不会帮助您存储更多数据,但会比缓存慢);因此,最好降低硬件成本,并且根本不用担心任何 RAM。
实模式不能使用超过 1088 KiB 的“伪装成 RAM 的缓存”,所以这会相当糟糕。长模式需要分页,这可能会花费大约 12 KiB 的内存。
最好的选择可能是 32 位保护模式,因为您可以使用所有“伪装成 RAM 的缓存”而不消耗任何用于分页;但这取决于代码本身和可以从 64 位数据中受益的软件,或者两倍的寄存器将具有比 64 位更高的性能。
请注意,“64 位代码”不需要使用 64 位指针或 64 位数据。“64 位代码”中的大多数指令都是 32 位的(如果您想使用 64 位,则带有大小覆盖前缀)。
这取决于你想做什么:
64 位 Sparc CPU 在 64 位 x86 CPU 之前可用;在此类 CPU 的最常见操作系统之一的程序员文档中,我读过如下内容:
如果你的程序使用小于 3 GB 的内存并且 32 位整数运算就足够了,那么你应该编写 32 位程序,因为内存消耗更少,速度更快。如果您需要 64 位算术,您应该编写 64 位程序,因为使用 32 位指令执行 64 位算术很慢。
所以问题是:你需要 64 位算术吗?
如果要进入长模式,您必须考虑必须使用分页 - 这将花费您额外的内存。
另一方面,实模式意味着您可能必须使用段,这会使您的程序更加复杂——尤其是当您需要 32 位整数运算时。
但是,您也可以使用 32 位(伪)保护模式并关闭分页,并且仅使用“平面”内存布局并且仅使用权限级别 0。
如果要切换到 64 位长模式,则无论如何都必须进入此模式。
那么为什么不永久使用这种模式呢?
我猜是 16 位的,因为 64 位需要更多的 RAM……不太清楚为什么会这样