添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

2.1.2 内存转换粒度 . 6

2.1.3 Address Translation Stage 8

2.1.4 描述符格式 (descriptor format) 9

2.1.5 描述符内存属性 . 11

2.2 VMSAv8-32 . 11

2.2.1 地址转换系统 . 11

2.2.2 转换表支持 . 12

2.2.3 描述符格式 . 12

2.2.4 描述符内存属性 . 13

2.3 TTW( 地址转换流程 ) . 14

2.3.1 VMSAv8-64 14

2.3.2 VMSAv8-32 16

3 MMU Fault 19

3.1 故障类型 ... 19

3.2 Kernel 如何处理读取空指针? ... 19

3.2.1 ARM 发生了什么? . 19

3.2.1 Kernel 如何处理? . 20

4 Vmalloc 22

4.1 简介 ... 22

4.2 基本流程 ... 22

4.3 代码实现分析 ... 23

5 Linux 虚拟内存布局 . 27

5.1 User 内存布局 ... 27

5.1.1 Mem mapping 内存分配方式 (64 ) 28

5.2 Kernel 内存布局 ... 29

5.2.1 ARM64 内核内存布局 . 29

5.3 各内存域和物理内存映射关系 ... 31

1 分级存储架构

1.1 基础认识

通常为了保证计算机的整体性能,内存和 CPU 之间的通信需保证很高的传输速率 , 然而这受限制于内存的大小和昂贵的硬件实现,传输速率和内存容量大小的关系遵循“ Smaller is faster ”原则,使用更大容量的内存势必会增加传输延迟降低性能。为优化计算机整体性能, ARMv8 存储系统中提供了多级 Cache 用于达到内存容量大小和传输延迟之间的平衡。可以从以下两个方面来描述典型的分级存储 架构

1.1.1 从数据通路描述

PE 发出虚拟地址 VA 转换需求

。虚拟地址 VA 经过 Address translation TTW 机制试图得到物理地址 PA.

。物理地址 PA 有可能在 Level1 Cache Level2 Cache 或者 Main Memroy .

。若 PA 既不在 Cache 也不在 Main Memroy ,将出现 Page fault ,然后由 OS 实现重新加载 .

。若顺利找到 PA ,则给回 PE 继续执行 .

1.1.2 从数据交换单位描述

寄存器 <=> Cache

程序猿 / 编译器

Cache <=> Main Memroy

Cache 控制器,由 HW 实现

Main Memroy <=> Disk

OS 操作系统

Disk <=> Tape

用户

1.1.3 Cache 数据一致性拓扑结构

PoU

指当前 CPU 的指令 Cache 、数据 Cache TTW 所共享一个存储点 ,每个 CPU Cache L1 都有独立的 IC DC Cache L2 对于同一个 CPU 集群是共享的, POU 一般值的是 L2 范围内的内存 .

PoC

指所有 CPU 的指令 Cache 、数据 Cache TTW 所共享一个存储点,不同的 CPU 集群有对于不同的 Cache L2, 所以对于不同的 CPU 集群而言,他们共同的存储点是内存 , 这就是 POC 拓扑结构 .

1 . 2 系统层内存模型

1.2.1 内存 属性

属性

Note

Normal

( 普通 )

。读写经过 Cache

。支持乱序,内存访问顺序同编程顺序可能不一致

。支持预读取 ?

。支持内存非对齐访问

Device

( 设备 )

。读写不经过 Cache

。不支持乱序内存访问

。不支持预读取

。不支持内存非对齐访问

Shareability

( 可共享性 )

指当前内存页表项的数据是否可以同步到其它 CPU 上,多核 CPU 调用带有该属性页表项的数据,一旦某个 CPU 修改了数据,那么系统将自动更新到其它 CPU 的数据拷贝,实现内存数据一致性 .

Cacheability

( 可缓存性 )

指当前内存页表项对于的数据是否可以加载到 Cache 当中 .

1.2.2 地址空间

地址类型

最大支持位宽

寄存器配置

PA Physical address

48 bit

ID_AA64MMFR0_ELx .PARange

OA Output address

48 bit

TCR_ELx . IPS

IA Input address

48 bit

TCR_EL x .T0SZ TCR_ELx .T0SZ

IPA Intermediate Physical address

48 bit

VTTBR_EL2 . T0SZ

1.2.3 字节编码支持

两种存储类型

big-endianness

( 大端存储 )

指字数据或者半字数据的最高字节存放在内存最低字节地址上,而字数据或者半字数据低字节则存放在内存地址的最高地址中 .

little-endianness

( 小端存储 )

指字数据或者半字数据的最高字节存放在内存最高字节地址上,而字数据或者半字数据低字节则存放在内存地址的最低地址中 . 和大端存储相反 .

寄存器配置

异常等级

精确数据访问

Stage 1 TTW

Stage 2 TTW

EL0

SCTLR_EL1 .E0E

SCTLR_EL1 .EE

SCTLR_EL2 .EE

EL1

SCTLR_EL1 .EE

SCTLR_EL1 .EE

SCTLR_EL2 .EE

EL2

SCTLR_EL2 EE

SCTLR_EL2 .EE

N/A

EL3

SCTLR_EL3 .EE

SCTLR_EL3 .EE

N/A

2 章 虚拟内存系统架构 (VMSA)

2.1 VMSAv8-64

VMSA 的基本思想是程序、数据、堆栈的总和内存大小可以超过物理存储器的大小, OS 把当前使用的部分送入到内存中,而把其他未被使用的部分保存在磁盘上。例如,对一个 16MB 的程序和一个内存只有 4MB 的机器, OS 通过调度,可以决定各个时刻将哪 4M 的内容送入内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个 16M 的程序运行在一个只具有 4M 内存机器上了。

VMSA 提供 MMU Memory Management Unit )用于实现 PE 访问内存的 VA->PA 地址转换和控制、访问权限、内存属性决定和检查等。

相关命名解析

VMSA

描述 ARMv8 地址转换方案,包括 Stage 1 Stage 2 两个阶段 .

VMSAv8-32

描述 AArch32 地址转换方案,包括单一阶段的地址转换

VMSAv8-64

描述 AArch64 地址转换方案,包括单一阶段的地址转换

2.1.1 地址转换系统

地址类型

VA( 虚拟地址 )

我们可看到的地址都是虚拟地址,最大宽度支持 48bit AArch64 VA 地址空间分为顶部 VA 和底部 VA 两个子区域,每个 VA 子区域最大支持 256TB.

底部 VA 0x0000_0000_0000_0000 =>0x0000_FFFF_FFFF_FFFF

顶部 VA 0xFFFF_0000_0000_0000 =>0xFFFF_FFFF_FFFF_FFFF

VA[55] 决定使用 top VA 还是 bottom VA

IPA (中间物理地址)

如果不支持 Stage 2 转换,那么 IPA == PA 。如果支持 Stage2 ,那么 IPA

Stage 1 OA (Output address)

Stage 2 IA (Input address)

最大支持 48bit

PA (物理地址)

物理内存单元映射中的地址,可以看做是 PE 到内存系统的输出地址 (OA) PA 最大支持 48bit

地址转换规则 (EL3 use AArch64)

Secure 状态下只支持 Stage 1 地址转换

Non-secure EL1/EL0 既支持 Stage 1 也支持 Stage 2 地址转换 .

。只有 EL2 才支持 Stage 2 ,所以 Stage 2 只为 EL2 服务的

转换表格式支持

。使用 64bit descriptor entries (描述符实例)

。最高支持 4 Level 的地址查找

Input address IA )最高支持 48bit

Output address OA )最高支持 48bit

。转换颗粒尺寸支持三种大小: 4KB\16KB\64KB (和 Page size 概念类似)

2.1.2 内存转换粒度

三种转换粒度解析

属性

4KB granule

16KB granule

64KB granule

转换表中有最大条目数 (项)

512

2048

8192

每级 lookup 最大可解析地址位

9 -bit

11-bit

13-bit

Page Offset

VA[11,0] =PA[11,0]

VA[13,0]=PA[13,0]

VA[15,0]=PA[15,0]

寄存器配置 (x = 0,1,2,3)

TCR_ELx .TG0 = 00

TCR_ELx.TG0 = 10

TCR_ELx.TG0 = 01

4KB 转换粒度图解

。最大支持 4 Level Lookup Level0~Level3 每个层级的查找最大可以解析 9-bit 数据

IA[38 30] 对应 Linux 中的 PGD,IA[29:20] =>PMD,IA[20:12] => PUD, IA[11:0] => PTE

Page Offset IA[11 0] == OA[11 0]

Translation Table 所需内存 Size 较大

Stage 2 ( 二阶地址转换 ) 图解

Stage 2 有级联 table 的概念,可以减少 level 的级数

。所谓级联就是假如有 IA[40:0] ,而 Level1 解析地址段为 IA[38:30] ,超过了 2 bit ,而 2^40 = 2^2*2^38 ,所以相当于要 2^2 个这样的 translation table 来实现级联解析。 ARMv8 规定, Stage 2 最多支持 4-bit 级联,也就是最大级联 2^4 == 16 translation table 级联解析 . 以达到减少查找 level 的目的 .

VTTBR_EL2 寄存器提供初始 Level 查找基地址, Stage 2 只为 EL2 服务

。同 Stage 1 Level 1 支持 1GB 的内存 block Level 2 支持 2MB 的内存 block

各个层级 Block

转换粒度

Note

4KB

Level 0 不支持 block 转换

Level 1 转换表 block 描述符映射关联 1GB IA 范围

Level 2 描述符映射关联 2MB IA 范围

16KB

Level 0/1 不支持 block 转换

Level 2 转换表 block 描述符映射关联 32MB IA 范围

64KB

Level 1 不支持 block 转换

Level 2 转换表 block 描述符映射关联 512MB IA 范围

2.1.5 描述符内存属性

NSTable

Stage 2

不支持

安全模式标志位

APTable

下一级 levellookup access permission

XNTable

下一级 level lookup 的执行权限

PXNTable

限制 XN 的特权 bit P 是指特权 .

2.2 VMSAv8-32

2.2.1 地址转换系统

地址类型

VA( 虚拟地址 )

保存在 PC,LR,SP 中的看得到地址都是虚拟地址 VA

VA 最大支持 32bit 宽,地址空间最大到 4GB

。地址范围: 0x00000000~0xFFFFFFFF

IPA (中间物理地址)

如果不支持 Stage 2 转换,那么 IPA == PA 。如果支持 Stage2 ,那么 IPA

Stage 1 OA (Output address)

Stage 2 IA (Input address)

AArch32 IPA 最大支持 40bit ( 使用 16MB 转换颗粒 )

PA (物理地址)

物理内存单元映射中的地址,可以看做是 PE 到内存系统的输出地址 (OA) PA 最大支持 32bit

地址转换规则

Secure 状态下只支持 Stage 1 地址转换

Non-secure EL1/EL0 既支持 Stage 1 也支持 Stage 2 地址转换 .

。只有 EL2 存在才支持 Stage 2 ,所以 Stage 2 只为 EL2 服务的

2.2.2 转换表支持

短描述符, 转换表中使用 32bit 描述符 entries ,提供如下:

。支持最大 2 address lookup (地址查找)

32bit IA

OA 最大支持到 40bit

。当使用 Page 使用 Supersection(16MB 转换颗粒 ) 时候,支持 PA 超过 32bit ,最大到 40bit

。支持 不访问、代理和 domain 管理?

长描述符 ,转换表中使用 64bit 描述符 entries ,提供如下:

。支持最大 3 address lookup (地址查找)

。当使用 Stage2 转换 ,最大支持 40bit IA

OA 最大支持到 40bit

。固定 4KB 的转换颗粒大小 (PAGE_SIZE) ,不支持 domain

2.2.3 描述符格式

短描述符格式 分为 4

Supersection

超节

16MB memroy block 组成,可选支持

Section

1MB 内存块组成

Large Pages

大页

64KB 内存块组成

Small Pages

小页

4KB 内存块组成

转换表中,短描述符是下面之一情况

。一个无效的 fault entry

00

。一个 page table 条目,指向下一级转换表地址

01

。一个 page 或者 section 条目,定义了内存访问属性

1x

Level 1 描述符格式

无效

00

Page table

01

Section/Supersection

1x

2.2.4 描述符内存属性

NS

安全模式标志位

AP

下一级 levellookup access permission

XN

下一级 level lookup 的执行权限

PX

限制 XN 的特权 bit P 是指特权 .

Domain

Domain 其实就是页表权限之上再加一层开关

00 :忽略页表权限,访问产生 page fault

01 :看页表权限访问

11 :忽略页表权限正常访问

S

Shareable( 可共享位 )

nG

非全局,决定转换是否标记在 TLB

TEX[2:0]

内存范围属性位

2.3 TTW( 地址转换流程 )

TTW Translation table walk )包含 1 个或者多个 Translation table 的查找

。目的 : 提供一种机制去实现 虚拟地址 VA => 物理地址 PA

Non-secure & EL0/1 ,包含 Stage 1 Stage 2 ( 一阶、二阶 ) 地址转换

TTBR0_ELx 提供 user space 的初级查找基地址, TTBR1_ELx 提供 kernel space 的初级查找基地址

。每一级的 translation table lookup 返回一个 descriptor ,如果是最后一级查找,那么返回包含 OA 和相关内存访问权限属性;如果不是最后一级查找,则包含了下一 level 转换表的基地址 .

2.3.1 VMSAv8-64

TTW 结构流程图

TTW 实现流程图

TTBRn_ELx[47:12] 寄存器获取基地址和 IA[47 39] ORR 运算得到地址作为输入,开始一阶转换的 Level0 查找,得到 OA 作为二级转换的 IA(IPA)

。将 IPA 作为二级查找的 IA ,递归 TTW 过程,得到二级转换 OA

。二级转换 OA 作为一阶转换 Level1 查找基地址,开始 Level2 查找 .. 进入二级转换 , 重复上面操作

Level3 转换完成后得到物理页框地址 [47:12] ,然后和 Page offset ORR 运算,得到最终 PA[47:0]

。如下详细图解

2.3.2 VMSAv8-32

TTW 结构流程图

TTW 实现流程图

3 MMU Fault

3.1 故障类型

Alignment fault

未对齐故障 ,发生在 Memroy access 过程中

Permission fault

权限故障 (可以发生在 TTW 的任一 Level 的查找中)

Translation fault

转换故障 ,发生在 TTW 过程中

Address size fault

地址宽度故障

Synchronous external abort

同步外部终止 ,包括 Data abort Instruction abort

Access flag fault

访问标记故障

TLB confict abort

TLB 冲突终止 ,通常会关联到 translation table

3.2 Kernel 如何处理读取空指针?

3.2.1 ARM 发生了什么?

kernel 函数读取空指针 => ARM 发生 同步 Data abort 异常 ,首先被 MMU 拦截进入 MMU 处理,若 MMU 处理不了,再交由系统处理。如果是 32 位机,系统将进入 Data abort 模式处理异常,下面是异常入口函数:

64 位: do_mem_abort (arch/arm64/mm/fault.c)

32 位: do_DataAbort (arch/arm/mm/fault.c)

。传入 esr 寄存器保存的异常的类型,先进入 inf->fn() 处理,若 MMU 处理成功就直接返回,否则跳过进入 arm64_notify_die /arm_notify_die 系统处理

AArch64

AArch 32

3.2.1 Kernel 如何处理?

。如下图从 fault_info 分支中看到同步 Data abort 会进入 do_bad() 处理函数,而 do_bad() 函数固定返回 1 ,说明 MMU 无法处理,交回由 ARM 处理 .

。可见 ,MMU 只能处理这几类异常: Address size fault Access flag fault Premission fault Translation fault Page fault .

AArch 64

AArch 32

4 Vmalloc

4.1 简介

Vmalloc 提供建立连续虚拟内存和离散物理内存直接的映射机制,消除物理内存碎片化

Vmalloc 区为非连续内存分区,地址范围是: VMALLOC_START ~ VMALLOC_END 之间 .

。由若干个 vmalloc 子区域组成,每个 vmalloc 子区域间隔 4KB PAGE_SIZE , 作为安全隔离区

vm_struct 表示每个 vmalloc 子区域,每次调用 vmalloc() 在内核成功申请一段连续虚拟内存后,都会对应一个 vm_struct 子区域 .

所有的 vmalloc 内存子区域使用一个链表链接起来 .

Vmalloc 区域结构图

vm_struct 数据结构 (kernel3.10)

next

所有的 vm_struct 子区域组成一个 vmlist 链表, next 指针指向下一个 vm_struct 节点地址

addr

vmalloc() 最终在内核空间申请一个 vm_struct 内存子区域, addr 指向该内存子区域首地址

size

表示该 vm_struct 子区域的大小

flags

表示该非连续内存区的类型标记

pages

指针数组成员是 struct page* 类型指针,每个成员都关联一个映射到该虚拟内存区的物理页框

nr_pages

指针数组 pages page 结构的总数

phys_addr

通常为 0 ,当使用 ioremap() 映射一个硬件设备的物理内存时才填充此字段

caller

返回地址

4.2 基本流程

size 修正为 PAGE_SIZE 的整数倍,保证对齐

vmalloc 内存范围内查找一块合适的虚拟地址子内存空间,存储到 vm_struct 结构中 .

为申请到的 vm_struct 子内存空间分配不连续的物理页框( Physical Frame

建立连续的 vm_struct 子内存空间到非连续的物理页框 (Physical Frame) 之间的映射 .

4.3 代码实现分析

vmallo() 内部封装 __vmalloc_node_range 函数

size

需要申请子内存的大小,通过 vmalloc() 传过来

align

表示将所申请的内存区分为几个部分, 1 表示 size 大小的虚拟内存区作为一个整体

start

vmalloc 区域范围从 VMALLOC_START 开始

end

vmalloc 区域范围到 VMALLOC_END 结束

gfp_mask

页面分配标志, GFP_KERNEL | __GFP_HIGHMEM 表示将从内核高端内存区分配内存空间

prot

描述当前页的保护标志

node

表示在哪个节点上( struct pg_data_t )为这段子内存区分配空间, -1 表示在当前节点分配

caller

返回地址

__vmalloc_node_range 函数分析

LINE 9

修正获取内存的 size PAGE_ALIGN size 的大小修改成 PAGE_SIZE 的整数倍,假设要申请 1KB 的内存区,那么实际上分配的是 PAGE_SIZE(4KB) 大小 的区域,然后进行 size 合法性检查,若不合法则返回 NULL, 申请内存失败

LINE 13

vmalloc 区域 VMALLOC_START,VMALLOC_END 范围内申请一块合适大小的子内存区 vm_struct ,这部分由函数 __get_vm_area_node() 来实现

LINE 18

为申请到的子内存区 vm_struct 分配物理页框( physical frame ),将不连续的 physical frame 分别映射到连续的 vm_struct 子内存区中,这部分由函数 __vmalloc_area_node() 来实现

LINE22~24

新分配的 vm_struct 区域都有 VM_UNLIST 标记表明未完全初始化,这里初始化完成后,清除掉此标记,由函数 clear_vm_unlist() 来实现, 表明已经完成 VA->PA 的映射 , kmemleak_alloc() 函数是调试用,最后 返回 addr.

__get_vm_area_node 函数分析

LINE 20

修正获取内存的 size, 修正为 PAGE_SIZE 的整数倍大小,实现页对齐 ;

LINE 24

使用 kmalloc 分配一段连续内存,用于存储 vm_struct 结构

LINE 28

每个 vm_struct 子区域之间有 4KB 大小的安全间隙,所以需要加上 PAGE_SIZE 的偏移

LINE 30

将在 vmalloc 整个非连续内存区域范围内查找一块 size 大小的子内存区,该函数先遍历整个 vmap_area_list 链表,依次比对链表中每个 vmap_area 子区域大小,直到找到合适的内存区域为止 , alloc_vmap_area() 函数实现

LINE 37

将查找到的 vmap_area 加载到 vm_struct 子内存中 , 然后将这个子 vm_struct 子内存区插入到整个 vmlist 链表中,由 setup_vmalloc_vm() 函数实现

alloc_vmap_area 函数分析

LINE 17-27

红黑树结构,留作后续进阶学习

__vmalloc_area_node 函数分析

__get_vm_area_node() 创建完新的 vm_struct 子内存区后,需要通过 __vmalloc_area_node() 为这个字内存区域分配物理页 .

LINE 9-10

根据 PAGE_SIZE 计算所需要的内存映射页框 (frame) 数,保存在 nr_pages 中,根据 nr_pages 计算出 pages 指针数组的大小 array_size pages 指针数组每个元素指向一个用于描述物理页框 (frame) page 结构 .

LINE 15-19

如果 pages 指针数组大小超过一个 PAGE_SIZE 的大小 (4kB), 那么将进入 递归 __vmalloc_node() 为其分配空间,否则通过 kmalloc_node() pages 指针数组分配一段连续内存空间,此段内存空间位于 kernel 空间的物理内存线性映射区域 . pages 指针数组用于存放非连续物理页框 page 结构地址

LINE 29-43

通过一个循环,为 pages 指针数组中的每个 page 结构分配物理页框( frame , 这里的 page 结构只是用于描述物理页框结构,不是代表物理内存,如果 node<0 ,说明未指定物理内存所在节点,使用 alloc_page() 分配一个页框,否则通过 alloc_page_node() 在指定的节点上分配物理页框 , 然后把刚刚分配的 page 装载到 pages[i] .

LINE 46

上面完成了分配所需要的物理页框 (frame) 然后由 map_vm_area() 完成 pages 数组中每个非连续物理页框到 vmalloc 子区的连续虚拟地址映射关系 .

5 Linux 虚拟内存布局

5.1 User 内存布局

32 位系统为例

内存段解析

内存段

Note

Text

可执行代码、字符串面值、只读变量

Data

已经初始化为 0 的全局变量和静态局部变量

BSS

未经初始化为 0 的全局变量和静态局部变量

Stack (栈)

局部变量,函数参数,返回地址等,效率比堆高很多

Heap (堆)

Malloc 等动态分配的内存,申请到的内存按 PAGE_SIZE 对齐,机制比较复杂

Mem maping

通过 mmap 系统调用映射进来,包括动态库和文件,可以向上 / 向下增长 .
起始地址由
TASK_UNMAPPED_BASE 决定,给新的 process 分配内存

一个简单例子助于理解

Creat 一个新的 process Mem mapping ), process 内有一个函数 func Text ),函数内分别定义一个 char 型变量 i Stack ),一个未初始化的 static int 类型数组 j[5]( BSS ), 一个已经初始化的 static long 型变量 k( Data ) func 内调用 malloc() 分配了一段内存( Heap .

5.1.1 Mem mapping 内存分配方式 (64 )

当系统 Create 一个新的 Process (进程)的时候,使用 mmap 给它分配内存有两种实现方式,一种是从一个固定的基地址 TASK_UNMAPPED_BASE 开始向上增长,一种是以某一个基地址为基准的固定范围内偏移位地址向下增长,起始地址是非固定值,这样可以提高安全性能,如下代码描述

mmap_is_legacy() == true ,则每一个新的 mmap 地址是由低 = 》高增长的,属于老的方式,起始地址是固定值 TASK_UNMAPPED_BASE ,不同位宽的 kernel ,起始地址有所不同,如下图描述

mmap_is_legacy() == false ,则和上面相反,每一个新的 mmap 地址是由低《 = 高增长的,属于新的方式,起始地址是固定值 + 固定范围内随机偏移,相比老的方式更加安全,如下图描述

内存段解析

内存段

Note

Kernel driver

内核驱动模块空间,大小为 64MB ,起始地址如下

MODULES_END == 0XFFFF-FFC0-0000-0000

MODULES_VADDR == 0XFFFF-FFBF-0000-0000

Vmalloc

Vmalloc 空间,大小约 ~239GB ,用于非连续物理内存到连续虚拟内存直接的映射,起始地址如下

VMALLOC_START == 0XFFFF-FF80-0000-0000

VMALLOC_END == 0XFFFF-FFBB-BBBB-0000

Linear maping

线性映射区,包括三段: Kernel.text( 程序段 ) Kernel.init Kernel.data( 数据段 ) Kernel.text 段起始地址为 0XFFFF-FFC0-0008-0000

相关代码定义

VA_BITS

文件路径: kernel/arch/arm64/include/asm/memory.h

#define VA_BITS       (39)

#define TASK_SIZE_64  (UL(1) << VA_BITS)

MODULES

文件路径: kernel/arch/arm64/include/asm/memory.h

#define PAGE_OFFSET   (UL(0xffff-ffc0-0000-0000))

#define MODULES_END    PAGE_OFFSET

#define MODULES_VADDR  (MODULES_END SZ_64M)

VMALLOC

文件路径: kernel/arch/arm64/include/asm/pgtable.h

#define VMALL0C_START   UL(0xffff-ff80-0000-0000)

#define VMALL0C_END    (PAGE_OFFSET- UL(0x4-0000-0000)- SZ_64K)

5.3 各内存域和物理内存映射关系

内存域

与物理内存之间的映射关系

VMALLOC

PA = f(VA), f 是页表机制映射法则

MODULES

和vmalloc映射机制相同

Liner maping

PA = VA + OFFSET

BSS\Text\Data

和vmalloc映射机制相同

Heap (堆)

和vmalloc映射机制相同

Stack (栈)

和vmalloc映射机制相同

Mem maping

和vmalloc映射机制相 2. 什么是 内存管理 内存管理 描述如何控制系统中对内存的访问。每次操作系统或应用程序访问内存时,硬件都会执行 内存管理 内存管理 是一种将内存区域动态分配给应用程序的方法。 2.1 为什么需 我们把这个矩阵里的每一个点称为像素(图像元素)。像素的色彩由三原色的强度(通常用数值表示)表示。例如,一个红色像素是指强度为 0 的绿色,强度为 0 的蓝色和强度最大的红色。粉色像素可以通过三种颜色的组合表示。如果规定强度的取值范围是 0 到 255 问题描述: 358有个问题帮忙看下, AV ,HDMI等信号源播放视频,画面移动的时候会有横细条纹,暂停后看不到,播放又会有, AV 信号源很明显,只有开机第一次播放才有,切换信号源或进安卓主页再进来,播放就没有细条纹了,358我已切换到最新20181102版本! 358方案,AN6.0-20181102版本,上周去贵司给你展示的那个闪白点或者叫短白线的问题:开机第一次进信号源, AV ,HDMI都可以,... # 学习 对象在全民造车、造芯的大时代,在努力去解决卡脖子的时代,ASIC硬件、SOC底层软件、Linux Kernel等操作系统软件(内核/驱动)、软硬件方面的系统 架构 师等的岗位需求也越来越明显,社会一直都是非常缺人的,缺的是核心的那一小撮、领头的那一小撮,社会所缺的更是能够软硬件融合的那一小撮人……总之,要想在这个时代,站稳自己的脚跟,能够在大公司或行业上拥有一席之地,就必需深入 学习 底层技术原理,核心技术才是您的看家本领。本课程设计之初,主要针对SOC底层软件开发的者、系统开发者,或者励志成为这样的人。既适合资深/高级工程师来查缺补漏,又适合初级工程师入门。(理论上该课程和ASIC硬件电路设计无关,该课程偏软件,但事实购买该课程的做ASIC的同学已然超过了15%)适用人群1、芯片开发者(包括底层软件、或做ASIC硬件的)。不限行业,例如车、云、物联网、移动端等领域;2、汽车行业开发者(主机厂、tier1、SOC厂家、各级供应商);3、嵌入式开发者、kernel开发者、驱动、软件工程师;4、学生。既适合学生从入门到精通,也适合资深工程师查缺补漏;您的收益:1、全体系的掌握 ARM v8 / ARM v9的核心知识点( ARM 基础、异常中断GIC、MMU/Cache、architecture...);2、掌握 ARM 架构 、掌握SOC 架构 、掌握常规IP(gic、smmu、timer、AXI/ACE/CHI、TZC400...);3、快速熟悉常规系统软件(bootrom、spl、ATF、TEE、bootloader、kernel...), Secureboot安全启动...4、技术水平提升N个level, 掌握快速的 学习 方法;# 学习 什么在 ARM 蓬勃发展的年代,不仅仅涉及到物联网IOT、移动领域(如手机)、汽车电子领域,现在还涉及到PC、服务器的,简直就是各行各业。 ARM v8 出来已经有10年了, ARM v9也2年时间了。在技术不断更新迭代的背景下,此时再去 学习 十五年前的 ARM v7、二十年前的 ARM v5/v6显然不是明智的选择。本课程主要基于当前最新的 架构 ARM v8 的aarch64和 ARM v9,如涉及具体的 ARM Core IP主要还是以最新的 ARM Core IP为主,软件 架构 也是以当前最主流的/未来所趋势的 架构 来讲解。以下也给大家列举初了一个 ARM 产品的timeline的总结(在本课程中有着大量的这种总结),从这张图中,您是可以清晰的看到本课程拥有独具一格的风格、拥有全网最新(且唯一)的资料总结或 学习 路线。# 本课程大纲和规划(课程持续更新中,课程总量统计:2022/10/02  当前是 61节课, 22小时)第一章:主要是快速 学习 : ARM 简介、指令集、寄存器总结等。第二章:本系列视频的一大亮点,系统全面地讲解了 arm 异常中断gic等相关的软硬件知识,本人一直在倡导“学 arm 安全其实就是学 arm 架构 ,学 arm 架构 其实就是 学习 arm 的异常和中断”,异常中断是领着你进入 架构 的入门,是让你变成系统软硬件 架构 师的必走之路。第三章:安全专题,这也是本视频最核心的东西。因为你无论买书还是看博客等,你都很难找到讲解安全的教程,这里就是有和无的区别。本人系统的整理的安全的知识,带领你快速入门。第四章:mmu专题,透过事务看本质的讲解,白话式的演讲。在所有模块中,mmu也算是相对较简单模块。相信人人听得懂,人人学得会。第五章:cache专题,一切追求实事求是,不人云亦云,一切知识点都有迹可循,推翻了网络的很多观念。在众多模块中,cache算是一个比较难的模块。了解了cache后,才能算真正了解系统的软硬件 架构 。第六章:虚拟化,本人不擅长,会啥就随便讲点啥。(以后学会了再来补)第七章:architecture,就是零散和零碎的系统 架构 知识,如exclusive、arch timer、reset、系统启动、SOC设计、AMBA/AXI/ACE、DSU、WFE/WFI这样的。第八章: 新增的 ARM v9 CCA/RME安全 架构 专题第九章:主要放置一些直播课。# 课程收益1、知道我 学习 什么,我要怎么去 学习 ,从此之后有了一个明确的 学习 路线。2、认识一些共同目标的人,相互讨论问题,共同进步。勤学、共学、助学。3、 ARM 不再神秘,SOC不在神秘,让您短期内就能cover住全局4、熟悉 ARM Architecture 架构 知识5、熟悉SOC 架构 知识6、熟悉主流的系统软件框架7、熟悉各项硬件原理和机制,如异常中断、MMU、cache、TLB、VMSA、Trustzone6、深入了解当前的系统 架构 、软硬件 架构 ,能够看懂这些大家,将来也能够自己设计。7、熟悉系统的启动流程、Secureboot等8、熟悉各类标准和规范9、能够进入芯片厂商干活、能够在非芯片产生成为技术担当。10、 学习 资料的获取方法,会看11500多页的 ARM 手册,会看数以百计的 ARM 各项参考手册。 本课程会持续更新。也希望通过本课程的 学习 ,能够让大家的 ARM v8 / ARM v9开发技术能有质的飞越,能找到自己心仪的工作。在购买之前,也建议大家看一看第一章第一节的课程介绍。 AV 元数据刮削器,使用 Golang 语言编写,具有多线程、全兼容等特点。 通过文件名称自动计算影片番号,并访问各官网或 J av 类网站获取元数据信息。 获取到元数据后,自动下载并剪切封面图片,并按照指定路径存储电影、元数据、封面。 NFO刮削 什么是元数据? 元数据就是电影的详细信息,包含:封面、简介、演员、标题等…… AV Meta 有什么用? 方便整理 AV 电影而已。 为什么我使用不了? 请以下方格式将错误信息填写到 issue 中。 操作系统: Windows 7 x64 Go版本: 1.13 AV Meta版本: v1.0.0 配置信息: 将敏感信息替换为*号 错误信息: 文件/番号: [xxx.mp4/xxx] 刮削失败, 错误原因: xxx 不想编译,可直接在 发布页 下载对应的最新预编译版本使用。 若使用预编译程