zoukankan      html  css  js  c++  java
  • 虚拟地址映射机制--动态、静态

    静态映射: 
    内核移植时,以代码的形式硬编码,如果需要更改,必须改源码并重新编译内核
    在内核启动时建立静态映射表,到内核关闭时销毁。
    除非更改并重新编译,否则只要内核启动,静态映射表就一直存在且不发生变化

    静态映射表的建立过程
    (1)映射表描述。
    linux/arch/arm/plat-s5p/cpu.c中的s5p_iodesc[]结构体数组
    (2)映射表建立函数。该函数负责根据(1)中的映射表来建立linux内核的页表映射关系。
    kernel/arch/arm/mach-s5pv210/mach-smdkc110.c smdkc110_map_io函数
    smdkc110_map_io
    s5p_init_io
    iotable_init
    结论:静态映射表本质上是一个结构体数组,数组中的每一个元素就是一个映射,
    描述了物理地址和虚拟地址之间的映射。这个结构体数组记录的映射关系被 iotable_init所使用,该函数负责将这个结构体数组格式的表建立成MMU所能
    识别的页表映射关系。以此达到开机后直接使用虚拟地址来访问物理地址。
    (3)开机时调用映射表建立函数

    动态映射:
    驱动程序根据需要随时动态的建立、使用、销毁映射。
    动态映射是随机的、临时的、每一次建立都可能不一样
    选择虚拟地址映射的方法:
    1、两种映射可以同时使用。就如:去学校可以选择有多种路线,但指向的最终目的地都是一个
    2、静态映射类似于C语言中的全局变量(一旦分配作用周期就是内核运行的全过程),
    动态映射类似于C语言中的malloc堆内存(用到就分配,用完就释放,)
    3、静态映射的好处是执行效率高,坏处是始终占用虚拟地址空间;
    动态映射的好处是按需使用虚拟地址空间,
    坏处是每次使用前后都需要代码去建立&&销毁映射
    动态映射的建立:
    (1).request_mem_region,//向内核申请需要的内存资源
    (2).ioremap,//真正实现映射,传给他物理地址返回一个对应的虚拟地址
    销毁动态映射
    (1).iounmap

  • 相关阅读:
    两数交换不借助第三变量
    linux磁盘文件系统管理
    Fedora15设置开机进入终端模式
    快速构建Windows 8风格应用8贴靠视图
    快速构建Windows 8风格应用6GridView数据控件
    快速构建Windows 8风格应用4FlipView数据控件
    快速构建Windows 8风格应用9竖直视图
    快速构建Windows 8风格应用1开发工具安装及模拟器使用
    快速构建Windows 8风格应用5ListView数据控件
    快速构建Windows 8风格应用2创建调试应用
  • 原文地址:https://www.cnblogs.com/embeded-linux/p/11108930.html
Copyright © 2011-2022 走看看