内存是由地址组成的,cpu以内存能够听懂的语言(通信协议)对内存说:“1号内存地址,把你里面存的数据传给我(发送地址)”。内存听懂之后就会通过数据总线,把里面的数据传给cpu。cpu收到之后进行运算,改了这个值之后,又对内存说:“1号内存地址,我要给你发数据,接着”。内存听懂之后就会把数据总线发来的数据存到内存单元里面。
哈佛结构 数据和程序分开存储,数据存在一个内存里面,程序存在另一个内存里面。但是总线太多降低了效率。
改进版的哈佛结构 数据和程序也是分开存储,但是和哈佛结构相比,改进版的哈佛结构共用数据总线和地址总线。因为发地址的时候可以区分开不同的内存,比如存数据的内存从1-1000号,存程序的内存从1001-2000号,这样cpu 喊1号 ,存数据的内存就知道cpu要读写数据了。cpu 喊1001号 存数据的内存假装听不到,而存程序的内存知道要读程序了,就会把一条程序传给cpu 。
总结:通过对比可以发现 冯诺依曼结构 由于数据和程序存储在同一块内存中,程序运行的时候有可能会被更改。而哈佛结构程序运行之后是不会被更改的,只有数据被更改,cpu只能读取程序。只有程序结束运行,重新编译、链接、生成程序的时候才能改变程序,运行的时候cpu无法改变。
以上模型图都是省略cache等情况的,最简单的理论模型。可以更好的理解程序运行的原理,如有错误欢迎指正,比如箭头的方向,感激不尽!
那么问题来了:从软件安全角度来讲,是否可以认为 哈佛结构比冯诺依曼结构 更安全?