信息
信息是不确定性的度量
凡是在能减少不确定性的任何事物都叫信息
熵(entropy)就是信息
信息的最小单元即是: 0-1; 信息的基本操作是取反: ~ 0
:0-1V
1
:2-5V
常见硬件
DRAM
Dynamic Random Access Memory
每个位的存储对应对一个电容的充电,电容的电荷会漏电.所以DRAM要不断的刷新这种存储器.(一般用在内存、CCD上)SDRAM
: Synchronous DRAMDDR
: Double Data-rate Synchronous DRAMDDR2
,DDR3
..(DDR2-400: 400表示有效频率,核心工作频率是100(MHZ))SRAM
Static Random Access Memory
只要有电,SRAM存储内容就会保持不变,并且不需要不停的刷新.存取比DRAM块,不易受到光电干扰.更贵,一般用在寄存器上.- 元器件
反转器: 基本构成是一个三极管
对信息取反的基本元器件是 “反转器”,不过反转器实现反转是需要时间的,大概 几个纳秒 - 与非门
使用两个三极管(串联) + 反转器 = 与门
{与门} + {非门} = 芯片 - Hard Disk Drive
track
(磁道与磁道之间存在隔离带,它包含扇区)sector
(扇区之间也存在隔离带,相邻的扇区合在一起成为"簇")sector **=** 前导区(磁头同步) **+** 数据区(85%) **+** 纠错码(Error Correctting Code)
cylinder(柱面) = 多个磁道纵向排列
LVM
Logical Volume Manager
新加入的硬盘不会改变上层的逻辑卷,动态调整逻辑卷的大小!
磁盘被划分为一个个小的PE
(PhysicalExtend,每一个大概4MB),该过程称磁盘被格式化为PV
(Physical Volume);
不同的磁盘所对应的PV组成一个VG
(Volume Group),相当于一个池子,里面全是小的来自不同磁盘的PE.
VG被逻辑的分割为一个个LV
(Logical Volume),这些LV是呈献给使用者的最终抽象.MBR
Main Boot Recordbootloader(0x0,192K) -> boot parameters -> Kernel(0x30000,1.856M) -> RootFs(0x200000,30M) -> OtherFs(0x2000000,32M)
开机管理程序.位于磁盘的 0扇区-0磁道, 结束标志是 55AAH, 446B(OS安装时向其写入数据,故可识别FS并载入kernel)
这里面写入的数据可能是BootLoader-stage1.其作用就是提供选单、载入kernel!
PartionTable: 记录硬盘分割状态. 64B. 四个分割槽,最小单位为cylinder
MbrFix 卸载GRUB或修复windows_boot_loadermbrfix /drive 0 fixmbr /yes
计算机体系结构
+--------------------------+
L5 | C Go |
+------------+-------------+
|
|
+------------+-------------+
L4 | Assembly |
+------------+-------------+
|
+------------+-------------+
L2 | ISA | 指令系统层(CPU的接口,不同的CPU不同,目前多指x86)
+------------+-------------+
|
+------------+-------------+
L1 | MAL | 微体系结构层(CPU的实现)
+------------+-------------+
| 微指令(由微程序控制,1条微指令对应了一条机器码)操作门电路,是多级流水线划分的基础!
|
| 微指令在1个周期(取、执行指令)内完成,多条微指令表现为一条汇编指令.CPU以微指令为执行单元;
+------------+--------------+
L0 | 数字逻辑层 |
+------------+--------------+
|
+------------+--------------+
| 物理硬件 |
+---------------------------+
在最初的计算机设计中,微体系结构层(microarchitecture)并不存在.但是此时的计算机非常复杂(ISA的指令非常复杂多变),下层难以设计.
1951年剑桥大学的研究员设计出了三层模型—在ISA与数字逻辑层之间加入微程序,来解释ISA层的指令.实际上这个过程就是精简了ISA层的指令,是对ISA层的指令一个去粗取精的过程,这减轻了数字逻辑层的设计难度.隔离了复杂问题的硬件设计,转而使用软件来实现.
1960年之前,计算机也就停留在三层—ISA层 + 微体系结构层 + 数字逻辑层;此时的程序员必须使用卡片操作计算机:
1642 法国数学家、物理学家—帕斯卡(1623-1662,39) 制造了世界山第一台计算机.这台计算机只能做加减法操作.它是利用齿轮传动原理制成的机械式计算机.这台计算机通过手摇方式操作运算. 此人在无穷小分析上有诸多先驱性的研究,对后来的莱布尼兹建立"实积分"有很大启发.笛卡尔对其写作的«论圆锥曲线»非常赞赏,但是不敢相信出自16岁少年之手.
1655 帕斯卡进入神学院,他从怀疑论出发,认为感性和理性知识都不可靠,从而得出"信仰高于一切"的结论. 他的«算术三角形»论文称为概率论的基础.他最早引入了椭圆积分.
1674 德国数学家、物理学家—莱布尼兹(1646-1716,70) 发明了可进行四则运算的机械计算机.此人独立发明了微积分(从几何角度出发,严密性要强于牛顿),首先引入了行列式的概念,他还率先提出了二进制数运算法则. 莱布尼兹晚年患有胆结石,卧床一周后去世.
1834 英国数学家—巴贝奇(1792-1871,79)发明了分析机.这台机器太过先进,超出了当时的制造工艺100年.
1936 英国数学家—图灵(Turing,1912-1954,42) 提出了"图灵机"模型.16岁便通读爱因斯坦著作.由于咬了一口含有氰化物的苹果而死,后人传言"苹果公司"的标识便来源于此.
CPU
机器码: 二进制代码,用于驱动CPU工作,人类一般无法区分机器码中的指令和数据!
地址总线: CPU有N根地址总线,则CPU地址总线宽度为N;CPU可以寻找2^N个内存单元!
数据总线: CPU有N根数据总线,则CPU一次可以传送N位数据!
控制总线: CPU有N根控制总线,则CPU对外部器件有N种控制能力!
内存地址空间: 主板上的各种扩展卡通过总线与CPU相连,被CPU直接控制;
CPU把内存、显存、网卡ROM、系统ROM都映射到内存地址空间,当然内存地址空间的寻址能力,受到地址总线的限制.
所有的CPU通常都会从某个由CPU制造商预先设定的地址上取指令(0xFFFFH:BIOS地址)
- 从本质上来说,大脑需要包含记忆,所以内存可以包含于CPU,但是价格、散热、可扩展性等因素制约了这种可能性
- 如果所有的外设与CPU共用一条总线(如ISA)则CPU必须与最慢的一个设备保持同步;
- CPU 通过外部总线、北桥芯片与内存交流;
- CPU 通过管脚与外界通信,管脚是外部总线与内部总线的桥梁:
- CPU 为了量化处理事件,需要一个周期特性;
- CPU 执行指令分为四个级别,Windows使用了其中的两个:Ring0,Ring3,前者表示系统级别
CPU3种模式
实时模式: 段地址 + 偏移地址 = 物理地址
保护模式: 进程地址空间独立,进程2GB地址空间+2GB系统使用的地址空间
系统管理模式: firmware,BIOS
MMU
: Memory Management Unit,虚拟地址到物理地址的映射!
register
CPU共有24个逻辑的寄存器(8个32位:E + 8个16位:X + 8个8位:L,H)和一个32位EFlags寄存器,实际上,这几个寄存器是重叠的.
通用寄存器
一般放在地址偏移中: [si] [di].
ESI
/SI
: Source Index Register源变址寄存器(指令中源操作数的指针)EDI
/DI
: Destination Index Register目的变址寄存器(指令中目的操作数的指针)
指针寄存器
EBP/BP
: Base Pointer基指针寄存器(存取堆栈中的数据).一般[bp]存放这SS偏移地址.
ESP/SP
: Stack Pointer堆栈指针寄存器(相对于栈顶段地址的偏移量,push时,SP-2,pop时+2)
EIP/IP
: Instruction Pointer Register(下次要执行指令在代码段的偏移量,加电启动时IP=0000H)
段寄存器
CPU对内存的分段管理,并不支持将数值直接放入段寄存器
CS
: Code Segment Register(CPU配合IP在CS中读取指令执行,加电启动时CS=ffffH)
DS
: Data Segment Register(存放要访问的数据段地址)
SS
: Stack Segment Register(存放栈顶的段地址)
ES
: Extra Segment Register
demo
80x86
指令集不允许两个操作数都为内存变量.伪指令不被CPU执行!由编译器执行!1个有意义的汇编程序至少有个代码段.
括号表示其内容,如(ax)=0001h表ax中的内容为0001h;只有bx,bp,si,di可以用在偏移量[]中,并且bx,bp与si,di不能够同时出现!
; 操作数必须具有相同的位数,vc编译器把dst放在前面(Intel格式)!; AT&T格式汇编,寄存器前面要加上%作为前缀,如 push %eax.; AT&T格式汇编,立即数前面需有$前缀,如 push $1.
mov(src_operand,dst_operand) ; src_operand = dst_operand;
add(src_operand,dst_operand) ; dst_operand+= src_operand;
sub(src_operand,dst_operand) ; dst_operand-= src_operand;
mov ax,bx ;拷贝寄存器bx中的值到ax中
add ax,bx ;将寄存器ax,bx中的值相加,结果存放到ax中,等价于: (ax) = (ax) + 2
sub ax,ax ;将ax清零,== mov ax,0
jmp ax,ip ;ax内值不变,CS不变,IP内的值变为ax内的值;虽然类似于mov IP,ax 但是不能这样使用
inc bx ;(bx)加1
and bx ;按位与
or bx ;按位或
pop ax ;从栈顶取数据,放入ax中.SP+2.
push ax ;将寄存器ax中的数值放入程序栈中.SP-2.
dw define-word,2B
db define-byte,1B
dd double-word,4B
mov bx,1000H
mov ds,bx ;8086CPU不支持直接将值赋给段寄存器
mov al,[0] ;等价于: mov al,ds:[0]
mov al,[bx+2] ;偏移量为:(bx)+2
mov [0],al ;将al内的内容拷贝到地址空间中该地址:1000H:0
mov cx,11 ;做11次循环:(ax)^11
; s:标号,表示了一个地址
s: add ax,ax
loop s