gpt4 book ai didi

linux - 如何在ARM上为虚拟内存选择静态IO内存映射

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:13 33 4
gpt4 key购买 nike

我正在研究如何将 Linux 内核移植到新的 ARM 平台。我注意到某些平台实现在 map_io 函数中具有从物理 IO 地址到虚拟地址的静态映射。

我的问题是我应该如何决定结构map_desc 中的“虚拟”地址?我可以将物理 IO 映射到任意虚拟内存吗?还是有一些规则或良好做法?我检查了 http://lxr.free-electrons.com/source/Documentation/arm/memory.txt , 但没有找到任何答案。

下面是 map_descmap_io 的一些例子:

http://lxr.free-electrons.com/source/arch/arm/mach-versatile/versatile_dt.c#L45

 44 DT_MACHINE_START(VERSATILE_PB, "ARM-Versatile (Device Tree Support)")
45 .map_io = versatile_map_io,
46 .init_early = versatile_init_early,
47 .init_machine = versatile_dt_init,
48 .dt_compat = versatile_dt_match,
49 .restart = versatile_restart,
50 MACHINE_END

http://lxr.free-electrons.com/source/arch/arm/mach-versatile/core.c#L189

189 void __init versatile_map_io(void)
190 {
191 iotable_init(versatile_io_desc, ARRAY_SIZE(versatile_io_desc));
192 }

131 static struct map_desc versatile_io_desc[] __initdata __maybe_unused = {
132 {
133 .virtual = IO_ADDRESS(VERSATILE_SYS_BASE),
134 .pfn = __phys_to_pfn(VERSATILE_SYS_BASE),
135 .length = SZ_4K,
136 .type = MT_DEVICE
137 }, {

最佳答案

评论太长了...

不是专家,但是,因为 map_desc 用于静态映射。它应该来自系统手册。 virtual 是从内核虚拟空间访问外设的方式,pfn(页框号)是页单元的物理地址。

事情是,如果你在内核空间,你正在使用内核虚拟空间映射,所以即使你想访问某个物理地址,你也需要有一个映射,它可以是一对一的,我相信你离开 map_desc。

静态映射是map_desc,动态映射是ioremap。所以如果你想玩物理 IO,ioremap 是第一件事,如果它不起作用,那么对于特殊情况 map_desc。

DMA-API-HOWTO为 Linux 中不同类型的地址映射提供了一个很好的入口点。

关于linux - 如何在ARM上为虚拟内存选择静态IO内存映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29077909/

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