追风的花生 · 小甲鱼python论坛 - CSDN文库· 2 月前 · |
呐喊的竹笋 · outlook如何快速复制邮件内容呢-百度经验· 1 年前 · |
欢乐的蚂蚁 · windows安装git和环境变量配置 - 简书· 1 年前 · |
鼻子大的脆皮肠 · hive 分位数函数 ...· 1 年前 · |
威武的板凳 · ntext, text, and ...· 1 年前 · |
2.1.3 Address Translation Stage 8
2.1.4 描述符格式 (descriptor format) 9
5.1.1 Mem mapping 内存分配方式 (64 位 ) 28
通常为了保证计算机的整体性能,内存和 CPU 之间的通信需保证很高的传输速率 , 然而这受限制于内存的大小和昂贵的硬件实现,传输速率和内存容量大小的关系遵循“ Smaller is faster ”原则,使用更大容量的内存势必会增加传输延迟降低性能。为优化计算机整体性能, ARMv8 存储系统中提供了多级 Cache 用于达到内存容量大小和传输延迟之间的平衡。可以从以下两个方面来描述典型的分级存储 架构 。
。 PE 发出虚拟地址 VA 转换需求 |
。虚拟地址 VA 经过 Address translation 的 TTW 机制试图得到物理地址 PA. |
。物理地址 PA 有可能在 Level1 Cache 、 Level2 Cache 或者 Main Memroy 中 . |
。若 PA 既不在 Cache 也不在 Main Memroy ,将出现 Page fault ,然后由 OS 实现重新加载 . |
。若顺利找到 PA ,则给回 PE 继续执行 . |
寄存器 <=> Cache |
程序猿 / 编译器 |
Cache <=> Main Memroy |
Cache 控制器,由 HW 实现 |
Main Memroy <=> Disk |
OS 操作系统 |
Disk <=> Tape |
用户 |
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 拓扑结构 . |
属性 |
Note |
Normal ( 普通 ) |
。读写经过 Cache 。支持乱序,内存访问顺序同编程顺序可能不一致 。支持预读取 ? 。支持内存非对齐访问 |
( 设备 ) |
。读写不经过 Cache 。不支持乱序内存访问 。不支持预读取 。不支持内存非对齐访问 |
( 可共享性 ) |
指当前内存页表项的数据是否可以同步到其它 CPU 上,多核 CPU 调用带有该属性页表项的数据,一旦某个 CPU 修改了数据,那么系统将自动更新到其它 CPU 的数据拷贝,实现内存数据一致性 . |
Cacheability ( 可缓存性 ) |
指当前内存页表项对于的数据是否可以加载到 Cache 当中 . |
地址类型 |
最大支持位宽 |
寄存器配置 |
PA ( Physical address ) |
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 |
• 两种存储类型
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 |
• VMSA 的基本思想是程序、数据、堆栈的总和内存大小可以超过物理存储器的大小, OS 把当前使用的部分送入到内存中,而把其他未被使用的部分保存在磁盘上。例如,对一个 16MB 的程序和一个内存只有 4MB 的机器, OS 通过调度,可以决定各个时刻将哪 4M 的内容送入内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个 16M 的程序运行在一个只具有 4M 内存机器上了。
• VMSA 提供 MMU ( Memory Management Unit )用于实现 PE 访问内存的 VA->PA 地址转换和控制、访问权限、内存属性决定和检查等。
• 相关命名解析
描述 ARMv8 地址转换方案,包括 Stage 1 和 Stage 2 两个阶段 . |
|
VMSAv8-32 |
|
VMSAv8-64 |
描述 AArch64 地址转换方案,包括单一阶段的地址转换 |
• 地址类型
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 概念类似) |
• 三种转换粒度解析
属性 |
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 = ’ 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 |
。 Translation Table 所需内存 Size 较大 |
• Stage 2 ( 二阶地址转换 ) 图解
。所谓级联就是假如有 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 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 范围 |
Stage 2 不支持 |
安全模式标志位 |
|
APTable |
下一级 levellookup 的 access permission |
|
XNTable |
下一级 level lookup 的执行权限 |
|
PXNTable |
限制 XN 的特权 bit , P 是指特权 . |
• 地址类型
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 服务的 |
• 短描述符, 转换表中使用 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 |
• 短描述符格式 分为 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 |
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] |
内存范围属性位 |
。 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 转换表的基地址 . |
• 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] |
。如下详细图解 |
• TTW 结构流程图
• TTW 实现流程图
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 |
。 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
。如下图从 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
。 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 |
返回地址 |
。 size 修正为 PAGE_SIZE 的整数倍,保证对齐 |
。 在 vmalloc 内存范围内查找一块合适的虚拟地址子内存空间,存储到 vm_struct 结构中 . |
。 为申请到的 vm_struct 子内存空间分配不连续的物理页框( Physical Frame ) |
。 建立连续的 vm_struct 子内存空间到非连续的物理页框 (Physical Frame) 之间的映射 . |
• 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 子区的连续虚拟地址映射关系 . |
• 以 32 位系统为例
• 内存段解析
内存段 |
Note |
Text |
可执行代码、字符串面值、只读变量 |
Data |
已经初始化为 0 的全局变量和静态局部变量 |
BSS |
未经初始化为 0 的全局变量和静态局部变量 |
Stack (栈) |
局部变量,函数参数,返回地址等,效率比堆高很多 |
Heap (堆) |
Malloc 等动态分配的内存,申请到的内存按 PAGE_SIZE 对齐,机制比较复杂 |
Mem maping |
通过
mmap
系统调用映射进来,包括动态库和文件,可以向上
/
向下增长
.
|
• 一个简单例子助于理解
Creat 一个新的 process ( Mem mapping ), process 内有一个函数 func ( Text ),函数内分别定义一个 char 型变量 i ( Stack ),一个未初始化的 static int 类型数组 j[5]( BSS ), 一个已经初始化的 static long 型变量 k( Data ) 。 func 内调用 malloc() 分配了一段内存( Heap ) .
当系统 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) |
与物理内存之间的映射关系 |
|
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 不想编译,可直接在 发布页 下载对应的最新预编译版本使用。 若使用预编译程 |
追风的花生 · 小甲鱼python论坛 - CSDN文库 2 月前 |
呐喊的竹笋 · outlook如何快速复制邮件内容呢-百度经验 1 年前 |
欢乐的蚂蚁 · windows安装git和环境变量配置 - 简书 1 年前 |