Registers
General purpose registers: %eax, %ebx, %ecx, %edx, %esi, %edi, %ebp, %esp
%eax return value register%esp stack pointer register%ebp base pointer register (used for stack frame)Segment registers: %cs (code), %ss (stack), %ds (data), %es (extra), %fs (extra), %gs (extra), important during context switch
Instruction pointer: %eip (can't read or write directly)
EFLAGS register: condition code flags, control flags, system flags (if set, expect certain value in regular registers, and some for arithmetic), generally don't write it directly
Control registers: %cr0, %cr2, %cr3, %cr4
%cr0 control flags: paging enable, protected mode enable, etc.%cr1 reserved -> don't touch, don't look%cr2 contains address that last caused page fault%cr3 page directory base register (PDBR), contain address of current page directory%cr4 control flags: protected mode extensions, virtual-8086 mode extensions, etc.movl with PL0esp0 (NOT A REGISTER) hardware "task segment": default stack pointer when trap into kernel, set by OS in kernel mode




Hardware hash "Task" built in, but:
we might not need all features of hardware task, implement software task can be more efficient and flexible
people expect OS to run on any hardware
but to use paging, we need "protected mode" running hardware task (we will just have one task)
disable_interruptdoes not disable traps, it "defer" interrupts. In a multi-processor system, it only disable for current CPU, but not all CPUs.
Program Loader:
ELF file is complicated, that's what we need to load
load code, rodata, data, bss, stack
Table of Content