linux0.11学习笔记-技术铺垫-简单AB任务切换程序(4)-向现存写数据并响应时钟中断...

it2022-05-05  116

上几节的介绍中,我们能够用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 0x10

2. 代码分析

SCRN_SEL = 0x18 .globl startup_32 .text startup_32:     movl $0x10,

转载请注明原文地址: https://win8.8miu.com/read-24161.html

最新回复(0)