关于ARMv8另外几个问题

发布者:温馨时光最新更新时间:2020-06-04 来源: elecfans关键字:ARMv8  编译  linux内核 手机看文章 扫描二维码
随时随地手机看文章

问题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


http://kernel.ubuntu.com/git?p=jk/arm64/binutils.git;a=blob;f=opcodes/aarch64-tbl.h;h=d360b1406718257da86050f5b3a760cd02196250;hb=aarch64


[2] 结构体aarch64_opcode定义,line451


http://kernel.ubuntu.com/git?p=jk/arm64/binutils.git;a=blob;f=include/opcode/aarch64.h;h=98529954ea098349eb16572d4915f4edbd2e7b5d;hb=aarch64


[3] 《ARMv8 InstructionSet Overview 》page11

关键字:ARMv8  编译  linux内核 引用地址:关于ARMv8另外几个问题

上一篇:arm平台linux异常处理流程
下一篇:ARMv8(aarch64)页表建立过程详细分析

推荐阅读最新更新时间:2024-11-03 23:47

[JZ2440] 安装 arm-linux-gcc 交叉编译
一、相关资料获取   我个人在学习 mini2440 开发板时是跟着韦东山老师的视频学习的,视频和资料可以访问百问网论坛获取。   百问网论坛链接: http://www.100ask.net/bbs/forum.php   下载好资料后在视频配套资料下有 百问网JZ2440v2主光盘.iso 文件,解压或者用虚拟光驱加载,在光盘 tools 目录下可以获取到 arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 交叉编译器。 二、安装交叉编译器   1. 建立工作目录,在 Ubuntu 家目录下建立 workspace 目录,再建立 s3c2440 目录,该目录下存放所有 mi
[单片机]
STM32 编译指令 #pragma pack 的配对使用
#pragma pack 可以用来指定数据结构的成员变量的内存对齐数值。 可选值为: 1、2、4、8、16。 使用 pack 指令要配对使用,以避免意外影响项目中其他源文件的结构成员的内存对齐。 如果影响了其他源文件的结构成员内存对齐,那么在你按照默认对齐来计算那些结构成员占用内存大小或者使用指针移动计算结构成员偏移位置的时候,就可能会出现意料之外的异常。 主要可能的异常是内存定位错误或非法内存访问,结果可能导致错误的定位或数值,极端的情况下可能导致程序崩溃。 下面的例子用来展示基本的配对使用方式。 1)#pragma pack(n)的配对使用 #pragma pack(1) //内存对齐设置为1个字节
[单片机]
ARM Linux内核启动要求
这篇文章英文原版 ARM Linux Kernel Boot Requirements ,是ARM Linux内核的维护者Russell King写的。在此我将其简易的翻译成中文,方便大家学习下。 原版:http://www.arm.linux.org.uk/developer/booting.php Author: Russell King Initial date: May 18, 2002 Revision: 1 - 17 September 20042 - 30 September 2004 为了启动ARM Linux,首先,你需要一个bootloader,它是一个很小的程序(在内核运行之前启动)。bootloade
[单片机]
STM32高级开发(9)-学习与编译libopencm3-example
在前面的几篇中我们为大家介绍了在Linux下stm32开发环境的新特性和使用方式,可能大家觉得,我怎么写一个工程还要自己写链接文件和启动文件,是不是太不方便了点。那么这篇中我会告诉大家其实并不是这样的。在我们日常的一些小规模工程下我们是可以使用一个叫做libopencm3的cortexM核的通用驱动库来配置我们的工程。那么大型的工程呢?有童鞋还会问道。对于大型的工程,我想:自己去改写链接文件和启动文件,使得你对整个系统的启动及运行流程更好的把控绝对是物有所值的,在这两个文件上付出的短短的时间绝对会为我们带来超出他们花费的价值。 Libopencm3简介 libopencm3项目(以前称为libopenstm32)旨在创建一个适
[单片机]
STM32高级开发(9)-学习与<font color='red'>编译</font>libopencm3-example
STM32通过命令行编译和下载keil和IAR工程的方法
可能很多人都不习惯使用Keil、IAR自带的编辑器,可能代码补全、错误提示、高亮等编辑功能相对来说支持的不是很好。 虽然Keil MDK 从 V5.25版本开始对编辑功能改善了很多,但是很多人还是青睐于第三方的编辑器。 使用第三方的编辑器,如果需要编译和下载,就需要借助通过额外的方式实现,比如本文即将描述的通过命令行编译和下载的方式,可以让我们在使用第三方编辑器编辑的时候,进行代码编译和下载。 下面我们来描述以下内容: 常用代码编辑器 Keil 命令行编译下载 IAR 命令行编译下载 编译下载使用方法 1、常用的代码编辑器 下面介绍几款常用的代码编辑器: 1.VS Code VS Code 是绝大部分软件工程师都在使用
[单片机]
STM32通过命令行<font color='red'>编译</font>和下载keil和IAR工程的方法
linux内核中的likely和unlikely
Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.csdn.net/ce123) GCC version:arm-linux-gcc-3.4.1 看内核时经常遇到if(likely( )){}或是if(unlikely( ))这样的语句,不甚了解,例如(选自kernel/fork.c中copy_process): view plain copy print ? SET_LINKS(p); if (unlikely(p- ptrace & PT_PTRACED)) __ptrace_link(p,
[单片机]
联盛德 HLK-W806 (十二): Makefile组织结构和编译流程说明
Makefile基本概念 下面这些是在项目的Makefile中会用到的, 主要就说一下赋值和$方法 赋值=, :=, ?=, += Makefile中的赋值, 可以赋值一个列表, 例如 VAR = dir1 dir2 dir3 = 赋值 make会将整个Makefile展开后, 再决定变量的值, 也就是说变量的值会是整个 Makefile 中最后被指定的值 x = foo y = $(x) bar x = xyz y的值会是 xyz bar ,而不是 foo bar := 赋值 表示变量的值等于 Makefile 执行到此处时的值, 而不是整个 Makefile 展开后的最终值 x := foo y :=
[单片机]
关于启动STVD编译环境,启动编译连接出现错误
1)先安装软件: cxstm8_32k软件来安装。一般下载文件有两个,如下所示: 第一步:先点击截图里面的第一个文件来安装,安装过程中,会有很多的提示,直接NEXT,可以。 第二步:点击第二个文件,找到刚才cxstm8_32k.exe。安装路径。点击启动应用按钮,即完成安装。 2)再来启动STVD软件,点击project项目中的settings.如下截图所示: 在project specific toolset p:左侧打上小勾勾,然后单击找到刚才按照CXSTM8_32K的安装路径,即可。
[单片机]
关于启动STVD<font color='red'>编译</font>环境,启动<font color='red'>编译</font>连接出现错误
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved