打印

ARM系统编程

[复制链接]
23281|131
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinzha|  楼主 | 2012-9-11 22:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
混乱了一年之后,终于可以去做一份稳定的工作,不过这次是要回归MIPS阵营,也不知道今后会不会有机会再去做ARM相关的工作了。于是想记录下来做arm这些年的心得,为了逼自己去写,就在这儿用连载的方式吧,只要闺女允许,我就会尽量更新。在写的过程中只会参考arm的标准文档,如有跟其他介绍arm冲突的地方,请不吝赐教。
今天先写前言,明天正式内容。【版权所有 翻录必究】

相关帖子

沙发
mohanwei| | 2012-9-11 22:55 | 只看该作者
庞大的一个开始……
先坐沙发

使用特权

评论回复
板凳
sfpxfpcfp| | 2012-9-11 23:10 | 只看该作者
MIPS阵营欢迎你

使用特权

评论回复
地板
hemporer| | 2012-9-12 07:00 | 只看该作者
今天可以开始了
很多网友期待中

使用特权

评论回复
5
阿南| | 2012-9-12 07:51 | 只看该作者
支持+监督

使用特权

评论回复
6
xinzha|  楼主 | 2012-9-12 10:05 | 只看该作者
本帖最后由 xinzha 于 2013-7-7 09:32 编辑

ARM的历史以及有哪些种类的内核就不必再赘述,我们就直接从ARM7,指令集V4讲起。
  关于ARM到底属于什么类型的CPU,一直以来说法不一,有说他们是RISC(至少他们自己这么认为,Advanced Risc Machines),也有说他们是类RISC的。
  说类RISC的理由就是ARM的指令并不是定长的,而且并没有实现真正的流水线。当然这些区别现在已经变得越来越不重要,甚至两个领域都在互相渗透,比如MIPS的14K和24K系列已经引入了16位指令,而较新的ARM架构也已经开始支持乱序执行。
  可能有人会反驳,怎么可以这么说呢?ARM7中实现了三级流水线!请注意,这里所说的是真正的流水线,如果能对MIPS有所了解或者看过MIPS阵营的经典著作《see mips run》,就能明白真正意义的流水线的含义。在RISC领域有一个概念叫做delay slot,也就是我们所说的延迟槽,出现这个概念的原因是因为在RISC中,绝大多数指令的执行时间是可预测的,就是一个周期,而有些指令譬如load,jmp之类的无法在一个周期内完成,这样就造成一个问题,在执行jmp,load时,处于译码阶段的指令就要多等一个周期,等前面的指令执行结束它才能进入执行阶段(早期的ARM就是采用这种方式)。而在真正的流水线架构中,遇到这种情况,可以把jmp,load之后的指令在jmp,load进入执行阶段准备但是没有真正执行的时候提前执行,这样就节省了之前被浪费的那个周期。处于延迟槽中被提前执行的指令必须是对后续指令无害的,这个由编译器来决定,当无法插入无害指令时,编译器会向其中插入NOP。在你确信自己明确知道自己要做什么可以用类似于.set noreorder这样的说明来禁止编译器重新排序。
  千万不要小看这个周期,因为在真正的执行中,内存读写以及跳转操作随处可见,这点效率的提升导致了MIPS在整数运算性能上的优势。

使用特权

评论回复
7
xinzha|  楼主 | 2012-9-12 10:27 | 只看该作者
感谢各位捧场,由于是想到哪儿写到哪儿,可能会比较乱,也希望兄弟们能参与讨论,提出自己感兴趣的话题。

使用特权

评论回复
8
阿南| | 2012-9-12 11:07 | 只看该作者
楼主按自己的思路讲。如果可能,希望你能给新手们讲讲自己在这方面的学习、工作经历,经验心得体会等。

使用特权

评论回复
9
xinzha|  楼主 | 2012-9-12 14:05 | 只看该作者
我的经历简单得很,上学时老师的项目和师弟帮忙找的私活,51,96,pic的简单控制电路和汇编程序,毕业后进入华为,开始学习的c和mips,当时负责基于MIPS/VxWorks的bsp和驱动,得感谢Broadcom的FAE送给我们的一本《See MIPS Run》,从这本书开始才真正把学过的计算机体系结构和软硬件结合到一起。再后来进入一家IC外企,做基于MIPS/Nucleus的bootloader,BSP和驱动,从这开始对操作系统有点接触,在华为时由于分得太细,没能够对VxWorks更多了解。再后来转战ARM,ucos,linux,固件,芯片验证等等,这才开始每天跟cpu核心打交道,也对操作系统更加深入,目前是要回到一个老东家那里继续做mips。
我运气好的地方是正好工作内容基本上都是我每个阶段想接触的东西,没有参加过任何任何培训,几本好书加上官方文档陪伴着走过这段职业生涯。所以很多时候别人问我怎么学我都不知道怎么回答,因为没有为了学而学过,都是工作需要。
实际回过头来看看,两大块知识对于嵌入式至关重要,一个是计算机体系结构,一个是操作系统原理,囊括了我个人目前见到的所有东西,都脱不出这个范畴。至于各种接口,都是比较分散的知识点,需要花时间去学习掌握。

使用特权

评论回复
10
阿南| | 2012-9-12 14:09 | 只看该作者
推荐几本好书吧

使用特权

评论回复
11
SF小小白| | 2012-9-12 17:24 | 只看该作者
对啊,推荐几本书吧

使用特权

评论回复
12
xinzha|  楼主 | 2012-9-12 17:29 | 只看该作者
而支持ARM属于RISC的理由在于四点:
1. 使用了精简指令集,Reduced Instruction Set Computer,虽然ARM的指令相对其他RISC比还是算多的,但毕竟出于可接受范围,不像x86那样浩瀚无穷。RISC的目的就是让硬件尽量简单,更多的处理交给编译器和软件,这样就可以让kernel结构简单,比较容易实现低功耗高频率。
2. 实现了一定程度的流水线,学过51的人应该还记得51的工作方式,指令都是一条一条地取指译码执行,只有上一条指令执行结束,下一条指令才能进入取指阶段。
3.ARM核心中有较多的通用寄存器,总共有31个(不算状态寄存器),但是它们并不能同时存在,有些寄存器是模式专有的,只有处理器处于那种模式才能够对其进行操作,术语称为Banked,在固定模式下可见的通用寄存器的个数是16个。
4.采用了Load-Store的工作方式,所谓的Load-Store方式,也就是说一切的计算操作都只针对寄存器,内存中的数据需要先load到寄存器,进行计算之后再store回内存。而在cisc中,内存数据是可以直接参与计算的,这是双方一个巨大的差别。

使用特权

评论回复
13
wangdongbin| | 2012-9-12 17:33 | 只看该作者
兄弟**写,写出你自己的心得、体会、及知识点,这正是我们需要向你学习的。

使用特权

评论回复
14
864| | 2012-9-12 18:24 | 只看该作者
慢慢听课

使用特权

评论回复
15
huanben| | 2012-9-12 20:31 | 只看该作者
我顶,内容很通俗易懂哦。。。

使用特权

评论回复
16
huanben| | 2012-9-12 20:32 | 只看该作者
个人经历也是娓娓道来,舒服。。

使用特权

评论回复
17
xinzha|  楼主 | 2012-9-12 21:54 | 只看该作者
本帖最后由 xinzha 于 2013-7-7 09:38 编辑

个人所看过的好书,最推崇的是《See Mips Run》第二版,结合linux对mips做了非常全面而且深刻的讲解,而你从这本书中得到的将不仅仅是linux和mips,涉及到了很多操作系统以及计算机体系结构的共通问题。推荐看英文版。
做软件开发到一定程度,不管你是做了项目管理还是研发,都会不可避免地用到脚本语言去写一些自动化的工具,因为身处芯片行业,所以用的就是perl,推荐读《perl语言入门》和《intermediate perl》就可以处理大多数问题,这一系列中的《精通perl》没有读,因为没到那个层次。
如果有兴趣有精力强烈推荐《精通正则表达式》这本书,尽管属于杂项,但是对于软件人员来说,读过这本书绝对令人心旷神怡,你在vi,ue,makefile甚至arm的scatter和gcc的ld中到处可以见到它的身影,读懂了正则表达式,就会明白这些工具中生涩难记的命令原来也是有规则可循,他们都在遵循着正则表达式。
那本《操作系统原理与设计》(好像是这么叫的)如果只是翻翻会很无聊,甚至你会觉得都不如《深入linux内核》好,而你要是能够一字一句的看进去,就会发现前者是理论的高度,后者只是在实现层面略作讲解。
至于软件工程方面的书,《人月神话》和《解析极限编程》对我启发更大,《代码大全》和《人件》就没有太多感觉了。
今年又看了Robert Love的《Linux系统编程》和《unix环境高级编程》(简称apue),尤其是apue,绝对是具体技能学习的经典。
正在看一本《具体数学》,是高德纳伙同另外两位高手撰写,让人对数学开始产生兴趣。

使用特权

评论回复
18
xinzha|  楼主 | 2012-9-13 11:52 | 只看该作者
本帖最后由 xinzha 于 2013-7-7 09:53 编辑

了解流水线对于软件人员来说,一个比较重要的意义就是当出现问题时,能够精确定位到产生问题的那句话。但是有些情况是例外的,体制上就不能保证精确定位,比如说有write buffer的时候,你的写指令即使是发生了错误,也是在数个周期之后才会激起异常,为了速度匹配问题,写数据会通过write buffer对RAM进行操作,将cpu释放出来就执行其他指令以提高效率,发生异常的时刻已经同发出写指令的时刻不匹配了。注意,write buffer同cache的机制是不一样的,cache完全是可控的,write buffer一旦使能,它的运行对于cpu和软件来说则是不透明的。在某些重要的点上需要确保所有指令都已经完整执行,并且所有的内存读写都已经真正完成。新的ARM体系中提供了DMB,DSB和ISB等指令来完成这样的屏障功能。
  当发生异常的时候,犯罪分子和发生异常时所在模式的pc的匹配关系如下:
  Data abort  pc - 8,因为data abort只有进入执行阶段才能被发现,这时第三条指令已经被取指。
  IRQ             pc - 8,IRQ发生时刻不可预知,在当前指令执行完之后响应,所以pc也是第三条的地址。
  FIQ             pc - 8,原理同上。
  Prefetch Abort pc - 4,这个最绕,是预取指时发生错误造成的,但是如果这条指令不进入执行阶段就不会造成异常,比如说前面一条是jmp。所以我猜测在它进入执行之前,kernel已经知道出错,pc不再更新,保持为它下一条指令的位置。
  SWI和UNDEF和上一条一样,都是在译码阶段kernel已经知道会发生异常,不再更新pc,但是进入执行阶段才会激起异常,所以异常地址也都是pc-4.

使用特权

评论回复
19
只听风吟| | 2012-9-13 16:52 | 只看该作者
不错不错,,占楼。。。

使用特权

评论回复
20
xinzha|  楼主 | 2012-9-13 17:36 | 只看该作者
今天正式提出离职,所以接下来的一个月,除了国庆假期外,其他时间能比较安心地理顺下思路,好好想想该写点什么。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:自制,效率

10

主题

950

帖子

7

粉丝