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

标签 linux kernel arm

我正在研究如何将 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/

相关文章:

c - linux 上的 mmap 错误(使用其他东西)

c - 从 Linux 内核模块的文件描述符获取文件名/路径?

c++ - Windows 驱动程序 IOCTL 代码蓝屏/使计算机崩溃

gcc - 交叉编译 : GCC ignores --sysroot

architecture - 抢占和上下文切换的区别

linux - 去/geany : configure build command

linux - 内核模块到以太网数据包回显

linux - 我在哪里可以获得 Windows `--shared` 命令的 `git init` 选项的描述?

ruby-on-rails - 在 arm 系统中安装 rails 的问题

c - 内核如何使用task_struct?