上几节的介绍中,我们能够用bootloader加载32位代码,进入保护模式,并且跳转到了保护模式下的程序里,本篇我们实现在32位模式下完成写显存输出字符,并且在时钟中断中完成显示字符的程序。
此后的代码,我们会略去bootloader不说,只说明32位程序head.s
1. 看代码head.s
SCRN_SEL = 0x18 .globl startup_32 .text startup_32: movl $ 0x10 , % eax mov % ax , % ds mov % ax , % es mov % ax , % gs mov % ax , % fs lss init_stack , % esp call setup_idt call setup_gdt # init again movl $ 0x10 , % eax mov % ax , % ds mov % ax , % es mov % ax , % gs mov % ax , % fs lss init_stack , % esp # setup timer & system call interrupt descriptors. movl $ 0x00080000 , % eax movw $ timer_interrupt , % ax movw $ 0x8E00 , % dx movl $ 0x08 , % ecx lea idt (, % ecx , 8 ), % esi movl % eax ,( % esi) movl % edx , 4( % esi) sti die: jmp di e .align 2 ignore_int: push % ds pushl % eax movl $ 0x10 , % eax mov % ax , % ds mov $ 0x0c98 , % ax /* print 'C' */ call write_char popl % eax pop % ds iret write_char: push % gs pushl % ebx mov $ SCRN_SEL , % ebx mov % bx , % gs mov src_loc , % bx shl $ 1 , % ebx mov % ax , % gs :( % ebx) shr $ 1 , % ebx incl % ebx cmpl $ 2000 , % ebx jb 1 f movl $ 0 , % ebx 1: movl % ebx , src_loc popl % ebx pop % gs ret .align 2 timer_interrupt: push % ds pushl % edx pushl % ecx pushl % ebx pushl % eax movl $ 0x10 , % eax mov % ax , % ds movb $ 0x20 , % al outb % al , $ 0x20 mov $ 0x0c61 , % ax call write_char popl % eax popl % ebx popl % ecx popl % edx pop % ds iret setup_idt: lea ignore_int , % edx movl $ 0x00080000 , % eax movw % dx , % ax /* selector = 0x0008 = cs */ movw $ 0x8E00 , % dx /* interrupt gate - dpl = 0 , present */ lea idt , % edi mov $ 256 , % ecx rp_sidt: movl % eax ,( % edi) movl % edx , 4( % edi) addl $ 8 , % edi dec % ecx jne rp_sidt lidt lidt_opcode ret setup_gdt: lgdt lgdt_opcode ret .align 2 lidt_opcode: .word 256 * 8 - 1 .long idt lgdt_opcode: .word ( end_gdt - gdt) - 1 .long gdt src_loc: .long 0 .align 2 idt: .fill 256 , 8 , 0 gdt: .quad 0x0000000000000000 .quad 0x00c09a00000007ff .quad 0x00c09200000007ff .quad 0x00c0920b80000002 end_gdt: .fill 128 , 4 , 0 init_stack: .long init_stack .word 0x102. 代码分析
SCRN_SEL = 0x18 .globl startup_32 .text startup_32: movl $0x10,
