在使用静态映射和动态映射时,出现错误

在使用静态映射和动态映射时,出现错误

Q:在使用静态映射和动态映射时,出现错误?

动态映射出来的虚拟地址只对 cpu 访问有效,其他 dma 控制器对虚拟地址是不可见的,一块内存如果不是 cpu 读取则必须平板映射(静态映射)
如果只是 dma 访问的话,直接访问物理地址就行,不需要映射。

Cpu 和 dma 都会访问的内存空间,前一部分让 cpu 访问,后一部分让dma访问

动态映射:API_VmmIoRmapNocache 要求页对齐
eg:atVirtBase = (addr_t)API_VmmIoRmapNocache(0x8000000,0x4000e)
if(atVirtBase == 0){
printk("ioRemap addr error.\n");
return PX_ERROR;
}
printk("Vir addr:%x",atVirtBase);
映射出来的地址是0xe0003000

用动态映射,dma 直接访问物理地址,cpu 访问映射后的地址
dma直接访问 0x8000000 cpu 访问 0xe0003000


更多扩展知识见:
《SylixOS设备驱动程序开发》 第7章 Cache与MMU管理 


    • Related Articles

    • SylixOS 动态库更新 version 不一致的问题

      Q:SylixOS 动态库更新 version 不一致的问题 首先 SylixOS 是允许多个进程对共享库文件进行代码段共享的(默认是共享打开的,可以使用 dlconfig share dis 命令进行关闭),代码段共享会出现一个问题:当 A  进程 使用一个 share.so 共享库的时候,B 进程也使用 该 share.so 的共享库,share.so 共享库因为 B 的原因需要修改,修改后,更新share.so文件,然后重启 B 进程,一般来说会出现错误,错误如下: ...
    • 找不到符号 can not find symbol:xxx 分析之一(误操作输入错误函数名称)

      找不到符号 can not find symbol:xxx 分析之一(误操作输入错误函数名称) Q:使用RealEvo-IDE(以下简称IDE)开发程序时,误操作输入错误的函数名称时,编译器不会报错,输入错误的函数名示例代码如程序清单 1.1所示。 程序清单 1.1 示例代码 #include <stdio.h> int main (int argc, char **argv) { print("Hello World!\n"); return (0); } 控制台输出编译结果如 图 ...