关于ARMv8另外几个问题
版权声明:本文为博主原创文章。未经博主同意不得转载。
https://blog.csdn.net/qianlong4526888/article/details/27510675
问题1:支持ARMv8的Linux内核异常向量地址在哪?
答:异常向量基地址在0xffffffc000081800。通过查看编译后的linux内核的System.map文件。能确定异常向量表的基地址。通过反汇编生成的支持armv8的linux内核也能够证实。Armv8的异常向量表的定义在内核的arch/arm/kernel/entry.S中,将其摘录例如以下:
/*
* Exception vectors.
*/
.macro ventry label
.align 7
b \label
.endm
.align 11
ENTRY(vectors)
ventry el1_sync_invalid //Synchronous EL1t
ventry el1_irq_invalid //IRQ EL1t
ventry el1_fiq_invalid //FIQ EL1t
ventry el1_error_invalid //Error EL1t
ventry el1_sync //Synchronous EL1h
ventry el1_irq //IRQ EL1h
ventry el1_fiq_invalid //FIQ EL1h
ventry el1_error_invalid //Error EL1h
ventry el0_sync //Synchronous 64-bit EL0
ventry el0_irq //IRQ 64-bit EL0
ventry el0_fiq_invalid //FIQ 64-bit EL0
ventry el0_error_invalid //Error 64-bit EL0
#ifdefCONFIG_AARCH32_EMULATION
ventry el0_sync_compat //Synchronous 32-bit EL0
ventry el0_irq_compat //IRQ 32-bit EL0
ventry el0_fiq_invalid_compat //FIQ 32-bit EL0
ventry el0_error_invalid_compat //Error 32-bit EL0
#else
ventry el0_sync_invalid //Synchronous 32-bit EL0
ventry el0_irq_invalid //IRQ 32-bit EL0
ventry el0_fiq_invalid //FIQ 32-bit EL0
ventry el0_error_invalid //Error 32-bit EL0
#endif
END(vectors)
问题2:找出TLB中存放的ARMv8的页表格式
答:仅仅找到了页表的格式。TLB中的格式没找到。
ARMv8支持4KB页大小的4级页表转换到64KB页大小的3级页表转换。
下面是从内核源代码的Documentation找到的信息。
AArch64 Linux memory layout:
Start End Size Use
-----------------------------------------------------------------------
0000000000000000 0000007fffffffff 512GB user
ffffff8000000000 ffffffbbfffeffff ~240GB vmalloc
ffffffbbffff0000 ffffffbcffffffff 64KB [guardpage]
ffffffbc00000000 ffffffbdffffffff 8GB vmemmap
ffffffbe00000000 ffffffbffbffffff ~8GB [guard,future vmmemap]
ffffffbffc000000 ffffffbfffffffff 64MB modules
ffffffc000000000 ffffffffffffffff 256GB memory
Translation table lookup with 4KB pages:
+--------+--------+--------+--------+--------+--------+--------+--------+
|63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
+--------+--------+--------+--------+--------+--------+--------+--------+
| | | | | |
| | | | | v
| | | | | [11:0] in-page offset
| | | | +-> [20:12] L3 index
| | | +-----------> [29:21] L2 index
| | +---------------------> [38:30] L1index
| +------------------------------->[47:39] L0 index (not used)
+------------------------------------------------->[63] TTBR0/1
Translation table lookup with 64KB pages:
+--------+--------+--------+--------+--------+--------+--------+--------+
|63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
+--------+--------+--------+--------+--------+--------+--------+--------+
| | | | |
| | | | v
| | | | [15:0] in-page offset
| | | +----------> [28:16] L3 index
| | +--------------------------> [41:29] L2index (only 38:29 used)
| +-------------------------------> [47:42] L1 index (not used)
+------------------------------------------------->[63] TTBR0/1
问题3:ARMv8中重要的控制寄存器的各位的意思是什么?
答:源代码中没找到对ARMv8控制寄存器的具体描写叙述。
1. 关于SPSR,该寄存器是CPSR的副本,当在不同模式间转换时,该寄存器保存CPSR的内容,用于状态恢复。
在arch/arm64/include/asm/ptrace.h中找到AArch64的spsr寄存器某些位的定义。经过与ARMv7的对照发现。下面定义的位于ARMv7中定义的位意义同样。
/*AArch64 SPSR bits */
#definePSR_F_BIT 0x00000040
#definePSR_I_BIT 0x00000080
#definePSR_A_BIT 0x00000100
#definePSR_D_BIT 0x00000200
#definePSR_Q_BIT 0x08000000
#definePSR_V_BIT 0x10000000
#definePSR_C_BIT 0x20000000
#definePSR_Z_BIT 0x40000000
#define PSR_N_BIT 0x80000000
2. ARMv8中的系统控制寄存器有多个。但与ARMv7不同的是:ARMv8中抛弃了“协处理器”的概念,进而就没了MCR,MRC类的指令,见參考资料[3],其系统控制都是通过MSR。MRS类指令进行。通过阅读Linux内核源代码发现。基本的控制寄存器有:
hcr_el2:el2中的hypervisor配置寄存器
cnthctl_el2:可配置通用时钟
另外还有,vmpidr_el2;vpidr_el2;sctlr_el1:cptr_el2;hstr_el2;spsr_el2。vbar_el1;ttbr0_el1;ttbr1_el1;sctlr_el1
參考资料
[1] ARMv8的编译器binutils,结构体aarch64_opcode_table定义见line 1208
[2] 结构体aarch64_opcode定义。line451
[3] 《ARMv8 InstructionSet Overview 》page11
关于ARMv8另外几个问题的更多相关文章
- armv8(aarch64)linux内核中flush_dcache_all函数详细分析【转】
转自:http://blog.csdn.net/qianlong4526888/article/details/12062809 版权声明:本文为博主原创文章,未经博主允许不得转载. /* * __ ...
- armv8(aarch64)linux内核中flush_dcache_all函数详细分析
/* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...
- ARMv8 Linux内核源代码分析:__flush_dcache_all()
1.1 /* * __flush_dcache_all() * Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ EN ...
- ARMv8 Linux内核head.S源码分析
ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...
- ARMv8 Linux内核异常处理过程分析
NOTE:为了方便大家阅读,制作了PDF版文档.下载请猛戳这里 老样子,为了赚点积分下载其它人的文件,下载以上资料须要资源分2分. 假设没有积分请留言全部文档,留下邮箱就可以. 看了Linaro提供的 ...
- ARMV8体系结构简介
armv8 1.前言 本文的主要内容来源于ARMV8白皮书v5,对ARMV8做一个概述.包含如下的内容: 首先从背景谈起,讲述ARM的发展历程: 之后介绍ARMV8体系结构的基本特征: 介绍A64指令 ...
- armv8 memory translation
AArch32,arm的32bit架构: AArch64,arm的64bit架构: ARMv8.2-LPA,是armv8.2中的新feature,扩大了IPA和PA的支持范围,从48bit扩展到52b ...
- ARMV8 datasheet学习笔记5:异常模型
1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文 3. 异常处理路由对比 AArch32.AArch64架 ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之VMSA
1. 前言 2. VMSA概述 2.1 ARMv8 VMSA naming VMSAv8 整个转换机中,地址转换有一个或两个stage VMSAv8-32 由运行AArch32的异常级别来管理 VMS ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型
1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性 2. 存储系统体系结构 2.1. 地址空间 指令地址空间溢出 指令地址计算((address_of ...
随机推荐
- jdk 自带的数据库Derby使用
ij是derby自带的一个功能强大的数据库管理工具,可以进行很多数据库管理的操作,包括创建数据库, 启动/关闭数据库,执行SQL脚本等.完成准备工作后,就可以启动并使用ij工具了. 在cmd中输入如下 ...
- android 手机 多分辨率适配
近来在做android屏幕适配这方面的工作, 今天总算有点眉目. 小记一下 基础知识就不科普了, 网上一大堆. 作为一个刚接触这方面人, 最先进入我脑子的, 是从小到大的各种屏, 小到手表, 大到街 ...
- Mac和Windows中常见中文字体的英文名称
我们在给HTML元素设置字体的时候经常会有类似 “ font-family:"微软雅黑", "黑体" ” 这样的写法,尤其是在使用Dreamweaver.Apt ...
- Kafka ACL使用实战
自0.9.0.0.版本引入Security之后,Kafka一直在完善security的功能.当前Kafka security主要包含3大功能:认证(authentication).信道加密(encry ...
- mybatis与hibernate区别与应用场景
hibernate:是一个标准化的ORM框架.入门的门槛较高,不需要程序写sql,语句就自动生成了.对sql进行优化.修改比较困难. 应用场景:适用于中小企业需求变化不多的项目,比如后台管理系统,er ...
- electron 主进程,和渲染进程的通信
ipcMain https://electronjs.org/docs/api/ipc-main 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息, 当然也有可能从主进程向渲染进 ...
- Docker 修改国内镜像地址
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://86d2a50b.m.daocloud.io 该脚本可以 ...
- shell 脚本部分变量含义
$ # 传递到脚本的参数个数$ * 以一个单字符串显示所有向脚本传递的参数.与位置变量不同,此选项参数可超过9个$ $ 脚本运行的当前进程I D号$ ! 后台运行的最后一个进程的进程I D号$ @ 与 ...
- 这些简单实用的Word技巧,你get了吗
快速选中多个对象 如果需要将某些文本设置成相同的格式,我们不需要一个个的设置,只要选中多个文本然后一起设置就可以了. 单击开始——选择编辑——选择——选择格式相似的文本 快速清除所有格式 那么当我们不 ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...