Skip to content

005 引用 / 参考 / 概要

不是最终版本, 这期我参考的确实不止这些...

文章预计发布于 - 中秋 但是, 计划赶不上变化, 安排太紧了, 不能听个响 (没有配音)

reference

pre

  • sys V ABI
    • 部分解析
    • 可执行文件 - ELF
    • 调用约定
      • 传参 : rdi -> rsi -> rdx -> rcx -> r8 -> r9 -> 栈
      • 调用方保存:
        • rax - rdi
        • rsi - rdx
        • rcx - r8 - r9
        • r10 - r11
      • 被调用方保存 (实现方):
        • rbx - rsp
        • rbp - r12
        • r13 - r14 - r15
    • RED ZONE!!! - 红区警告

manual

  • The 8086 Family User's Manual 1979
  • 80286 AND 80287 PROGRAMMER'S REFERENCE MANUAL 1987
  • INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986
  • Intel® 64 and IA-32 Architectures Software Developer’s Manual (June 2024)

x86 history

  • processors
    • 4004
    • 8080 - 16bit era!
    • 8086
      • 80x87
    • 8088
    • 80286
    • 80386 - 32bit era!
    • 80486
    • (P5 family)
    • (P6 family)
  • modern
    • Itanium / IA64
    • Opteron / AMD64 / Intel64 / x86_64


模式

segmentation

  • manual
  • osdev

  • 实模式

    • (segment << 4) + offset
  • 保护模式
    • table[segreg.idx].base + offset
    • table := segreg.ti ? LDT : GDT
  • 地址环回
    • sdm - 23.33.1 Segment Wraparound

两张表 - GDT - LDT


加载 GDT

加载 LDT


两种段

  • 系统段
    • LDT
    • TSS
    • ...
  • 非系统段
    • 数据段
    • 代码段

64 bit?

  • sdm : 3.4.2.1 Segment Registers in 64-Bit Mode

64 位下重载段寄存器?

  • cs / ss 不能直接 mov
    • -> far jmp (protected mode)
    • -> iretq / 中断返回
      • iret 指令执行,出栈顺序 : SS -> RSP (original RSP) -> RFLAGS -> CS -> RIP
      • q 是 64位 返回
      • interrupt return
      • 实例

paging

PDPT (2bit index) -> PD -> PT

with table entries of 64 bits each instead of 32, allowing these CPUs to directly access a physical address space larger than 4 gigabytes (232 bytes).

长模式是 PAE 超集

PML4 -> PDPT -> PD -> PT

why canonical address?

Although virtual addresses are 64 bits wide in 64-bit mode, current implementations (and all chips that are known to be in the planning stages) do not allow the entire virtual address space of 264 bytes (16 EiB) to be used. This would be approximately four billion times the size of the virtual address space on 32-bit machines. Most operating systems and applications will not need such a large address space for the foreseeable future, so implementing such wide virtual addresses would simply increase the complexity and cost of address translation with no real benefit. AMD, therefore, decided that, in the first implementations of the architecture, only the least significant 48 bits of a virtual address would actually be used in address -- wikipedia

扩高的规则是:

高 16 位必须与 第47 位保持一致, 否则触发 #GP. 势必将地址空间划分为两个区域. 操作系统可以顺势而为之, 将它当作 用户空间与内核空间 的界限是个不错的选择...

物理内存限制取决于 MAXPHYADDR

  • Intel 5-level paging
    • 57 位虚拟地址, 该扩高的继续扩高!

分页的引入改进或者带来更多的特性(不全):

  • 交换页
  • 写时复制
  • 更精细的映射
  • 更符合直觉的地址空间
  • 更精细的权限管理
  • ...

relocation


查看 got / plt:

objdump -s -S a.out

reset vector

long mode

  • 64bit mode
  • compatibility mode

决定兼容模式?

  • gdts[cs.index].L = 0

观察兼容模式?

  • linux
    • print cs & show me the code!
  • windows
  • qemu

travelling in modes!


  • 16bit real mode <- reset vector
    • A20
    • gdt
    • CR0.PE = 1
    • far jmp!!!
  • protected mode
    • CR4.PAE = 1
    • EFER.LME = 1
    • CR0.PG = 1
  • compatibility mode
    • far jmp (到 L=1 的 段描述符)
  • long mode

MSR registers

  • history

    • 80386 experimental features -> TRx registers
    • Pentium (P5) -> rdmsr / wrmsr
    • Pentium (P6) -> MTRR!!!
  • osdev

  • wikipedia

  • 检测支持 MSR

    • cpuid
  • 读写 MSR
    • rdmsr / wrmsr
    • -> MSR[ECX] := EDX:EAX

accelerate!!!

ILP

指令级并行技术

https://en.wikipedia.org/wiki/Instruction-level_parallelism

  • 包括:
    • 流水线技术
    • 超标量执行
    • 乱序执行
    • 寄存器重命名
    • 分支预测
    • 超长指令字 VLIW

通常是 你中有我, 我中有你 的关系

cache machanism

  • Intel SDM

CAR

Cache-As-Ram - 将缓存当作临时内存来使用

  • QEMU 是不需要初始化 CAR 的, 因为 QEMU 的内存不需要进行初始化

windbg


vmware & windbg:


手动触发调试 / int 3 (visual studio / release / x86)

1
2
3
  __asm {
    int 3
  };
  • g -> 继续执行 (go)

P5 bugs

x87 fpu

  • hardware
  • software (emulator)
    • "禁用" FPU -> 触发 #NM -> 软件处理 (解析 opcode, 模拟...) -> iret
    • linux
      • math_emulate()
      • exc_device_not_available()

qemu

questions?

ASK GPT :)

可以私信我! (●'◡'●)

todo

pci / io / 外周设备 没有讲, 本节说的是处理器自身的体系

maker!

  • maker: maouai233
  • apps:
    • anime-board / anime
    • drawio / svg
    • krita / panting
    • polacode / code screenshot
    • 必剪 (移动端) / video
  • meme:
    • B站预设
    • 明末千里行
    • 其他
      • reddit
  • project
    • 在我的百度网盘可以下载本期的素材 (正式发布时给出) / markdown