📄 cstart64.s
字号:
#include "apic.h"boot_idt = 0ipi_vector = 0x20max_cpus = 4.bss . = . + 4096 * max_cpus .align 16stacktop: . = . + 4096 .align 16ring0stacktop:.data .align 4096ptl2:i = 0 .rept 512 .quad 0x1e7 | (i << 21) i = i + 1 .endr.align 4096ptl3: .quad ptl2 + 7.align 4096ptl4: .quad ptl3 + 7 .align 4096gdt64_desc: .word gdt64_end - gdt64 - 1 .quad gdt64gdt64: .quad 0 .quad 0x00af9b000000ffff // 64-bit code segment .quad 0x00cf93000000ffff // 64-bit data segment .quad 0x00affb000000ffff // 64-bit code segment (user) .quad 0x00cff3000000ffff // 64-bit data segment (user)tss_descr: .rept max_cpus .quad 0x000089000000ffff // 64-bit avail tss .quad 0 // tss high addr .endrgdt64_end:i = 0tss: .rept max_cpus .long 0 .quad ring0stacktop - i * 4096 .quad 0, 0, 0 .quad 0, 0, 0, 0, 0, 0, 0, 0 .long 0, 0, 0i = i + 1 .endrtss_end:.section .init.code32 call prepare_64 jmpl $8, $start64prepare_64: lgdt gdt64_desc mov %cr4, %eax bts $5, %eax // pae mov %eax, %cr4 mov $ptl4, %eax mov %eax, %cr3efer = 0xc0000080 mov $efer, %ecx rdmsr bts $8, %eax wrmsr mov %cr0, %eax bts $0, %eax bts $31, %eax mov %eax, %cr0 retsmp_init_ipi: call prepare_64 jmpl $8, $ap_start64.code64ap_start64: call load_tss sti nop1: hlt jmp 1bstart64: call load_tss call smp_init call main1: hlt jmp 1bload_tss: mov $0, %eax mov %ax, %ss mov $(APIC_BASE + APIC_REG_ID), %dx in %dx, %eax mov %eax, %ebx shl $4, %ebx mov $((tss_end - tss) / max_cpus), %edx imul %edx add $tss, %rax mov %ax, tss_descr+2(%rbx) shr $16, %rax mov %al, tss_descr+4(%rbx) shr $8, %rax mov %al, tss_descr+7(%rbx) shr $8, %rax mov %eax, tss_descr+8(%rbx) lea tss_descr-gdt64(%rbx), %rax ltr %ax retsmp_init: lea boot_idt + ipi_vector * 8, %rdi mov $smp_init_ipi, %eax mov %ax, (%rdi) mov %cs, %ax mov %ax, 2(%rdi) movw $0x8e00, 4(%rdi) shr $16, %eax mov %ax, 6(%rdi) mov $(APIC_BASE + APIC_REG_IPI_VECTOR), %dx mov $ipi_vector, %eax out %eax, %dx mov $(APIC_BASE + APIC_REG_NCPU), %dx in %dx, %eax mov %eax, %ecx mov $1, %esismp_loop: cmp %esi, %ecx je smp_init_done mov $(APIC_BASE + APIC_REG_SEND_IPI), %dx mov %esi, %eax out %eax, %dx inc %esi jmp smp_loopsmp_init_done: ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -