在ARMv7中定义了不同的特权级别。分别是PL0, PL1, PL2。而每种特权级别依赖处理器模式Processor modes 在ARMv7中定义了九种不同的处理器模式 ? User模式特权级别最低,属于PL0 SVC模式是进入Reset模式或者调用SVC指令,而SVC指令在ARMv7就是所谓的系统调用指令,比如当调用open函数时,会触发系统调用,最终会通过SVC指令陷入内核的
芯片复位后,将在异常向量表中复位向量的位置开始执行。复位操作的代码必须做以下事情:
ARMv7 Register ARMv7提供了16个通用寄存器,分别是R0-R15。其中R0-R14是用于存储数据的通用寄存器,R15是程序计数器PC寄存器。 这里和ARMv8的区别是ARMv8-A的PC寄存器不属于通用寄存器了 同时ARMv7中也提供了CPSR(Current Program Status Register)描述当前处理器状态的寄存器。 如上图就是ARMv7的寄存器描述表,在每种处理器模式下各个寄存器都有不同的含义。 在USER模式下,R0-R15是通用寄存器用来存储数据 当比如发生IRQ时,处理器会切换到IRQ模式。 ARMv7在后期为了支持虚拟化,引入了HYP模式,为了兼容ARMv8引入了ELR_hyp寄存器,用于从异常状态返回。 因为ARMv8-A是兼容ARMv7的32位应用程序的,当在ARMv8-A中运行32位应用程序发生了异常,则寄存器的map如下 ?
经验总结: 手机指令集主要跟芯片相关,如果是c端,就默认是arm芯片了,也只有arm芯片才有armv7和armv8之分。 armv7: 一般偏低端机才有armv7,而armv7 是可以优化的。 模型一般在armv7上跑得较慢,而MNN现在对armv7不能加速。但是据说抖音的都跑在armv7上,且还能加速。 armv8 比armv7大概10%~20%的收益,一般能用v8,就不用v7。 MNN量化之后armv8大概比armv7快一倍。 tnn的armv8做的还可以,v7这块笔者不太了解,关注得比较少。
lipo -create -arch armv7 armv7/libavcodec.a -arch armv7s armv7s/libavcodec.a -output libavcodec.a xcrun -sdk iphoneos lipo -create -arch armv7 armv7/libavdevice.a -arch armv7s armv7s/libavdevice.a -output -output libavfilter.a xcrun -sdk iphoneos lipo -create -arch armv7 armv7/libavformat.a -arch armv7s armv7s/libavformat.a -output libavformat.a xcrun -sdk iphoneos lipo -create -arch armv7 armv7/libavutil.a -arch armv7s armv7s/libavutil.a -output libavutil.a xcrun -sdk iphoneos lipo -create -arch armv7 armv7
,或者armv7s架构,(iphone4真机/armv7, ipnone5,iphone5s真机/armv7s) 真机64位处理器需要arm64架构。 当该选项设置成YES时,你连上一个armv7指令集的设备,就算你的Valid Architectures和Architectures都设置成armv7/armv7s/arm64,还是依然只会生成一个armv7 我们的项目之前支持的指令集是armv7/armv7s,后来改成只支持armv7后,比原来小了10MB左右。 目前AppStore上的一些知名应用,比如百度地图、腾讯地图通过反汇编工具查看后,也都只支持armv7指令集。 根据向下兼容原则,armv7指令集的应用是可以正常在支持armv7s/arm64指令集的机器上运行的。
armv6, armv7, armv7s, arm64 是ARM CPU的不同指令集,原则上是向下兼容的。 如iPhone4S CPU支持armv7, 但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。 同理iPhone5 CPU支持armv7s,它虽然也兼容armv7,但是却无法进行相关的优化。 armv6设备:iPhone, iPhone2, iPhone 3G,第一代、第二代iPod Touch armv7设备:iPhone 3GS, iPhone 4, iPhone 4S 如果在工程Build Setting的Architectures 中的“Build Active Architecture Only”选择为YES,则即使你设置成armv7 , armv7s同时支持,也只会编译对应指令集的包
armv6, armv7, armv7s, arm64是ARM CPU的不同指令集,就像CPU内潜入的软件版本。 armv7, armv7s, arm64。 $(ARCHS_STANDARD_32_BIT) XCode 5和5.1中都为armv7, armv7s,旧一点的版本中应该对应的就只有armv7。 $(ARCHS_STANDARD_INCLUDING_64_BIT) XCode 5和5.1中都为armv7, armv7s, arm64 如果程序中设置的Architecture为armv7,当使用 target中都只默认添加armv7一个项)。
ARMv6设备包括 iPhone, iPhone2, iPhone3G以及第一代和第二代iPod Touch ARMv7设备包括 iPhone3GS, iPhone4 iPad, iPad2, the new ipad iPod touch 3G, iPod touch 4 ARMv7s设备包括iPhone5 arm64 包括iphone5s armv6、armv7、armv7s、arm64是arm CPU的指令集,原则上是向下兼容的,如:iPhone4sCPU支持armv7,但它会兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。 iphone5CPU支持armv7s,它也会兼容armv7。
目前ios的指令集有以下几种: armv6 iPhone iPhone2 iPhone3G 第一代和第二代iPod Touch armv7 iPhone4 iPhone4S armv7s iPhone5 iPhone5C arm64 iPhone5S 机器对指令集的支持是向下兼容的,因此armv7的指令集是可以运行在iphone5S的,只是效率没那么高而已~ ===== 因此,Architecture的值选择:armv7 armv7s arm64 PS:选arm64时需要最低支持5.1.1: Convert Your App to a 64-Bit Binary After ). 1,如果想自己的app在各个机器都能够最高效率的运行,则需要将Build Active Architecture Only改为NO,Valid architectures选择对应的指令集:armv7 2,如果想让app体积保持最小,则现阶段应该选择Valid architectures为armv7,这样Build Active Architecture Only选YES或NO就无所谓了 发布者:全栈程序员栈长
Armv6、armv7、armv7s、arm64都是arm处理器的指令集,所有指令集原则上都是向下兼容的,如iPhone4S的CPU默认指令集为armv7指令集,但它同时也兼容armv6指令集,只是使用 armv6指令集时无法充分发挥其性能,即无法使用armv7指令集中的新特性,同理,iPhone5的处理器标配armv7s指令集,同时也支持armv7指令集,只是无法进行相关的性能优化,从而导致程序的执行效率没那么高 第三种情况 Architectures: armv6, armv7 Valid Architectures: armv6, armv7s, arm64 生成二进制包支持的指令集: armv7 arm64) 同样的,若Architectures列表为armv7,则会选取armv7作为目标指令集,若Valid Architectures列表中包含了armv7指令集,则能够成功生成二进制包, 其支持的指令集只有armv7,若Valid Architectures列表中不包含armv7,则编译失败。
ARMv7 与 ARMv8的处理器架构自己一直没有详细了解过,现在来学习一下,在arm community 中文社区看到一个不错的总结。 两者之间的区别主要如下: ARMv8指令集分为Aarch64和Aarch32指令集,而ARMv7使用的是A32和T16指令集(分别为32位和16位)。
HTC One M7 htc-m7 armv7 2013 Y P P HTC One M8 htc-m8 armv7 2014 Y Y Y Y Y Y Y armv7 2012 Y Y Y Y Y P HTC One V htc-primou armv7 2012 Y Y - HTC One X+ htc-endeavor-c2, htc-enrc2b armv7 2012 N Y Y HTC One XL htc-evita armv7 2012 Y Y armv7 2014 Nokia Lumia 625 nokia-max armv7 2013 grub is loaded Nokia Lumia 920 nokia-phi armv7 2012 Sony Xperia P sony-nypon armv7 2012 Sony Xperia SP sony-huashan armv7 2013 Boots up.
SM865使用的是ARMv8-A架构,Cortex-A77的core ARMv4到ARMv7都是只支持32位,从ARMv8-A开始支持64位,就是我们常说的AArch64。 同时ARMv8也为了兼容ARMv7的应用,也支持32位 虚拟化(Virtualization)也是在ARMv7后面开始引入,在ARMv8-A已经开始全面支持 TrustZone技术在ARMv7和ARMv8 ARMv8-A相对于ARMv7架构都有啥区别呢: ? 在ARMv7架构下只能访问最大4GB的地址空间,而在ARMv8-A可以访问更大的地址空间。 -A首次引入了Exception Level的概念,在ARMv7下使用的是PL0, PL1, PL2。 ARMv8-A下使用了30个通用寄存器,ARMv7下只有15个通用寄存器 ARMv8-A增加了TLB的大小,减少TLB MISS的概率 ARMv8-A架构完全支持ARMv7架构下的应用程序 等等等 下面的几节文章从以下几个模块分析
Cortex系列属于ARMv7架构,这是到2010年为止ARM公司最新的指令集架构。 (在2011年,ARMv8架构在 TechCon上推出) ARMv7架构定义了三大分工明确的系列: “A”系列:面向尖端的基于虚拟内存的操作系统和用户应用; “R”系列:针对实时系统; “M”系列:对微控制器 即:由于应用领域不同,基于ARMv7架构的Cortex处理器系列所采用的技术也不相同,基于ARMv7A的称为Cortex-A系列,基于ARMv7R的称为Cortex-R系列,基于ARMv7M的称为Cortex-M ARM在最初的处理器型号都用数字命名,最后一个是ARM11系列,在应用ARMv7架构后,推出了Cortex这一系列,老式的则命名为Classic系列。
/SnapshotData/armv7 echo "编译数据段" xcrun cc -arch armv7 -c $armv7/IsolateSnapshotData.S -o $armv7/HeadIsolateData.dat xcrun cc -arch armv7 -c $armv7/VmSnapshotData.S -o $armv7/HeadVMData.dat # 去掉多余头部 tail -c +313 $armv7 /HeadIsolateData.dat > $armv7/IsolateData.dat tail -c +313 $armv7/HeadVMData.dat > $armv7/VMData.dat #初始化目录 armv7=./SnapshotData/armv7 arm64=. -c $armv7/IsolateSnapshotData.S -o $armv7/HeadIsolateData.dat xcrun cc -arch armv7 -c $armv7/VmSnapshotData.S
64 Bit) OpenSUSE/SUSE Windows Mac Docker ARM Ubuntu/Debian(ARM64) Ubuntu/Debian(ARMv6) Ubuntu/Debian(ARMv7 ) Standalone Linux Binaries(ARM64) Standalone Linux Binaries(ARMv6) Standalone Linux Binaries(ARMv7) Red Hat/CentOS/RHEL/Fedora(ARMv64) OpenSUSE/SUSE(ARM64) Red Hat/CentOS/RHEL/Fedora(ARMv7) OpenSUSE/SUSE (ARMv7) 包安装方式 下载 Grafana 的包 这里分为 OSS 和 Enterprise 版本,前者为开源版本,而后者为付费版本,如果仅仅是想用开源版本两者皆可,但如果需要商业版本,需要下载后者
当然了ARMv7也存在同样的特权级别,只不过名字是用PL定义的。 先来看下ARMv8的Exception Level的定义: ? ? 当noraml world想要访问Secure world需要发送SMC指令进入Secure Moniter层,然后进入到Secure world 而在ARMv7中使用的是Privilege level 在ARMv7的后期已经开始引入了ARM TrustZone技术了。 所以在ARMv7中也分为了两种状态,分别是Noraml World Normal World PL0 (UserSpace空间) PL1(kernel OS, 比如linux OS) PL2(Hyp SecureWorld: PL0 (UserSpace 比如TA应用) PL1 (Trusted OS,比如QSEE,OP-TEE) 无PL2,Secure Moniter也是运行在PL1阶段的 本节描述了ARMv7
参考维基百科 指令集对应设备 Architecture 指令集 对应设备 说明 armv6 iPhone、iPhone 3G、iPod 1G/2G 32位,09年之前出的iOS设备 armv7 iPhone (比如:你的设备是armv7s指令集,那么它可以兼容运行比armv7s版本更低的指令集:armv7、armv6,只是使用armv6指令集时无法充分发挥其性能,即无法使用armv7指令集中的新特性) Xcode4.5 苹果的A7处理器支持两个不同的指令集: 32位ARM指令集(armv6、armv7、armv7s) 64位ARM指令集(arm64) 另外: i386:通常被用来作为Intel 32位微处理器的统称。 参考: CPU Architectures iOS 指令集架构 armv6、armv7、armv7s、arm64、arm64e、x86_64、i386 Xcode 12 Release Notes iOS 指令集架构Architectures armv6、armv7、armv7s、arm64、arm64e、x86_64、i386 iOS和iPadOS设备列表
conan:支持android NDK (armv7,armv8,x86,x86_64)交叉编译的统一profile jinja2模板 上一篇博客《conan入门(十六):profile template 如果针对不同的Android目标平台(armv7,armv8,x86,x86_64)都要维护一个profile也是挺麻烦的。 本文在此基础上,更进一步改进将android NDK 对不同平台armv7,armv8,x86,x86_64交叉编译的profile基本于同一个模板统一实现 android_clang.jinja 如下是基于 android.toolchain.cmake, 如果不指定ANDROID_ABI和 ANDROID_NATIVE_API_LEVEL或ANDROID_PLATFORM环境变量, 默认编译的目标平台 armv7 1.78.0@ -pr:h android_clang.jinja -pr:b default --build missing 独立模板 如果觉得每次编译要多设置一个环境变量还是有点麻烦,那可以如下为armv7