草庐IT

【ARM体系结构】之数据类型约定与工作模式

编程远泊 2024-07-19 原文

1、RISC和CISC的区别

1.1 RISC : 精简指令集

使用精简指令集的架构:ARM架构	RISC-V架构	PowerPC架构	MIPS架构

	ARM架构 :目前使用最广泛的架构,ARM面向的低端消费类市场
	RISC-V架构 :第五代,精简指令集的架构, RISC-v架构开源,
    PowerPC架构 :Powerpc芯片凭借其出色的性能和高度整合和技术先进特性在网络通信应用,工业控制应用,家用数字化,网络存储领域,军工领域,电力系统控制等都具有非常广泛的应用。
    MIPS架构 : MIPS处理器在数字电视、网络应用、机顶盒、ADAS、物联网等领域有广泛应用。
    
RISC : 精简指令集特点:
	精简指令集使用了一些比较常用,并且相对简单的指令
	作为精简指令集,
	精简指令集的指令的宽度和指令的周期固定。
	
	指令的宽度:将指令编译生成机器码之后,指令机器码占用内存空间的大小。
			ARM指令指令的宽度是32bits(4Byte).
	指令的周期:执行一条指令所需要的时间,ARM指令大多数都是单周期的指令。
			周期跟处理器的主频有关,T(周期) = 1s / F(主频)
    
linux@ubuntu:~/ARM$ arm-linux-gnueabihf-gcc -marm hello.c -o hello
	// arm-linux-gnueabihf-gcc : arm的交叉编译器,可以将程序编译生成ARM可执行程序
	// -marm : 编译生成arm的汇编指令
linux@ubuntu:~/ARM$ file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=43f6cb611fae0c48a9d0f69afa162ca9b4d01628, with debug_info, not stripped
linux@ubuntu:~/ARM$ arm-linux-gnueabihf-objdump -D hello > hello.dis 
	// arm-linux-gnueabihf-objdump交叉编译器中的反汇编的命令:
	// 将可执行程序反汇编生成反汇编文件,反汇编文件的后缀为.dis
000103d0 <main>:
内存地址     汇编指令机器码    反汇编指令
   103d0:	e92d4800 	push	{fp, lr}
   103d4:	e28db004 	add	fp, sp, #4
   103d8:	e24dd008 	sub	sp, sp, #8
   103dc:	e50b0008 	str	r0, [fp, #-8]
   103e0:	e50b100c 	str	r1, [fp, #-12]
   103e4:	e300044c 	movw	r0, #1100	; 0x44c
   103e8:	e3400001 	movt	r0, #1
   103ec:	ebffffbb 	bl	102e0 <puts@plt>
   103f0:	e3a03000 	mov	r3, #0
   103f4:	e1a00003 	mov	r0, r3
   103f8:	e24bd004 	sub	sp, fp, #4
   103fc:	e8bd8800 	pop	{fp, pc}

1.2 CISC : 复杂指令集

使用复杂指令集的架构:X86和X64架构,电脑的CPU一般使用的都是复杂指令集。

	复杂指令集更加注重指令的功能性,指令的周期和指令的宽度不固定。
linux@ubuntu:~/ARM$ gcc hello.c -o hello
linux@ubuntu:~/ARM$ objdump -D hello > hello.dis
	// objdump反汇编的命令:将可执行程序反汇编生成反汇编文件,反汇编文件的后缀为.dis
	
0000000000001149 <main>:
内存地址     汇编指令机器码           反汇编指令
    1149:	f3 0f 1e fa          	endbr64 
    114d:	55                   	push   %rbp
    114e:	48 89 e5             	mov    %rsp,%rbp
    1151:	48 83 ec 10          	sub    $0x10,%rsp
    1155:	89 7d fc             	mov    %edi,-0x4(%rbp)
    1158:	48 89 75 f0          	mov    %rsi,-0x10(%rbp)
    115c:	48 8d 3d a1 0e 00 00 	lea    0xea1(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
    1163:	e8 e8 fe ff ff       	callq  1050 <puts@plt>
    1168:	b8 00 00 00 00       	mov    $0x0,%eax
    116d:	c9                   	leaveq 
    116e:	c3                   	retq   
    116f:	90                   	nop

2、ARM数据类型的约定

2.1 ARM-v7架构的数据类型的约定

字节 		Byte		8bits(1字节)
半字		Half word	16bits(2字节)
字		 Word		 32bits(4字节)
双字		Double word	64bits(8字节)

2.2 ARM-v8架构的数据类型的约定

字节 		Byte		8bits(1字节)
半字		Half word	16bits(2字节)
字		 Word		 32bits(4字节)
双字		Double word	64bits(8字节)
四字 		Quad word   128bits(16字节)

3、ARM处理器的工作模式

3.1 Cortex-A7核的工作模式

Cortex-A核有9中工作模式,当ARM核处于不同的工作模式下执行的是不同的代码,
执行代码之后可以完成特定的功能。

安全监控模式:monitor mode ----> 运行安全相关的代码
HYP mode : 对虚拟化技术的支持

3.1.1 异常源

异常模式异常源备注
FIQ异常模式FIQ类型的异常源当发生FIQ类型的异常源,会导出处理器进入到FIQ异常模式下。FIQ类型的异常源指很多异常事件。
IRQ异常模式IRQ类型的异常源当发生IRQ类型的异常源,会导出处理器进入到IRQ异常模式下。IRQ类型的异常源指很多异常事件。比如按键中断,定时器中断…
SVC模式复位信号看门狗复位,上电复位,复位按键复位
软中断指令(SWI)执行软中断指令时也会让处理器进入到SVC模式下
Undef未定义异常模式Undef未定义异常源译码器翻译指令时失败,或者译码器不认识的指令
Abort异常模式data Abort取数据发生异常
Prefetch Abort取指令发生异常
导致处理器进入到对应的异常模式下的事件统称为异常源。

5种异常模式对应着7种异常源,异常源具有优先级,复位的优先级最高,FIQ的优先级高于IRQ。

3.2 Cortex-M4核的工作模式

Cortex-M4核有两种工作模式:
	线程模式:主要执行的是用户的代码及主函数内的代码
	异常模式:主要执行的异常代码,比如中断处理的代码,复位异常,硬件异常,按键中断......

有关【ARM体系结构】之数据类型约定与工作模式的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  7. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  8. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  9. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  10. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

随机推荐