x86架构基础知识学习

发布时间 2023-04-17 00:30:24作者: 这知识他不进我的脑子

计算机工作模式

CPU通过总线和各个设备连接,CPU主要用于运算,内存负责保存中间结果,其他还有一些网卡、显卡、硬盘等组件。最重要的就是CPU和内存。

CPU的三部分:运算单元,数据单元,控制单元

运算单元:只负责算,加法、位移等操作。

数据单元:减少去内存拿数据的步骤,存少量的数据在cpu中方便下次立即计算。一般包括内部缓存寄存器组,空间小,速度快。

控制单元:取出指令,然后执行指令。例如取出数据然后计算再将数据保存到某个地方。

指令指针寄存器:存放下一条指令在内存中的地址,然后将指令取出来放入寄存器,拆分成两部分,一部分是操作指令,一部分是数据,分别交给运算单元和数据单元。算完之后将结果暂存寄存器执行下一条指令。

进程切换保障:专门有两个寄存器类记录代码段和数据段的起始地址。

总线:其实分为地址总线数据总线。总线位数越多,地址总线访问的地址范围就越广,数据总线拿数据访问次数减少,效率提升。

8086的原理

数据单元:存在8个16位通用寄存器,分别是AX,BX,CX,DX,SP,BP,SI,DI。用于暂存计算过程中的数据。其中AX,BX,CX,DX拆成两个8位寄存器使用,其中H表示高位(High),L表示低位(Low)。

控制单元:主要分为CS,DS,SS,ES,IP等其他寄存器。

IP:指令指针指令寄存器,用于指向代码段中下一条指令的位置。随后将指令从内存拿到cpu的指令队列缓存器中。

CS:代码段起始地址寄存器。

DS:数据段起始地址寄存器。

SS:栈寄存器,和函数调用相关的都会用到它。

​ 其中,获取一条准确的指令地址就是“CS*16+IP”,可以看成是起始地址+偏移量,这个 ""* 16"其实就是左移4位到高位的操作。同理,数据获取的准确地址也是“DS*16+偏移量”,数据段的偏移量一般放在通用寄存器中。所以刚好是20位。

​ 同时要注意,最大只能访问20位的地址。一个最大的大小也是2^16=64k

升级到32位处理器-向前兼容

​ 除了段寄存器的未兼容外,其他都完成了向前兼容。

​ 因为段寄存器存储的是数据段和代码段的起始地址,在后续的预算中是左移4位扩展,因此导致段的起始地址必须是整除16的地方。

​ 32位处理器重新定义了段寄存器的起始地址。现在段的起始地址都存放在内存的某个地方,用一张表来维护,表中的每一项的信息称为段描述符(Segment Descriptor),其中就保存着段的起始地址。这样解决了“段的起始地址必须是整除16的地方”的问题。而DS、CS保存的起始地址就变成了段描述符中的哪一项,称为选择子(Selector)。同时,段寄存器会从内存中拿到CPU的高速缓存器中加速。

​ 唯一的缺点是不兼容原来的老模式,因此分为了两种模式:实模式(Real Pattern)保护模式(Protected Pattern)。在系统刚启动时为实模式,当需要更多内存的时候会切换到保护模式,形成向后兼容。

总结

可以去了解一些汇编命令:mov, call, jmp, int, ret, add, or, xor, shl, shr, push, pop, inc, dec, sub, cmp。

推荐内容《汇编从零开始到C语言》,Guide to x86

参考资料

极客时间趣谈linux操作系统《06 | x86架构:有了开放的架构,才能打造开放的营商环境》