内核物理地址和虚拟地址之间的静态映射过程

一:当我们开启了MMU之后,使用的都是虚拟地址,这时就需要考虑物理地址到虚拟地址的映射问题。建立映射表的三个关键部分是:

(1)映射表

(2)映射表建立函数

(3)映射表建立函数被调用

1:映射表

(1)映射表是具体的物理地址和虚拟地址的起始地址定义,在我们前面使用静态映射来操作LED时有介绍,三星版本的移植的内核,其主映射表在arch/arm/plat-s5p/include/plat/map-s5p.h和arch/arm/plat-samsung/include/plat/map-base.h中

arch/arm/plat-s5p/include/plat/map-s5p.h的主要内容如下

arch/arm/plat-samsung/include/plat/map-base.h的主要内容如下:

在这里,我们指定了虚拟地址的基地址,也就是宏S3C_ADDR_BASE  0XFD000000,在我们开启了MMU之后,其映射的虚拟地址都是根据这个基地址+偏移量来得到的某个具体的寄存器的,这样当我们建立了映射之后,就可以直接操作虚拟地址来操作我们对应的寄存器,在这里,也只是映射了需要用到的寄存器的虚拟地址,假如要添加,则只需在map-s5p.h中添加相应的映射即可。

(2)GPIO相关的主映射表位于:arch/arm/machs5pv210/include/mach/regs-gpio.h

GPIO的具体寄存器定义位于:arch/arm/mach-s5pv210/include/mach/gpio-bank.h

需要注意的是,不同版本的内核其映射表的位置是不同的,,但是一般都在arch/arm/xxx/map_xx.h文件中

2:映射表的建立过程

上面,我们介绍了内核通过宏定义定义了很多寄存器对应虚拟地址的基地址,那么这些宏是在哪被调用的呢,映射表又是如何被调用的呢。

答案就是kernel/arch/arm/mach-s5pv210/mach-smdkc110.c中的smdkc110_map_io函数。它的调用层级如下:

smdkc110_map_io

s5p_init_io

iotable_init

iotable_init(s5p_iodesc, ARRAY_SIZE(s5p_iodesc));

iotable_init函数就是最终实现建立虚拟地址映射的函数。其中S5P_iodesc是一个数组,它里面包括了我们上面用大量的宏定义得到的映射表。也就是说我们上面创建的宏都在这里被使用到了。

所以当我们需要添加新的虚拟地址映射时只需要做两步

(1)在我们的map-s5p.h或者是map-base.h中添加相应的宏定义

(2)在我们的s5p_iodesc中添加相应的数组元素

3:映射表建立函数的调用过程

时间: 2024-12-01 17:49:47

内核物理地址和虚拟地址之间的静态映射过程的相关文章

linux物理地址的静态映射

早先看linux驱动相关书籍的时候,隐约记得物理地址有动态映射和静态映射,当时写驱动都是想着自己动手写,所以一上手看着动态映射好用,就在自己的驱动上使用动态映射,将寄存器地址映射到内存上,即调用ioremap函数.在单线作战的时候ioremap确实好用,不需要改动内核的其他部分,直接将自己想用的物理地址映射到内存再操作.但很多时候当我们的设备需要在全局范围内被使用的时候,ioremap就会比较尴尬,其他c文件想要操作该设备的虚拟地址就会比较麻烦,而静态映射就会方便很多. 最近这两天在写一个蜂鸣器

Linux内核访问外设I/O--动态映射(ioremap)和静态映射(map_desc) (转载)

[转](转)Linux内核访问外设I/O资源的方式-静态映射(map_desc)方式 Linux内核访问外设I/O资源的方式 Author: Dongas Date: 08-08-02 我们知道默认外设I/O资源是不在Linux内核空间中的(如sram或硬件接口寄存器等),若需要访问该外设I/O资源,必须先将其地址映射到内核空间中来,然后才能在内核空间中访问它. Linux内核访问外设I/O内存资源的方式有两种:动态映射(ioremap)和静态映射(map_desc). 一.动态映射(iorem

驱动学习之静态映射和动态映射

1:静态映射方法的特点: 内核移植时以代码的形式硬编码,如果要更改必须改源代码后重新编译内核在内核启动时建立静态映射表,到内核关机时销毁,中间一直有效对于移植好的内核,你用不用他都在那里 2:动态映射方法的特点: 驱动程序根据需要随时动态的建立映射.使用.销毁映射映射是短期临时的 3:如何选择虚拟地址映射方法 (1)2种映射并不排他,可以同时使用 (2)静态映射类似于C语言中全局变量,动态方式类似于C语言中malloc堆内存 (3)静态映射的好处是执行效率高,坏处是始终占用虚拟地址空间:动态映射

5.2.14.静态映射操作LED1

静态映射: 不同版本内核中静态映射表位置,文件名可能不同 不同SoC的静态映射表位置,文件名可能不同 所谓映射表其实就是头文件的宏定义 三星版本内核中的静态映射表 主映射表:F:\winshare\kernel\jiuding_kernel\arch\arm\plat-s5p\include\plat\map-s5p.h 虚拟地址基地址:F:\winshare\kernel\jiuding_kernel\arch\arm\plat-samsung\include\plat\map-base.h

在activity之间通过静态变量传递数据

在activity之间通过静态变量传递数据 一.简介 主要作用:解决intent不能传递非序列化的对象 评价:简单方便,不过intent方式更加简单和方便 二.具体操作 1.在传输数据的页面弄好数据,传递给接收数据的页面 Obj1 obj=new Obj1("fry",22); Activity01.obj=obj; 2.在接收数据的页面显示数据 输出obj即可 3.具体代码 传输数据的页面 Intent intent=new Intent();//初始化intent intent.s

SylixOS中DNS静态映射简介

1. DNS功能简介 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,用户能够通过域名访问互联网,而不用去记住IP地址.通过域名得到其对应的IP地址的过程叫做域名解析.每个域名都对应一个IP地址,但一个IP地址可以对应多个域名. 2. SylixOS中DNS静态映射 主机名到IP地址的映射有两种方式: 1) 静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用: 2) 动态映射,建立一套域名

TCP接收/发送滑动窗口与内核接收/发送缓冲区之间的关系

在有关TCP连接的很多配置中,有很多选项有的配置 net.ipv4.tcp_rmem:这个参数定义了TCP接收缓冲(用于TCP接收滑动窗口)的最小值.默认值.最大值 net.ipv4.tcp_wmem:这个参数定义了TCP发送缓冲(用于TCP发送滑动窗口)的最小值.默认值.最大值 netdev_max_backlog:当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包.这个参数表示队列的最大值 rmem_default:这个参数表示内核套接字接收缓存区默认的大小 wmem_d

IPv6 NAT-PT静态映射

1.实验拓扑 2.实现任务 实现R1和R3的互通,其中R2是一个双栈路由,实现IPV4和IPV6的静态映射. 3.实验配置 R1: Router(config)#ipv6 uni Router(config)#int g0/0 Router(config-if)#ipv6 add 1::1/64 Router(config-if)#no shut Router(config-if)#ex Router(config)#ipv6 route ::/0 1::2 //这里要用下一跳地址,如果用出端口

ceph学习笔记之五 Pool与映射过程

Pool Pool是一个抽象的存储池,它规定了数据冗余的类型以及对应的副本分布策略.目前实现了两种Pool类型: Replicated类型和Erasure Code类型.一个Pool由多个PG构成. 对象映射过程 对象映射过程指的是查找对象在集群中分布的位置信息,其过程分为两步: A.对象到PG的映射.这个过程是静态HASH映射(加入PG Split后实际变成了动态HASH映射方式),通过Object_id计算出HASH值, 用该Pool的PG的总数量PG_Num对HASH值取模,就可以获得该对