gpt4 book ai didi

linux - 在不使用 ioremap 或 mmap 的情况下写入 linux 内核中的可缓存物理地址

转载 作者:太空宇宙 更新时间:2023-11-04 11:34:15 27 4
gpt4 key购买 nike

我正在更改 linux 内核调度程序以在已知物理内存位置打印下一个进程的 pid。 mmap 用于用户空间程序,而我读到 ioremap 将页面标记为不可缓存,这会减慢程序的执行速度。我想要一种快速写入已知物理内存的方法。 phys_to_virt 是我认为可行的选项。对不同技术的任何想法。

PS:我在 qemu 上运行这个 linux 内核。 qemu 将使用物理地址来读取客户内核发送的信息。写入已知的 io 端口是不可行的,因为每次访问设备时都会调用支持此 io 设备的设备代码。

编辑:我希望 pid 的物理地址位置是安全的。我怎样才能确保内核正在使用的物理地址没有被分配给任何进程。据我所知,ioremap 会将页面标记为可缓存,因此用处不大。

最佳答案

执行此操作的最简单方法是执行 kmalloc() 以在内核中获取一些内存。然后你可以通过将它传递给 virt_to_phys() 来获取返回指针的物理地址。这是一个彻底的破解,但对于您在 qemu 下调试/跟踪的情况,它应该可以正常工作。

编辑:我误解了这个问题。如果你想使用一个特定的物理地址,你可以做几件事。也许最干净的做法是修改 qemu 传入的 e820 映射以将 RAM 页标记为保留页,然后内核将不会使用它。 (即与传入 ACPI 表的方式相同)。

如果你不想修改 qemu,你也可以修改早期内核启动(大概在 arch/x86/kernel/setup.c 附近)做 reserve_bootmem() 在您要防止被使用的特定物理页面上。

要实际使用指定的物理地址,您只需使用 ioremap_cache(),就像 ACPI 驱动程序访问它们的表一样。

关于linux - 在不使用 ioremap 或 mmap 的情况下写入 linux 内核中的可缓存物理地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9193659/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com