#x86
##名称演变
+ X86架构是微处理器执行的计算机语言指令集,指一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合。
x86体系架构包含16位(8086)、32位和64位。
+ x86-32:表示32位的x86体系架构,该系列也被称为IA-32或i386,甚至直接使用x86来代表这种体系架构。该架构的第一款CPU为Intel 80386,它完全取代了16位x86架构的CPU。
+ x86-64:表示64位的x86体系架构。该架构由AMD公司首推,因此AMD将其称为AMD64。Intel随后也推出了64位的x86架构,将其称为Intel64。由于这两个64位的架构几乎相同,因此许多其他厂商使用不偏袒任何厂商的称呼x86-64来表示对这两个架构的兼容。该架构有时也被称为x86_64或x64,某些厂商也用AMD64或amd64同时表示Intel64和AMD64。
+ IA-32:表示英特尔32位元架构,英文全称为Intel Architecture 32-bit.它与x86-32表示同一种体系架构,只不过Intel现如今将x86-32称为IA-32。
+ IA-64:表示Intel与惠普合作开发的一种崭新的64位体系架构,它与x86架构不兼容。因此,IA-64与上面提到的x86-64或x64代表的含义不同。
+ i686:pentum ii以后的CPU都是i686的等级。
+ 奔腾、赛扬、酷睿
##x86/x64体系探索及编程
+ 小端序:MSB对应存储器高地址 x86/x64都使用的小端序
+ 求补码:左边第一位不为0的数字开始全部取反 + 1
+ x86/x64有3种精度浮点数,单精度、双精度和扩展双精度浮点数,IEEE754将浮点数存储为符号位、指数位和有效数位,指数位还用了校正值,
+ CISC 指令长度不固定
+ 0x7C00是 BIOS 将 MBR装载到的位置。操作系统亦或是引导程序的开发人员必须假设他们的汇编代码被加载到了这个地址,然后从这个
地方开始执行。32kb是符合(DOS)系统加载的最小空间,8086/8088 0x0 - 0x3ff用于中断向量和BIOS数据区域,引导扇区是512字节,boot 程序需要的数据/堆栈 大于 512 字节,因此,0x7c00, 32KB 的最后 1024B 被选中了。
+ 寻址模式:寄存器寻址、内存操作数寻址、立即数寻址 不支持内存到内存的直接存取操作
+ x86/x64实现了独立的64K I/O地址空间(0000H-FFFFH),使用IN和OUT指令访问
+ 逻辑地址就是程序代码中使用的地址,逻辑地址最终会被处理器转换为线性地址,这个线性地址在实模式和非分页的保护模式下就是物理地址;逻辑地址包含segment和offset两部分,在高级语言上如C中使用的是逻辑地址中的effective address部分(段内偏移地址);
+ nasm编译器的使用:nasm xx.asm 输出xx.o
+ boot程序最终加载到0x7c00处运行
+ 执行merge命令写入U盘后,U盘在Window上显示为0字节,但还能当启动盘用,应该格式化一下就会出来;
##汇编语言 王爽
+ 电子计算机的机器指令是一列二进制数字,计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算;
+ 每一种微处理器由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使他工作,所以每一种微处理器都有自己的机器指令集,也就是机器语言;
+ 地址总线、数据总线和控制总线
+ 汇编 --- 机器码 ---- 电平
+ CPU中的总线称为内部总线,连接运算器、控制器和存储器,在他们之间进行数据的传送;
+ 指令和数据在内存中都是二进制,没有区别,CSU将CS:IP指向的内存单元的内容看做指令 数据段寄存器DS 栈寄存器 SS SP
+ 8086 CPU不支持直接将数据送入段寄存器
+ 汇编指令有对应的机器码,伪指令没有对应的机器码,伪指令是给编译器用的
+ xxx segment xxx ends end assume
+ 语法错误 与 逻辑错误
+ nasm −f
+ .asm编译生成.obj,连接生成.exe
+ DOS/Windows的command.exe
+ loop 与 cx
+ 一般定义代码段、数据段和堆栈段,assume只是关联段名称和段寄存器,CPU如何处理定义的段的内容完全是靠程序中具体的汇编指令和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定的;
+ 只有bx,si,di,bp可以用在[....]中进行内存单元的寻址,单个出现或以4种组合出现
+ 内中断 中断向量表 int指令 外中断分为可屏蔽中断和不可屏蔽中断
+ CPU加电初始化CS = 0x0FFFF,IP =0,自动从0xFFFF0执行程序,0xFFFF0处有1条跳转指令,执行BIOS中的系统自检和初始化程序,建立中断向量表,系统自检和初始化完成后调用int19h 进行操作系统的引导,计算机交给操作系统。
+ CPU可以直接读写3个地方的数据:寄存器、内存和端口,端口读取的内容放入ax或al,0-255端口直接读写,256-65535端口号要放入dx后再操作
+ 80386以后有3种工作模式:实模式(8086)、保护模式(支持多任务)、虚拟8086模式(可从保护模式切换至8086模式)
##一个基于x86架构的简单内核实现
+ qemu与bochs
+ Makefile .PHONY
+ 计算机启动过程:主板加电电压尚未稳定,北桥控制芯片向CPU发出Reset信号,电压稳定之后撤销Reset信号,形成第一条指令的地址(0xFFFFFFF0),这个地址实际上是映射到BIOS的固化指令存储的地方,接着执行BIOS的POST,完成后就到外部存储器中寻找操作系统(寻找顺序根据一张启动设备表),某设备是否可以启动根据第一个扇区512字节的最后两个字节是否是0x55和0xAA,只要有一个设备满足要求则后续的设备不再测试。BIOS找到可启动的设备后便将此设备的第一个扇区加载到内存的0x7C00处,并跳转过去执行。512字节太少,通常放入载入操作系统内核的代码即BootLoader。
##Organe's 一个操作系统的实现
+ NASM中任何不被[]括起来的标签或者变量名都被认为是地址,访问其中的内容必须使用[];$表示当前行被汇编后的地址,$$表示一个节的开始处被汇编后的地址;注意变量定义后面不要加冒号。
+ boot.bin、a.img生成使用本书的操作,将boot.bin写入虚拟软盘a.img使用《一个基于x86架构的简单内核实现》中的merge工具即可。Bochs配置文件通过修改dlxlinux下的bochsrc.bxrc。使用floppy启动成功。
+ bochsdbg.exe用来调试,调试命令和GDB类似;bochs是开放源码的。
#ARM
##ARM体系结构与编程
+ 采用固定长度的指令格式,ARM指令长度为32位,Thumb指令为16位;
+ ARM7系列包括ARM7TDMI、ARM7TDMI-S、ARM7EJ-S和ARM720T;ARM9系列包括ARM920T、ARM922T和ARM940T;ARM9E系列包括ARM926EJ-S、ARM946EJ-S和ARM966E-S。
+ARM9、ARM11、Cortex-A8/M3
#比较
ARM要求操作对象必须是对齐的,x86不需要对齐,对齐的话访问要快一些;
80x86和ARM支持的操作数为8位、16位、32位、64位以及IEEE754浮点数;
CPI(每条指令时钟周期数) = 程序的CPU时钟周期数 / 指令数
多级存储器层次结构:寄存器 L1 L2 存储器 磁盘 ,容量越小,速度越快
ILP、流水线