计算机知识总结
二进制
数据是二进制表示,一个bit表示0和1,8个bit组成一个byte。
原码:最高位为符号位,其余位为数值本身的绝对值。 反码:正数的反码与原码相同 负数的反码符号位为1,其余位对原码取反。 补码:正数的补码与原码相同 负数的反码符号位为1,其余位对原码取反 + 1.
现在的机器大多使用补码形式对有符号数进行编码。
硬件组成
CPU,内存,IO(键盘,硬盘,网络等)。
访问IO设备的两种方式:
内存映射。CPU通过地址总线访问该内存区域时会落到外设的内存中,这种映射让CPU访问外设的内存如同访问主板上的物理内存。
IO接口。IO接口由一些寄存器组成,读写IO接口实质上就是读写寄存器。CPU只知道IO接口,外部设备也知道IO接口,彼此都直接和IO接口交互。
CPU
CPU执行指令,然后自动获取下一条地址的指令,然后重复上述过程,继续执行,继续取址。
Intel处理器中程序计数器 CS:EIP 中的值就是当前指令的地址,技术上当前指令机器码的大小就是下一条指令的地址。
进程
32位保护模式下内存寻址空间是0~4G。
全局变量在代码的数据区,局部变量(函数里面定义的)在栈里面。
虚拟地址空间:0~3G 是用户空间,3G~4G是内核空间。 用户空间栈从3G向下。
大端/小端 字节序
小端:低位低字节
大端:低位高字节
CPU指令集
call / ret
jmp
数字电路
振荡器 触发器 锁存器
电平触发是在高或低电平保持的时间内触发,而边沿触发是由高到低或由低到高这一瞬间触发
网络
集线器: 物理层的连接设备,放大电信号
网络适配器(针对网络的IO接口,例如显卡是针对显示器的IO接口,显卡对于的设备是显示器,网络适配器对应的抽象外部设备是网络, 网络适配器又称网卡)。
网络适配器有一个唯一的MAC地址。
网络适配器位于数据链路层。发送数据单位为一个帧(frame)。每个帧header位标识源和目的mac地址。网络适配器收到不属于自己的帧 会直接扔掉。
监控程序可以在兼容TCP/IP协议族的同时,做一些额外的监控功能。
IP层是靠软件实现的。
路由器必须保护网络适配器,而且必须实现IP层的协议。
TCP/UDP层为网络应用提供接口。
一个socket就像一个打开的文件描述符,用完了必须close。
内存:随机存储,速度一样
磁盘:物理移动,一次读取一个扇区(或者多个扇区),需要先物理寻址,速度小于内存一个数量级。
网络:获取速度又小于磁盘数量级。
汇编语言学习点包括机器指令,但是核心和诀窍是对内存寻址对深刻理解,搞清楚CPU计算出内存中要加载的指令和数据的地址。
总线:地址总线,数据总线,控制总线。
早起的CPU地址总线只有16位和20位,分别寻址范围是64KB和1MB,后来内存的容量远超这个大小。
为了保持兼容(涉及到操作系统和编译原理),让原来的二进制文件能在新的CPU上运行,CPU引入了段寄存器的概念。
段寄存器:CS(code segment),DS(data segment),SS(stack segment)。
通用寄存器:(E)AX,BX,SP等。
指令指针寄存器:(E)IP
标志寄存器: (E)FLAGS
三种主要的汇编模型:
实模式平面模型:只能使用前面64KB大小,没有段的概念,所有段寄存器的值都是0。
实模式段模型:段寄存器:偏移寄存器 确定真正的地址。
保护模式平面模型:通用寄存器32位,可以指向整个4GB地址空间中的任何位置,EIP大小也是32位。这种模式下,段寄存器的作用 是用来确定进程的4G空间出现在物理内存的什么地方。(比如物理内存大于4G,但是程序的寻址空间只有4G,或者物理内存小于4G, 程序的寻址空间也可以是4G)。
前两种模式都已经过时了。
段寄存器的作用是地址总线的宽度能够有一个寻址空间,而真实的物理内存大小可以小于或者大于这个空间。
指令周期:取址周期,间址周期,执行周期,中断周期。
CPU在每条指令执行阶段结束前都要发中断查询信号,以检测是否有某个I/O设备提出中断请求。
CPU执行用户态的代码时,一条指令和下一条指令之间可能会被中断,但是一条指令本身不能被中断(指令周期本身不会中断)。
一直有一个疑问,就是如果在关闭中断期间有新的中断到达,新中断是会被丢弃还是会在当前中断结束后立即响应?
答案是后者。
下面摘自http://linux.linti.unlp.edu.ar/images/0/0c/ULK3-CAPITULO4-UNNOBA.pdf (需要翻墙)
The PIC can be told to stop issuing interrupts that refer to a given IRQ line, or to resume issuing them. ●Disabled interrupts are not lost; the PIC sends them to the CPU as soon as they are enabled again.
●This feature is used by most interrupt handlers, because it allows them to process IRQs of the same type serially.