文章目录

  • 1. PC架构
    • 1.1 pc都有哪些东西:
    • 1.2 我们用一个16位的原生8086cpu开始
    • 1.3 CPU执行指令
    • 1.4 需要工作空间:寄存器
    • 1.5 更多的工作空间:内存
    • 1.6 增加地址寄存器:指针指向内存
    • 1.7 指令也在内存中
    • 1.8 Want conditional jumps
    • 1.9 Still not interesting – need I/O to interact with outside world
    • 1.10 What if we want to use more than 2^16 bytes of memory?
    • 1.11 8086的16位地址和数据依旧还是有点小
    • 1.12 指令编程的例子
  • 2. x86物理内存map
    • 2.1 物理地址空间几乎可以看成普通的RAM
    • 2.2 希望低位地址指向其他的东西
    • 2.3 在屏幕上写vga内存
    • 2.4 Reset or power-on jumps to ROM at 0xfffffff0 (so must be ROM at top…)
  • 3. x86指令集
  • 4. gcc x86调用规则
  • 5. pc仿真
    • 5.1 博世仿真器
    • 5.2 在host操作系统上跑一个正常的进程
    • 5.3 用一个

1. PC架构

1.1 pc都有哪些东西:

x86 cpu 有寄存器、执行单元、内存管理
cpu芯片针,包括地址和数据信号
内存
硬盘
键盘
显示器
其他资源:BIOS ROM、clock

1.2 我们用一个16位的原生8086cpu开始

1.3 CPU执行指令

for(;;){run next instruction}

1.4 需要工作空间:寄存器

4个16位的数据寄存器:AX BX CX DX
两个8位的 each in two 8-bit halves, e.g. AH and AL
非常的快,但是很小

1.5 更多的工作空间:内存

cpu通过地址总线发送地址(金属线、每个金属线一位)
数据通过数据总线回来
或者数据写到数据总线

1.6 增加地址寄存器:指针指向内存

SP – 栈指针
BP – 基址指针
SI – 资源索引
DI – 目标索引
SP – stack pointer
BP – frame base pointer
SI – source index
DI – destination index

1.7 指令也在内存中

IP – 指令指针
increment after running each instruction
可以被call、ret。jmp、条件jump更改

1.8 Want conditional jumps

1.9 Still not interesting – need I/O to interact with outside world

1.10 What if we want to use more than 2^16 bytes of memory?

1.11 8086的16位地址和数据依旧还是有点小

80386在1985年增加了支持32位的数据和地址
boots 16位模式,boot…S切换到了32位
寄存器改成了32位宽,从AX改成了EAX
操作数和地址从16位改成了32位,比如ADD是执行32位运算
prefixes 0x66/0x67 toggle between 16-bit and 32-bit operands and addresses: in 32-bit mode, MOVW is expressed as 0x66 MOVW
the .code32 in boot.S tells assembler to generate 0x66 for e.g. MOVW
80386 also changed segments and added paged memory…

1.12 指令编程的例子

b8 cd ab16-bit CPU,AX <- 0xabcdb8 34 12 cd ab32-bit CPU, EAX <- 0xabcd123466 b8 cd ab32-bit CPU,AX <- 0xabcd

2. x86物理内存map

2.1 物理地址空间几乎可以看成普通的RAM

2.2 希望低位地址指向其他的东西

2.3 在屏幕上写vga内存

2.4 Reset or power-on jumps to ROM at 0xfffffff0 (so must be ROM at top…)

+------------------+<- 0xFFFFFFFF (4GB)|32-bit||memory mapped || devices|||/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\|||Unused|||+------------------+<- depends on amount of RAM||||| Extended Memory|||||+------------------+<- 0x00100000 (1MB)| BIOS ROM |+------------------+<- 0x000F0000 (960KB)|16-bit devices, ||expansion ROMs|+------------------+<- 0x000C0000 (768KB)| VGA Display|+------------------+<- 0x000A0000 (640KB)|||Low Memory|||+------------------+<- 0x00000000

3. x86指令集

4. gcc x86调用规则

5. pc仿真

5.1 博世仿真器

和真正的pc做一样的事情
只实现软件层面的东西

5.2 在host操作系统上跑一个正常的进程

5.3 用一个