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

简介:

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

(1)映射表

(2)映射表建立函数

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

1:映射表

(1)映射表是具体的物理地址和虚拟地址的起始地址定义,在我们前面使用静态映射来操作LED时有介绍,三星版本的移植的内核,其主映射表在arch/arm/plat-s5p/include/plat/map-s5p.harch/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:映射表建立函数的调用过程




本文转自 菜鸟养成记 51CTO博客,原文链接:http://blog.51cto.com/11674570/1937462

相关文章
|
6月前
|
存储 程序员 芯片
虚拟地址和物理地址之间的区别
【4月更文挑战第12天】
415 2
虚拟地址和物理地址之间的区别
|
6月前
|
存储
【进程概念】虚拟内存与页表简述
【进程概念】虚拟内存与页表简述
|
6月前
|
存储 算法 Linux
【Linux】线程的内核级理解&&详谈页表以及虚拟地址到物理地址之间的转化
【Linux】线程的内核级理解&&详谈页表以及虚拟地址到物理地址之间的转化
|
6月前
|
存储 缓存 安全
深入理解内存映射:mmap映射的背后原理以及和共享内存的差异
深入理解内存映射:mmap映射的背后原理以及和共享内存的差异
2818 0
|
6月前
|
索引
虚拟地址与物理内存地址是如何映射的
虚拟地址与物理内存地址是如何映射的
|
Linux 定位技术 虚拟化
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
44 0
|
数据库 数据安全/隐私保护 索引
【操作系统】第四章:非连续内存分配(Part1:基于分页-分段的物理/逻辑地址转换)
【操作系统】第四章:非连续内存分配(Part1:基于分页-分段的物理/逻辑地址转换)
170 0
|
Linux
使用mmap将文件映射到虚拟地址空间进行操作
使用mmap将文件映射到虚拟地址空间进行操作
215 0
使用mmap将文件映射到虚拟地址空间进行操作
|
存储 负载均衡 算法
【Linux进程概念——下】验证进程地址空间的基本排布 | 理解进程地址空间 | 进程地址空间如何映射至物理内存(页表的引出) | 为什么要存在进程地址空间 | Linux2.6内核进程调度队列
本文中会介绍很多结构化的知识,我们会通过很多例子里的角色和场景来对一个概念进行定位和阐述,让大家有一个宏观的认识,之后再循序渐进的填充细节,如果你一上来就玩页表怎么映射,那么你可能连页表存在的价值是什么都不知道,最后也只是竹篮打水。
259 0
【Linux进程概念——下】验证进程地址空间的基本排布 | 理解进程地址空间 | 进程地址空间如何映射至物理内存(页表的引出) | 为什么要存在进程地址空间 | Linux2.6内核进程调度队列
|
程序员 索引
《操作系统真象还原》——0.9 物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别
物理地址就是物理内存真正的地址,相当于内存中每个存储单元的门牌号,具有唯一性。不管在什么模式下,不管什么虚拟地址、线性地址,CPU最终都要以物理地址去访问内存,只有物理地址才是内存访问的终点站。
2319 0