冯·诺依曼体系结构和图灵机

冯·诺依曼体系结构

美籍匈牙利数学家冯·诺依曼于1946年提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。 冯·诺依曼体系结构冯·诺依曼理论的要点是:计算机的数制采用二进制;计算机应该按照程序顺序执行。人们把冯·诺依曼的这个理论称为冯·诺依曼体系结构。

体系结构

(1)采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中,数据和程序在内存中是没有区别的,它们都是内存中的数据,当EIP指针指向哪 CPU就加载那段内存中的数据,如果是不正确的指令格式,CPU就会发生错误中断. 在现在CPU的保护模式中,每个内存段都有其描述符,这个描述符记录着这个内存段的访问权限(可读,可写,可执行).这就变相的指定了哪些内存中存储的是指令哪些是数据)。指令和数据都可以送到运算器进行运算,即由指令组成的程序是可以修改的。(2)存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。(3)指令由操作码和地址组成。操作码指明本指令的操作类型,地址码指明操作数和地址。操作数本身无数据类型的标志,它的数据类型由操作码确定。(4)通过执行指令直接发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。指令计数器只有一个,一般按顺序递增,但执行顺序可按运算结果或当时的外界条件而改变。(5)以运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。(6)数据以二进制表示。

特点

(1)计算机处理的数据和指令一律用二进制数表示(2)顺序执行程序(3)计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。

瓶颈

程序内存和数据内存之间的共享总线导致了冯诺依曼瓶颈,即中央处理器(CPU)和内存之间的有限吞吐量(数据传输速率)与内存的数量相比。因为单个总线一次只能访问两类内存中的一种,所以吞吐量低于CPU的工作速率。当CPU需要对大量数据执行最小的处理时,这严重限制了有效的处理速度。CPU不断地被迫等待所需的数据被传输到或从内存中。由于CPU速度和内存大小的增长速度比它们之间的吞吐量增长速度快得多,瓶颈已经成为一个更大的问题,这个问题的严重性随着新一代CPU的出现而增加。

图灵机

图灵机,又称图灵计算、图灵计算机,是由数学家艾伦·麦席森·图灵(1912~1954)提出的一种抽象计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人们进行数学运算。

图灵机的基本元素

带:是存储装置,两端是无穷的且被划分成无穷的方格,每个方格可以存一个符号;控制器:有有限个状态;读写头:主要功能是读带上的符号,写带中的方格。

图灵机的基本思想

图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看作下列两种简单的动作:
在纸上写上或擦除某个符号;把注意力从纸的一个位置移动到另一个位置;
而在每个阶段,人要决定下一步的动作,依赖于 (a) 此人当前所关注的纸上某个位置的符号和(b) 此人当前思维的状态。
为了模拟人的这种运算过程,图灵构造出一台假想的机器,该机器由以下几个部分组成:1.一条无限长的纸带 TAPE。纸带被划分为一个接一个的小格子,每个格子上包含一个来自有限字母表的符号,字母表中有一个特殊的符号 表示空白。纸带上的格子从左到右依此被编号为 0,1,2,... ,纸带的右端可以无限伸展。2.一个读写头 HEAD。该读写头可以在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。3.一套控制规则 TABLE。它根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态。4.一个状态寄存器。它用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。

基本图灵机

一个基本Turing机M由下述七部分组成:
状态集\(Q\),它是非空有限的集合;带字表\(C\),它是非空有限的集合动作函数\(\delta\),\(Q\mathrm{x}C\rightarrow {C\cup{L,R}}\mathrm{x}Q\)空白符\(B\in C\);输入字母表\(A\subseteq C-{B}\);控制器的初始状态\(q1\in Q\);接受状态\(F\subseteq Q\),\(F\)中的元素叫做接受状态。记作\(M =(Q,A,C,\delta,B, q_1,F)\),缩写为\(TM\).

区别与联系

图灵机是为了探索可计算问题的数学领域,并获得描述这些计算的方法而发明的理论概念。冯-诺伊曼体系结构是一种用于构建实际计算机的体系结构(实现图灵机器理论上描述的内容),是一种实现通用图灵机的计算设备。
“程序=指令+数据”
我认为指令构成了方法,数据就像原材料,将方法运用到原材料上能达到我们期望的目的,这就是程序。比如你想实现一个图片识别的程序,图片是数据,实现图片识别的方法时指令,这两者缺一不可,缺少一个都只能干瞪眼,什么都做不了。
安全问题

缓冲区溢出

缓冲区溢出的基本原理就是,计算机程序向特定缓冲区内填充数据时,超出了缓冲区本身的容量,导致溢出的数据覆盖了相邻内存空间的合法数据,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
缓冲区溢出攻击发生的根本原因在于,现代计算机系统的基础架构冯诺依曼体系本质存在的安全问题,即采用了“存储程序”的原理。因为数据和程序都存储在同一内存中,所以可以通过缓冲区溢出漏洞,通过溢出与存储程序内存相邻的存储数据的内存,达到覆盖存储程序的内存的效果,从而把这部分被覆盖的程序内容注入了恶意的攻击指令,达到攻击的目的。

XSS攻击

XSS攻击的原理是,利用了WEB应用程序对用户输入内容的安全验证与过滤不够完善,导致用户的输入内可以包含HTML、JavaScipt及其他脚本代码,可能会让恶意代码逻辑包含在服务器动态产生和更新的网页中,导致其他用户访问网页时下载并执行了恶意脚本,受到攻击。黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。

SQL注入攻击

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

共同点

由上面三部分对缓冲区溢出、XSS攻击、SQL注入攻击的原理的分析,可以发现共同点,它们都是利用了漏洞,将恶意代码通过某种方式注入了目标,然后执行恶意代码达到攻击的目的。因此防范的方法,应该在于,如何防止这些代码被注入,应该有一个更安全的检查机制,杜绝这些代码的注入。比如对于XSS攻击,针对编译器可以引入缓冲区的边界保护机制,杜绝溢出的发生,也就杜绝了恶意代码的注入。比如XSS攻击,对于用户的输入检查,过滤掉可能的脚本代码,对于SQL,同样增强过滤掉可能的SQL语法。

抽象出统一的防范方法

加入一个检查过滤机制,杜绝对于可能发生代码注入情况的发生。
参考

链接

书籍

图灵的秘密:他的生平、思想及论文解读,Charles Petzold (作者) 杨卫东 , 朱皓 (译者)
网络攻防技术与实战,诸葛建伟