更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_vm_zone.h
浏览该文件的文档.
1/*!
2 * @file los_vm_zone.h
3 * @brief
4 * @link
5 @verbatim
6 虚拟地址空间全景图 从 0x00000000U 至 0xFFFFFFFFU ,外设和主存采用统一编址方式 @note_pic
7 鸿蒙源码分析系列篇: http://weharmonyos.com | https://my.oschina.net/weharmony
8
9 +----------------------------+ 0xFFFFFFFFU
10 | IO设备未缓存 |
11 | PERIPH_PMM_SIZE |
12 +----------------------------+ 外围设备未缓存基地址 PERIPH_UNCACHED_BASE
13 | IO设备缓存 |
14 | PERIPH_PMM_SIZE |
15 +----------------------------+ 外围设备缓存基地址 PERIPH_CACHED_BASE
16 | 包括 IO设备 |
17 | PERIPH_PMM_SIZE |
18 +----------------------------+ 外围设备基地址 PERIPH_DEVICE_BASE
19 | Vmalloc 空间 |
20 | 内核栈 内核堆 |内核动态分配空间
21 | 128M |
22 | 映射区 |
23 +----------------------------+ 内核动态分配开始地址 VMALLOC_START
24 | DDR_MEM_SIZE |
25 | Uncached段 |
26 +----------------------------+ 未缓存虚拟空间基地址 UNCACHED_VMM_BASE = KERNEL_VMM_BASE + KERNEL_VMM_SIZE
27 | 内核虚拟空间 |
28 | mmu table 临时页表 |临时页表的作用详见开机阶段汇编代码注释
29 | .bss |Block Started by Symbol : 未初始化的全局变量,内核映射页表所在区 g_firstPageTable,这个表在内核启动后更新
30 | .data 可读写数据区 |
31 | .rodata 只读数据区 |
32 | .text 代码区 |
33 | vectors 中断向量表 |
34 +----------------------------+ 内核空间开始地址 KERNEL_ASPACE_BASE = KERNEL_VMM_BASE
35 | 16M预留区 |
36 +----------------------------+ 用户空间栈顶 USER_ASPACE_TOP_MAX = USER_ASPACE_BASE + USER_ASPACE_SIZE
37 | |
38 | 用户空间 |
39 | USER_ASPACE_SIZE |
40 | 用户栈区(stack) |
41 | 映射区(map) |
42 | 堆区 (heap) |
43 | .bss |
44 | .data .text |
45 +----------------------------+ 用户空间开始地址 USER_ASPACE_BASE
46 | 16M预留区 |
47 +----------------------------+ 0x00000000U
48
49 以下定义 可见于 ..\vendor\hi3516dv300\config\board\include\board.h
50
51 在liteos_a中, KERNEL_VADDR_BASE 是一个很常用的地址, 可以叫内核的运行起始地址
52 内核的运行地址就是内核设计者希望内核运行时在内存中的位置,这个地址在内核源码中有地方可以配置,
53 并且链接脚本里也会用到这个地址,编译代码时所用到的跟地址相关的值都是以内核运行基址为基础进行计算的。
54 在liteos_a中,内核运行基址是在各个板子的board.h中配置的
55
56
57 #ifdef LOSCFG_KERNEL_MMU
58 #ifdef LOSCFG_TEE_ENABLE
59 #define KERNEL_VADDR_BASE 0x41000000
60 #else
61 #define KERNEL_VADDR_BASE 0x40000000
62 #endif
63 #else
64 #define KERNEL_VADDR_BASE DDR_MEM_ADDR
65 #endif
66 #define KERNEL_VADDR_SIZE DDR_MEM_SIZE
67
68 #define SYS_MEM_BASE DDR_MEM_ADDR
69 #define SYS_MEM_END (SYS_MEM_BASE + SYS_MEM_SIZE_DEFAULT)
70
71 #define EXC_INTERACT_MEM_SIZE 0x100000
72
73 内核空间范围: 0x40000000 ~ 0xFFFFFFFF
74 用户空间氛围: 0x00000000 ~ 0x3FFFFFFF
75
76 cached地址和uncached地址的区别是
77 对cached地址的访问是委托给CPU进行的,也就是说你的操作到底是提交给真正的外设或内存,还是转到CPU缓存,
78 是由CPU决定的。CPU有一套缓存策略来决定什么时候从缓存中读取数据,什么时候同步缓存。
79 对unchached地址的访问是告诉CPU忽略缓存,访问操作直接反映到外设或内存上。
80 对于IO设备一定要用uncached地址访问,是因为你的IO输出操作肯定是希望立即反映到IO设备上,不希望让CPU缓存你的操作;
81 另一方面,IO设备的状态是独立于CPU的,也就是说IO口状态的改变CPU是不知道,这样就导致缓存和外设的内容不一致,
82 你从IO设备读取数据时,肯定是希望直接读取IO设备的当前状态,而不是CPU缓存的过期值。
83
84 @endverbatim
85 * @version
86 * @author weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
87 * @date 2021-11-30
88 */
89/*
90 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
91 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
92 *
93 * Redistribution and use in source and binary forms, with or without modification,
94 * are permitted provided that the following conditions are met:
95 *
96 * 1. Redistributions of source code must retain the above copyright notice, this list of
97 * conditions and the following disclaimer.
98 *
99 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
100 * of conditions and the following disclaimer in the documentation and/or other materials
101 * provided with the distribution.
102 *
103 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
104 * to endorse or promote products derived from this software without specific prior written
105 * permission.
106 *
107 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
108 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
109 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
110 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
111 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
112 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
113 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
114 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
115 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
116 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
117 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
118 */
119
120#ifndef __VM_ZONE_H__
121#define __VM_ZONE_H__
122
123#include "target_config.h"
124
125#ifdef __cplusplus
126#if __cplusplus
127extern "C" {
128#endif /* __cplusplus */
129#endif /* __cplusplus */
130
131
132
133#ifdef LOSCFG_KERNEL_MMU //
134#ifdef LOSCFG_TEE_ENABLE
135#define KERNEL_VADDR_BASE 0x41000000 //用于链接器层面的宏配置 | 基地址
136#else
137#define KERNEL_VADDR_BASE 0x40000000
138#endif
139#else //没有MMU时,内核运行基址 = 内存的基地址,因为没有了MMU,所以也没有了虚拟内存和物理内存的说法,统一就是物理内存.
140#define KERNEL_VADDR_BASE DDR_MEM_ADDR ///< 内核运行基址 等于内存( Double Data Rate SDRAM)基地址
141#endif
142#define KERNEL_VADDR_SIZE DDR_MEM_SIZE ///< 真实主存的大小
143
144#define SYS_MEM_BASE DDR_MEM_ADDR ///< 物理内存基地址
145#define SYS_MEM_END (SYS_MEM_BASE + SYS_MEM_SIZE_DEFAULT) ///< 物理内存结束地址
146
147
148#define _U32_C(X) X##U
149#define U32_C(X) _U32_C(X)
150
151#define KERNEL_VMM_BASE U32_C(KERNEL_VADDR_BASE) ///< 内核内存管理层面的宏配置 | 基地址
152#define KERNEL_VMM_SIZE U32_C(KERNEL_VADDR_SIZE) ///< 内核大小
153
154#define KERNEL_ASPACE_BASE KERNEL_VMM_BASE ///< 内核运行空间层面的宏配置 | 基地址
155#define KERNEL_ASPACE_SIZE KERNEL_VMM_SIZE ///< 内核空间大小
156
157/* Uncached vmm aspace */
158#define UNCACHED_VMM_BASE (KERNEL_VMM_BASE + KERNEL_VMM_SIZE) ///< 未缓存虚拟空间基地址,适用于DMA,LCD framebuf,
159#define UNCACHED_VMM_SIZE DDR_MEM_SIZE ///<未缓存虚拟空间大小
160
161#define VMALLOC_START (UNCACHED_VMM_BASE + UNCACHED_VMM_SIZE) ///< 内核堆空间基地址
162#define VMALLOC_SIZE 0x08000000 ///< 内核堆空间大小, 128M
163//UART,LCD,摄像头,I2C,中断控制器统称为外部设备, 统一编址
164#ifdef LOSCFG_KERNEL_MMU //使用MMU时,只是虚拟地址不一样,但映射的物理设备空间一致.
165#define PERIPH_DEVICE_BASE (VMALLOC_START + VMALLOC_SIZE) ///< 不使用buffer,cache
166#define PERIPH_DEVICE_SIZE U32_C(PERIPH_PMM_SIZE)
167#define PERIPH_CACHED_BASE (PERIPH_DEVICE_BASE + PERIPH_DEVICE_SIZE) ///< 使用cache但不用buffer
168#define PERIPH_CACHED_SIZE U32_C(PERIPH_PMM_SIZE)
169#define PERIPH_UNCACHED_BASE (PERIPH_CACHED_BASE + PERIPH_CACHED_SIZE) ///< 不使用cache但使用buffer
170#define PERIPH_UNCACHED_SIZE U32_C(PERIPH_PMM_SIZE)
171#else //不使用MMU时,外部设备空间地址一致.
172#define PERIPH_DEVICE_BASE PERIPH_PMM_BASE
173#define PERIPH_DEVICE_SIZE U32_C(PERIPH_PMM_SIZE)
174#define PERIPH_CACHED_BASE PERIPH_PMM_BASE
175#define PERIPH_CACHED_SIZE U32_C(PERIPH_PMM_SIZE)
176#define PERIPH_UNCACHED_BASE PERIPH_PMM_BASE
177#define PERIPH_UNCACHED_SIZE U32_C(PERIPH_PMM_SIZE)
178#endif
179
180#define IO_DEVICE_ADDR(paddr) ((paddr) - PERIPH_PMM_BASE + PERIPH_DEVICE_BASE) ///< 通过物理地址获取IO设备虚拟地址
181#define IO_CACHED_ADDR(paddr) ((paddr) - PERIPH_PMM_BASE + PERIPH_CACHED_BASE) ///< 通过物理地址获取IO设备虚拟缓存地址
182#define IO_UNCACHED_ADDR(paddr) ((paddr) - PERIPH_PMM_BASE + PERIPH_UNCACHED_BASE) ///< 通过物理地址获取IO设备虚拟未缓存地址
183//DDR_MEM_ADDRDDR内存全称是DDR SDRAM(Double Data Rate SDRAM,双倍速率SDRAM)
184
185#define MEM_CACHED_ADDR(paddr) ((paddr) - DDR_MEM_ADDR + KERNEL_VMM_BASE)
186#define MEM_UNCACHED_ADDR(paddr) ((paddr) - DDR_MEM_ADDR + UNCACHED_VMM_BASE)
187
188#define VMM_TO_UNCACHED_ADDR(vaddr) ((vaddr) - KERNEL_VMM_BASE + UNCACHED_VMM_BASE)
189#define UNCACHED_TO_VMM_ADDR(vaddr) ((vaddr) - UNCACHED_VMM_BASE + KERNEL_VMM_BASE)
190
191#define VMM_TO_DMA_ADDR(vaddr) ((vaddr) - KERNEL_VMM_BASE + SYS_MEM_BASE)
192#define DMA_TO_VMM_ADDR(vaddr) ((vaddr) - SYS_MEM_BASE + KERNEL_VMM_BASE)
193
194#if (PERIPH_UNCACHED_BASE >= (0xFFFFFFFFU - PERIPH_UNCACHED_SIZE))
195#error "Kernel virtual memory space has overflowed!"
196#endif
197
198#ifdef __cplusplus
199#if __cplusplus
200}
201#endif /* __cplusplus */
202#endif /* __cplusplus */
203
204#endif