zoukankan      html  css  js  c++  java
  • 0.00-050613_head.s

      1 #  head.s contains the 32-bit startup code.
      2 #  Two L3 task multitasking. The code of tasks are in kernel area, 
      3 #  just like the Linux. The kernel code is located at 0x10000. 
      4 SCRN_SEL    = 0x18
      5 TSS0_SEL    = 0x20
      6 LDT0_SEL    = 0x28
      7 TSS1_SEL    = 0X30
      8 LDT1_SEL    = 0x38
      9 
     10 .text
     11 startup_32:
     12     movl $0x10,%eax
     13     mov %ax,%ds
     14 #    mov %ax,%es
     15     lss init_stack,%esp
     16 
     17 # setup base fields of descriptors.
     18     call setup_idt
     19     call setup_gdt
     20     movl $0x10,%eax        # reload all the segment registers
     21     mov %ax,%ds        # after changing gdt. 
     22     mov %ax,%es
     23     mov %ax,%fs
     24     mov %ax,%gs
     25     lss init_stack,%esp
     26 
     27 # setup up timer 8253 chip.
     28     movb $0x36, %al
     29     movl $0x43, %edx
     30     outb %al, %dx
     31     movl $11930, %eax        # timer frequency 100 HZ 
     32     movl $0x40, %edx
     33     outb %al, %dx
     34     movb %ah, %al
     35     outb %al, %dx
     36 
     37 # setup timer & system call interrupt descriptors.
     38     movl $0x00080000, %eax    
     39     movw $timer_interrupt, %ax
     40     movw $0x8E00, %dx
     41     movl $0x08, %ecx              # The PC default timer int.
     42     lea idt(,%ecx,8), %esi
     43     movl %eax,(%esi) 
     44     movl %edx,4(%esi)
     45     movw $system_interrupt, %ax
     46     movw $0xef00, %dx
     47     movl $0x80, %ecx
     48     lea idt(,%ecx,8), %esi
     49     movl %eax,(%esi) 
     50     movl %edx,4(%esi)
     51 
     52 # unmask the timer interrupt.
     53 #    movl $0x21, %edx
     54 #    inb %dx, %al
     55 #    andb $0xfe, %al
     56 #    outb %al, %dx
     57 
     58 # Move to user mode (task 0)
     59     pushfl
     60     andl $0xffffbfff, (%esp)
     61     popfl
     62     movl $TSS0_SEL, %eax
     63     ltr %ax
     64     movl $LDT0_SEL, %eax
     65     lldt %ax 
     66     movl $0, current
     67     sti
     68     pushl $0x17
     69     pushl $init_stack
     70     pushfl
     71     pushl $0x0f
     72     pushl $task0
     73     iret
     74 
     75 /****************************************/
     76 setup_gdt:
     77     lgdt lgdt_opcode
     78     ret
     79 
     80 setup_idt:
     81     lea ignore_int,%edx
     82     movl $0x00080000,%eax
     83     movw %dx,%ax        /* selector = 0x0008 = cs */
     84     movw $0x8E00,%dx    /* interrupt gate - dpl=0, present */
     85     lea idt,%edi
     86     mov $256,%ecx
     87 rp_sidt:
     88     movl %eax,(%edi)
     89     movl %edx,4(%edi)
     90     addl $8,%edi
     91     dec %ecx
     92     jne rp_sidt
     93     lidt lidt_opcode
     94     ret
     95 
     96 # -----------------------------------
     97 write_char:
     98     push %gs
     99     pushl %ebx
    100 #    pushl %eax
    101     mov $SCRN_SEL, %ebx
    102     mov %bx, %gs
    103     movl scr_loc, %bx
    104     shl $1, %ebx
    105     movb %al, %gs:(%ebx)
    106     shr $1, %ebx
    107     incl %ebx
    108     cmpl $2000, %ebx
    109     jb 1f
    110     movl $0, %ebx
    111 1:    movl %ebx, scr_loc    
    112 #    popl %eax
    113     popl %ebx
    114     pop %gs
    115     ret
    116 
    117 /***********************************************/
    118 /* This is the default interrupt "handler" :-) */
    119 .align 2
    120 ignore_int:
    121     push %ds
    122     pushl %eax
    123     movl $0x10, %eax
    124     mov %ax, %ds
    125     movl $67, %eax            /* print 'C' */
    126     call write_char
    127     popl %eax
    128     pop %ds
    129     iret
    130 
    131 /* Timer interrupt handler */ 
    132 .align 2
    133 timer_interrupt:
    134     push %ds
    135     pushl %eax
    136     movl $0x10, %eax
    137     mov %ax, %ds
    138     movb $0x20, %al
    139     outb %al, $0x20
    140     movl $1, %eax
    141     cmpl %eax, current
    142     je 1f
    143     movl %eax, current
    144     ljmp $TSS1_SEL, $0
    145     jmp 2f
    146 1:    movl $0, current
    147     ljmp $TSS0_SEL, $0
    148 2:    popl %eax
    149     pop %ds
    150     iret
    151 
    152 /* system call handler */
    153 .align 2
    154 system_interrupt:
    155     push %ds
    156     pushl %edx
    157     pushl %ecx
    158     pushl %ebx
    159     pushl %eax
    160     movl $0x10, %edx
    161     mov %dx, %ds
    162     call write_char
    163     popl %eax
    164     popl %ebx
    165     popl %ecx
    166     popl %edx
    167     pop %ds
    168     iret
    169 
    170 /*********************************************/
    171 current:.long 0
    172 scr_loc:.long 0
    173 
    174 .align 2
    175 lidt_opcode:
    176     .word 256*8-1        # idt contains 256 entries
    177     .long idt        # This will be rewrite by code. 
    178 lgdt_opcode:
    179     .word (end_gdt-gdt)-1    # so does gdt 
    180     .long gdt        # This will be rewrite by code.
    181 
    182     .align 3
    183 idt:    .fill 256,8,0        # idt is uninitialized
    184 
    185 gdt:    .quad 0x0000000000000000    /* NULL descriptor */
    186     .quad 0x00c09a00000007ff    /* 8Mb 0x08, base = 0x00000 */
    187     .quad 0x00c09200000007ff    /* 8Mb 0x10 */
    188     .quad 0x00c0920b80000002    /* screen 0x18 - for display */
    189 
    190     .word 0x0068, tss0, 0xe900, 0x0    # TSS0 descr 0x20
    191     .word 0x0040, ldt0, 0xe200, 0x0    # LDT0 descr 0x28
    192     .word 0x0068, tss1, 0xe900, 0x0    # TSS1 descr 0x30
    193     .word 0x0040, ldt1, 0xe200, 0x0    # LDT1 descr 0x38
    194 end_gdt:
    195     .fill 128,4,0
    196 init_stack:                          # Will be used as user stack for task0.
    197     .long init_stack
    198     .word 0x10
    199 
    200 /*************************************/
    201 .align 3
    202 ldt0:    .quad 0x0000000000000000
    203     .quad 0x00c0fa00000003ff    # 0x0f, base = 0x00000
    204     .quad 0x00c0f200000003ff    # 0x17
    205 
    206 tss0:    .long 0             /* back link */
    207     .long krn_stk0, 0x10        /* esp0, ss0 */
    208     .long 0, 0, 0, 0, 0        /* esp1, ss1, esp2, ss2, cr3 */
    209     .long 0, 0, 0, 0, 0        /* eip, eflags, eax, ecx, edx */
    210     .long 0, 0, 0, 0, 0        /* ebx esp, ebp, esi, edi */
    211     .long 0, 0, 0, 0, 0, 0         /* es, cs, ss, ds, fs, gs */
    212     .long LDT0_SEL, 0x8000000    /* ldt, trace bitmap */
    213 
    214     .fill 128,4,0
    215 krn_stk0:
    216 #    .long 0
    217 
    218 /************************************/
    219 .align 3
    220 ldt1:    .quad 0x0000000000000000
    221     .quad 0x00c0fa00000003ff    # 0x0f, base = 0x00000
    222     .quad 0x00c0f200000003ff    # 0x17
    223 
    224 tss1:    .long 0             /* back link */
    225     .long krn_stk1, 0x10        /* esp0, ss0 */
    226     .long 0, 0, 0, 0, 0        /* esp1, ss1, esp2, ss2, cr3 */
    227     .long task1, 0x200        /* eip, eflags */
    228     .long 0, 0, 0, 0        /* eax, ecx, edx, ebx */
    229     .long usr_stk1, 0, 0, 0        /* esp, ebp, esi, edi */
    230     .long 0x17,0x0f,0x17,0x17,0x17,0x17 /* es, cs, ss, ds, fs, gs */
    231     .long LDT1_SEL, 0x8000000    /* ldt, trace bitmap */
    232 
    233     .fill 128,4,0
    234 krn_stk1:
    235 
    236 /************************************/
    237 task0:
    238     movl $0x17, %eax
    239     movw %ax, %ds
    240     movl $65, %al              /* print 'A' */
    241     int $0x80
    242     movl $0xfff, %ecx
    243 1:    loop 1b
    244     jmp task0 
    245 
    246 task1:
    247     movl $0x17, %eax
    248     movw %ax, %ds
    249     movl $66, %al              /* print 'B' */
    250     int $0x80
    251     movl $0xfff, %ecx
    252 1:    loop 1b
    253     jmp task1
    254 
    255     .fill 128,4,0 
    256 usr_stk1:

    C

  • 相关阅读:
    Jmeter_完成文件批量下载
    Jmeter_文件的下载
    Jmeter_针对一个账户批量上传文件
    Jmeter上传文件操作
    Jmeter_获取结果写到excel
    Jmeter_接口串联自动化测试_登录后充值获取cookie
    JS 对象(Object)和字符串(String)互转
    全国图书馆参考咨询联盟关闭文献传递功能解决办法
    Geodesic Distance:两点间的最短距离之法截弧/等角航线/测地线
    空间数据库基础理论 GIS空间数据处理分析涉及的基本概念
  • 原文地址:https://www.cnblogs.com/CodeSkill/p/5086053.html
Copyright © 2011-2022 走看看