005 引用 / 参考 / 概要¶
不是最终版本, 这期我参考的确实不止这些...
文章预计发布于 - 中秋 但是, 计划赶不上变化, 安排太紧了, 不能听个响 (没有配音)
reference¶
pre¶
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
- manual
- wikipedia
- B站
- 命名
- 别名
- CR0 - Machine Status Word (MSW)
- 其他
模式
- legacy mode
- real mode
- protected mode
- virtual 8086 mode
- compatibility mode (x86_64 processor)
- long mode
segmentation¶
- manual
-
实模式
(segment << 4) + offset
- 保护模式
table[segreg.idx].base + offset
table := segreg.ti ? LDT : GDT
- 地址环回
- sdm - 23.33.1 Segment Wraparound
两张表 - GDT - LDT
加载 GDT
- lgdt + gdtr
加载 LDT
- lldt + 选择子
两种段
- 系统段
- 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¶
-
PAE (physical address extension)
- wikipedia
- pentium pro (Intel) / athlon (AMD) 引入
- 4K / 2M page
- wikipedia
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 (Page-Map Level 4)
- wikipedia
- 4K / 2M / 1G page
- 扩高地址 - canonical address
0
~2^48 - 1
/ 理论 != 实现
- wikipedia
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¶
- wikipedia
- PE重定位
- ELF重定位
- 本体
- foreach programe header
- map
physical memory
->proghdr->va_addr
PT_LOAD
段对齐PT_LOAD
填充.bss
段初始化 / ...
- map
- foreach programe header
- 动态库
- GOT / PLT / 延迟绑定
- got、plt表介绍
- GOT and PLT for pwning
- 彻底搞清楚 GOT 和 PLT
- 本体
查看 got / plt:
reset vector¶
-
INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986
- 10.1 Processor State After Reset
- 10.2.3 First Instructions
- 14.8.2 Location of First Instruction
- differences
- How Does an Intel Processor Boot?
- 深入UEFI内核
long mode¶
- 64bit mode
- compatibility mode
决定兼容模式?
- gdts[cs.index].L = 0
观察兼容模式?
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!!!
-
检测支持 MSR
cpuid
- 读写 MSR
- rdmsr / wrmsr
- ->
MSR[ECX] := EDX:EAX
accelerate!!!¶
ILP¶
指令级并行技术
- 包括:
- 流水线技术
- 超标量执行
- 乱序执行
- 寄存器重命名
- 分支预测
- 超长指令字 VLIW
- 打包 + 编译时对指令进行优化
- chatgpt 给的介绍
通常是 你中有我, 我中有你 的关系
cache machanism¶
- Intel SDM
CAR¶
Cache-As-Ram - 将缓存当作临时内存来使用
- QEMU 是不需要初始化 CAR 的, 因为 QEMU 的内存不需要进行初始化
- 需要引用: coreboot 注释
windbg¶
- 好文推荐: 对比总结32位和64位下,IDT,GDT,DS,CS,TSS,FS,GS的异同
- vmware & windbg
- 批判性观看: CPU眼里的:键盘驱动 | 骇客 | 内核调试 | WinDbg
- hyper-V & windbg
vmware & windbg:
- staskoverflow : kernel debug with a vmware machine
- 我选择的方案 OvO
手动触发调试 / int 3 (visual studio / release / x86)
g
-> 继续执行 (go)
P5 bugs¶
x87 fpu¶
- hardware
- example
- software (emulator)
- "禁用" FPU -> 触发
#NM
-> 软件处理 (解析 opcode, 模拟...) -> iret - linux
math_emulate()
exc_device_not_available()
- "禁用" FPU -> 触发
qemu¶
- QEMU Monitor
info registers
- 格式 / 源码实现
questions?¶
ASK GPT :)
可以私信我! (●'◡'●)
todo¶
pci / io / 外周设备 没有讲, 本节说的是处理器自身的体系
maker!¶
- maker: maouai233
- apps:
- anime-board / anime
- drawio / svg
- krita / panting
- polacode / code screenshot
- 必剪 (移动端) / video
- meme:
- B站预设
- 明末千里行
- 其他
- project
- 在我的百度网盘可以下载本期的素材 (正式发布时给出) / markdown