在哈佛结构的ARM上使用C语言进行开发时用到了指向函数的指针会不会出错

在现代的计算机体系结构上,不管是冯诺依曼结构还是哈佛结构,指令和数据在内存里并不区分,区别在缓存。ARM是哈佛结构,指令缓存和数据缓存是分开的,CPU只管从内存(不区分指令区和数据区)中加载指令到指令缓存,指令执行用到的数据加载到数据缓存。对CPU而言,同一块内存区域,既可以是指令,也可以是数据,无所谓指令区和数据区。pc寄存器指向哪儿,哪儿就是指令,指令执行时引用到的内存区域,就是数据。CPU可以从任意实现了内存读操作的硬件运行程序,不一定要加载到内存。比如NOR Flash,读操作是内存模式,写操作是端口模式,因此CPU可以从NOR Flash中直接加载指令执行;而NAND Flash,读、写操作都是端口模式,CPU不能直接执行,必须先加载到内存。另一方面,程序文件确实分代码段和数据段,不过这是给程序加载器在加载程序时指示用的,CPU不关心这些。内存页面也有读、写、执行的区分,这些是由MMU单元管理的,跟CPU也没关系。
■网友
ARM也是平坦地址模型的处理器。倒是AVR平台上要着重注意,因为AVR平台并不是平坦地址模型的设计。
■网友
指向代码的指针,它本身是一个数据。


    推荐阅读