什么时候在ARM板上安装操作系统?调用端口的地址会映射到真实地址还是虚拟地址?

Posted

技术标签:

【中文标题】什么时候在ARM板上安装操作系统?调用端口的地址会映射到真实地址还是虚拟地址?【英文标题】:When operating system is installed on ARM board ? Calling the address of port will map to real address or virtual address? 【发布时间】:2016-08-24 13:40:51 【问题描述】:

我打算在我的 ARM 板上安装操作系统以获得额外的功能,如内存管理、文件系统等。 例如,如果我想向端口 x 写入一个值以使 LED 闪烁,我可以在没有 OS 的情况下写入 (int*)0x00458=1 。但是如果使用操作系统,如果我写相同的 (int*)0x00458=1 。 内存将是用户空间虚拟内存或实际内存地址。 抱歉,我不知道如何表达我的问题,请原谅我。 我的目标是在我的 ARM 板上安装操作系统并在不使用驱动程序库的情况下编写 LED 闪烁程序。

【问题讨论】:

如果你启用了MMU,你需要将0x00458所在的物理页面映射到你想要使用LED的程序的地址空间。然后你可以让 LED 随心所欲地闪烁。 @Bhav 还注意到大多数操作系统通常不允许用户模式应用程序使用设备 I/O,您可能需要编写内核驱动程序/模块来向用户模式应用程序公开接口 @FUZxxl 如果您知道任何链接来学习如何做这些事情,请分享。提前致谢 @AdrianoRepetti 那么这些实时应用程序如何与 RTOS 一起运行。我会得到任何现成的驱动程序吗? 你在板上安装了哪个操作系统? 【参考方案1】:

这取决于操作系统,在 linux 中,您可以使用 mmap 请求操作系统为您映射一个具有权限的孔,以便从应用层穿透到该物理地址。

Windows 有 I/O 方面的优势,并且可能是一种编写内核驱动程序以通过内存映射 I/O 进行穿透的方法。

它在很大程度上依赖于操作系统,因此您需要查看您的操作系统。您标记了 linux,所以从 mmap 开始,应该已经有一些示例说明如何在 *** 答案中执行此操作。与其他地方一样,只需要几行代码即可获取指针(请注意,请求更大的空间,例如 0x10000000 字节比 0x1000 字节更有可能获得指针)。

【讨论】:

是的,地址是虚拟的,操作系统(当然是 linux 和 windows)使用 mmu,因此您将获得一个虚拟地址,该地址映射到您所需的物理地址,并具有您的权限。请注意,如果您的东西在 0x12345678,作为 0x10000000 的 mmap,大小为 0x10000000,然后访问返回的指针+0x02345678,不要要求 0x12345678,也不要要求 4 个字节的价值。 这种方法我用过无数次了。【参考方案2】:

因为您想将 1 写入内存,所以 (int*)0x00458=1 不正确。

你必须使用

*(volatile int*)0x00458=1 

写入内存: 使用 volatile 防止编译器优化你的代码。

这用于在端口地址 0x65 上点亮 LED,例如:

#include <stdint.h>
while (1)

    //PORTG^=1;
    *(volatile uint32_t*)0x65 ^= 1;
    //delay

无论有没有操作系统,这条指令都会编译成正确的汇编代码。 os 的唯一说明是: 如果您的 ARM CPU 已经重新映射地址,您必须找到新地址,此指令再次正确。有关您的操作系统的详细信息,您可以阅读 os 文档。 希望这会有所帮助。

【讨论】:

以上是关于什么时候在ARM板上安装操作系统?调用端口的地址会映射到真实地址还是虚拟地址?的主要内容,如果未能解决你的问题,请参考以下文章

我想通过minicom使用gdb在arm板上调试vmlinux。我需要做什么?

linux驱动ARM学习环境搭建

Win32工程怎么部署到ARM9开发板上

ARM开发板上iconv调用失败的解决方法

如何将用QT做好的播放器移植到ARM开发板上

怎样交叉编译QT程序使之能在目标板上运行!?