我试图理解未对齐的内存访问(UMA)如何在现代处理器(即x86-64和ARM体系结构)上工作.我知道我可能遇到UMA问题,从性能下降到CPU故障.我阅读posix_memalign并缓存行.
我找不到的是当我的请求超出页面边界时,现代系统/硬件如何处理这种情况?
这是一个例子:
malloc()是一块8KB的内存.malloc()没有足够的内存和sbrk()8KB的话.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书中的很多链接.但它是一个信息的海洋.如果您至少向我提供一些我可以使用的指针或关键字,那将会很棒.
我知道有 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 访问转发到何处时。从第一状态到第二状态的转换是如何完成的?
抱歉问了个纠结的问题。我很困惑。
谢谢。