小编Iva*_*ves的帖子

现代cpus如何处理跨页不对齐访问?

我试图理解未对齐的内存访问(UMA)如何在现代处理器(即x86-64和ARM体系结构)上工作.我知道我可能遇到UMA问题,从性能下降到CPU故障.我阅读posix_memalign并缓存行.

我找不到的是当我的请求超出页面边界时,现代系统/硬件如何处理这种情况?

这是一个例子:

  1. malloc()是一块8KB的内存.
  2. 假设malloc()没有足够的内存和sbrk()8KB的话.
  3. 内核获取两个内存页(每个4KB)并将它们映射到我的进程的虚拟地址空间(假设这两个页面在内存中不是一个接一个)
  4. movq (offset + $0xffc), %rax 我从第4092字节开始请求8个字节,这意味着我需要从第一页末尾开始的4个字节和从第二页开始开始的4个字节.

物理内存:

---|---------------|---------------|-->
   |... 4b|        |        |4b ...|-->
Run Code Online (Sandbox Code Playgroud)

我需要在页面边界分割的8个字节.

x86-64和ARM上的MMU如何处理这个问题?内核MM中是否有任何机制以某种方式为这种请求做准备?是否有某种保护malloc?处理器做什么?他们取两页吗?

我的意思是完成这样的请求MMU必须将一个虚拟地址转换为两个物理地址.它如何处理这样的请求?

如果我是软件程序员,我应该关心这些事情吗?为什么?

我正在阅读谷歌,SO,drepper的cpumemory.pdf和gorman的Linux VMM书中的很多链接.但它是一个信息的海洋.如果您至少向我提供一些我可以使用的指针或关键字,那将会很棒.

linux arm x86-64 memory-alignment mmu

6
推荐指数
1
解决办法
917
查看次数

MMIO是如何初始化的以及CPU如何执行MMIO访问?

我知道有 MMIO,当我读/写 MMIO 地址时,我访问的不是系统内存,而是硬件“内存”。我的问题是MMIO是如何设置的?CPU 如何知道对地址 0x1234 的访问必须发送到硬件(以及哪个硬件?)而不是内存?cpu中是否有硬件寄存器进行映射?谁初始化这些寄存器?像 Das U-Boot 这样的固件?或者总线控制器有预定义的地址吗?也许是在功能规范中定义的“i2c 总线控制器始终位于该处理器的地址 0x1000”之类的内容?

CPU的哪一部分负责MMIO?IIUC MMU 用于虚拟内存,而不是用于 MMIO。

谁(EFI?u-boot?)以及如何告诉CPU地址0x1234处的内存访问必须转发到(例如)PCI设备N?

您能否提供一个现代 ARM(或 x86)架构的示例?

在我看来,CPU 有两种状态:一种是复位后立即,此时 CPU 对硬件一无所知;第二种是当 CPU 充分了解 MMIO 以及将每个 MMIO 访问转发到何处时。从第一状态到第二状态的转换是如何完成的?

抱歉问了个纠结的问题。我很困惑。

谢谢。

memory cpu x86 arm

5
推荐指数
0
解决办法
1807
查看次数

标签 统计

arm ×2

cpu ×1

linux ×1

memory ×1

memory-alignment ×1

mmu ×1

x86 ×1

x86-64 ×1