• 动态映射和静态映射


    静态映射:

    内核移植时以代码的形式硬编码(代码里已经把它写固定了,即移植的时候已经设计好了要把哪个物理地址映射哪个虚拟地址),如果要更改的话必须改源代码后重新编译内核。开机时调用映射表建立函数,映射表建立函数。该函数根据映射表来建立linux内核的页表映射关系;
    start_kernel
    setup_arch
    paging_init
    devicemaps_init

    if (mdesc->map_io)
    mdesc->map_io();


    对于移植好的内核,在内核启动时建立静态映射表,到内核关机时销毁,中间一直有效;

    静态映射的好处是执行效率高,坏处是始终占用虚拟地址空间;

    所谓映射表其实就是头文件中的宏定义,不同SoC,不同版本内核中静态映射表位置、文件名可能不同。

    动态映射:

    驱动程序根据需要随时动态地建立、使用和销毁映射;

    映射是短期临时的,映射建立时,是要先申请再映射然后使用,使用完要解除映射时要先解除映射再释放申请;

    动态映射的好处是按需使用虚拟地址空间,坏处是每次使用前后都需要用函数去建立映射和销毁映射。如:request_mem_region函数向内核申请(报告)需要映射的内存资源,ioremap函数真正用来实现映射,传给他物理地址他给你映射返回一个虚拟地址,iounmap函数结束映射,release_mem_region函数释资源。

    注:

    二种映射并不排斥,可以同时使用;静态映射类似于C语言中全局变量,动态方式类似于C语言中malloc堆内存。在实际大多数驱动开发工作中用动态还是用静态我们根本不用考虑,因为我们基本都是移植的。

    在驱动开发的过程中需要注意,用户态的测试程序中的读/写函数的本质就是将应用层传递过来的数据先复制到内核中,然后将之以正确的方式写入硬件完成操作。这其实是一件非常复杂的事情,因为内核和应用是工作在不同的地址空间的,且每一个应用程序都有一个自己的虚拟地址空间。对此内核提供了二个函数

    (1)copy_from_user,用来将数据从用户空间复制到内核空间(复制是和mmap的映射相对应去区分的),使用时可以参考内核源代码。需要特别注意的是函数的返回值定义,和常规有点不同。返回值如果成功复制则返回0,如果 不成功复制则返回尚未成功复制剩下的字节数。
    (2)copy_to_user

  • 相关阅读:
    [导入]郎咸平在复旦大学的精彩演讲
    [导入]郎咸平介绍
    [导入]郎咸平网络文摘 在线交流论坛
    Delphi7,创建 RGB CMYK颜色分量圆 完整代码
    Excel分类汇总/平均/计数的办法
    Word插入 分节符实现多个页码
    Delphi 7中如何修改Form1: TForm1;
    在delphi 7里怎么给已有的单元文件改名
    Mac下安装mysql后无法启动,提示. ERROR! The server quit without updating PID file(就是账户权限不够)
    pip虚拟环境下倒出安装文件,或者批量导入安装。
  • 原文地址:https://www.cnblogs.com/zhangshuaifeng/p/10625030.html
Copyright © 2020-2023  润新知