20169203《Linux内核原理与分析》第二周作业
通过本周的学习,我更加具体的了解了计算机的工作原理,对于冯诺依曼体系结构主要为:
(1)采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中,(数据和程序在内存中是没有区别的,它们都是内存中的数据,当EIP指针指向哪 CPU就加载那段内存中的数据,如果是不正确的指令格式,CPU就会发生错误中断. 在现在CPU的保护模式中,每个内存段都有其描述符,这个描述符记录着这个内存段的访问权限(可读,可写,可执行).这就变相的指定了哪些内存中存储的是指令哪些是数据)指令和数据都可以送到运算器进行运算,即由指令组成的程序是可以修改的。
(2)存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。
(3)指令由操作码和地址组成。操作码指明本指令的操作类型,地址码指明操作数和地址。操作数本身无数据类型的标志,它的数据类型由操作码确定。
(4)通过执行指令直接发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。指令计数器只有一个,一般按顺序递增,但执行顺序可按运算结果或当时的外界条件而改变。
(5)以运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。
(6)数据以二进制表示。
对于冯诺依曼体系结构其中最主要的部分就是存储模块,可以说其他所有的模块都是围绕着存储模块来运转的,各个模块之中又有很小的存储单元寄存器,寄存器是存放临时数据的具有快速存储的特点,在汇编指令中可以看到系统之间的信息传递是通过寄存器的出栈入栈实现的,通过将一段c语言程序反汇编成汇编程序小实验可以让我有更好的理解。
首先在Linux中写一段C程序:
通过Linux中的编译命令将其编译为汇编指令:
我们可以先来分析g()函数,g()函数的一点段命令pushl是压入栈命令即将传入的x数值%ebp压入到寄存栈中,再通过movl将X值传递给%eax ,用addl指令使得X+6 最后将所得的结果通过popl出栈指令传递到main()中。
其中栈的变换情况如下
这里我有一个问题就是对于指令中的出栈入栈,不管是什么寄存器他的大小都是一定的计算机是通过什么机制确保数据入栈不会溢出的,是否是通过加入一个栈指针解决的,如果数据所要存入的寄存栈满了程序又要进行入栈操作那么这个时候计算机应当采取什么样的操作呢?是要将所要压入的数据储存的别的寄存器中吗?