📄 bootstrap.s
字号:
/* * minimal bootstrap to set up flat 32-bit protected mode */#include "apic.h" bstart = 0xf0000 .code16stack_top = 0x1000cpu_up = 0x1000cpu_up_pmode = 0x1004pmode_stack_start = 0x10000pmode_stack_shift = 16pmode_stack_size = (1 << pmode_stack_shift)ipi_vec = 0xf0 start: mov $stack_top, %sp call smp_init cs lidtl idt_desc cs lgdtl gdt_desc mov %cr0, %eax or $1, %eax mov %eax, %cr0 ljmpl $8, $pmode + bstartsmp_init: mov $ipi_vec, %eax mov $(APIC_BASE + APIC_REG_IPI_VECTOR), %dx out %eax, %dx movw $ap_switch_to_pmode, ipi_vec*4 movw %cs, %ax mov %ax, ipi_vec*4+2 mov $sipi, %eax mov $(APIC_BASE + APIC_REG_SIPI_ADDR), %dx outl %eax, %dx mov $(APIC_BASE + APIC_REG_NCPU), %dx inl %dx, %eax mov %eax, %ecx mov $1, %esismp_loop: cmp %esi, %ecx jbe smp_done mov %esi, %eax mov $(APIC_BASE + APIC_REG_SEND_SIPI), %dx outl %eax, %dxwait_for_cpu: cmp cpu_up, %esi jne wait_for_cpu mov %esi, %eax mov $(APIC_BASE + APIC_REG_SEND_IPI), %dx out %eax, %dxwait_for_cpu_pmode: cmp cpu_up_pmode, %esi jne wait_for_cpu_pmode inc %esi jmp smp_loopsmp_done: retsipi: mov $(APIC_BASE + APIC_REG_ID), %dx inl %dx, %eax mov %eax, cpu_up shl $12, %eax addl $stack_top, %eax movl %eax, %esp sti nop1: hlt jmp 1bap_switch_to_pmode: cs lidtl idt_desc cs lgdtl gdt_desc mov %cr0, %eax or $1, %eax mov %eax, %cr0 ljmpl $8, $ap_pmode + bstart.code32 ap_pmode: mov $0x10, %ax mov %ax, %ds mov %ax, %es mov %ax, %fs mov %ax, %gs mov %ax, %ss mov $(APIC_BASE + APIC_REG_ID), %dx in %dx, %eax mov %eax, cpu_up_pmode shl $pmode_stack_shift, %eax lea pmode_stack_start + pmode_stack_size(%eax), %esp sti nopap_pmode_wait: hlt jmp ap_pmode_waitpmode: mov $0x10, %ax mov %ax, %ds mov %ax, %es mov %ax, %fs mov %ax, %gs mov %ax, %ss mov $pmode_stack_start + pmode_stack_size, %esp ljmp $8, $0x100000.align 16 idt_desc: .word 8*256-1 .long 0gdt_desc: .word gdt_end - gdt - 1 .long gdt + bstart.align 16gdt: .quad 0 .quad 0x00cf9b000000ffff // flat 32-bit code segment .quad 0x00cf93000000ffff // flat 32-bit data segmentgdt_end: . = 0xfff0 .code16 ljmp $0xf000, $start.align 65536
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -