⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys32.inc

📁 Menuet 操作系统源代码。 非常难得的东西
💻 INC
📖 第 1 页 / 共 5 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                               ;;
;;  MenuetOS process management, protected ring3                 ;;
;;                                                               ;;
;;  Distributed under GPL. See file COPYING for details.         ;;
;;  Copyright 2003 Ville Turjanmaa                               ;;
;;                                                               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

align 4

irq0:

        cmp   [error_interrupt],-1
        je    no_error_in_previous_process

        mov   edi,[error_interrupt]
        imul  edi,8
        mov   [edi+tss0i_l +5], word 01010000b *256 +11101001b

        mov   edi,[error_interrupt]
        imul  edi,128
        add   edi,0x290000
        mov   esi,[error_interrupt_entry]
        mov   [edi+l.eip-tss_sceleton],esi
        mov   [edi+l.eflags-tss_sceleton],dword 0x11002

        mov   [0xffff],byte 0

        mov   [error_interrupt],-1

     no_error_in_previous_process:

        mov    edi,[0x3000]
        imul   edi,8
        mov    [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b

        inc   dword [0xfdf0]
        
        mov   eax,[0xfdf0]
        cmp   eax,[next_usage_update]
        jb    nocounter
        add   eax,100
        mov   [next_usage_update],eax
        call  updatecputimes
      nocounter:

        mov   edi,[0x3010]

        mov   ebx,[edi+0x18]
        call  _rdtsc
        sub   eax,ebx
        add   eax,[edi+0x14]
        mov   [edi+0x14],eax

        mov   ebx,[0x3000]

        cmp   [0xffff],byte 1
        je    do_not_change_task

      waiting_for_termination:
      waiting_for_reuse:

        add   edi,0x20
        inc   ebx

        cmp   [edi+0xa],byte 3
        je    waiting_for_termination
        cmp   [edi+0xa],byte 4
        je    waiting_for_termination
        cmp   [edi+0xa],byte 9
        je    waiting_for_reuse

        cmp   ebx,[0x3004]
        jbe   nsched0
        mov   ebx,1
        mov   edi,0x3020
        
      nsched0:

        mov   [0x3000],ebx
        mov   [0x3010],edi
   
      do_not_change_task:

        call  _rdtsc
        mov   [edi+0x18],eax

        cmp   [0xffff],byte 0
        je    nodecffff
        dec   byte [0xffff]
      nodecffff:

        shl   bx,3
        add   bx,tss0t
        mov   [tss_s],bx
   
        mov   al,0x20
        mov   dx,0x20
        out   dx,al
   
        db    0xea
tss_t   dd    0
tss_s   dw    tss0t

        jmp   irq0
   
next_usage_update dd 100
   
change_task:

        mov   [0xffff],byte 2           
                                        
        dec   dword [0xfdf0]

        int   0x20

        ret

align 4
   
; GDT TABLE
   
gdts:
   
        dw     gdte-$-1
        dd     gdts
        dw     0

os_code_l:
   
        dw     0xffff                    
        dw     0x0000                    
        db     0x00                      
        dw     11011111b *256 +10011010b
        db     0x00                     
   
os_data_l:
   
        dw     0xffff                    
        dw     0x0000                    
        db     0x00                      
        dw     11011111b *256 +10010010b
        db     0x00                     

graph_data_l:
   
        dw     0xff                      
        dw     0x0000                    
        db     0x00                      
        dw     11011111b *256 +11110010b
        db     0x00                      
   
ring3_code_l:
   
        dw     0xffff                    
        dw     0x0000                    
        db     0x00                      
        dw     11011111b *256 +11111010b
        db     0x00                     
   
ring3_data_l:
   
        dw     0xffff                    
        dw     0x0000                    
        db     0x00                      
        dw     11011111b *256 +11110010b
        db     0x00                     
   
ring2_code_l:
   
        dw     0xffff                    
        dw     0x0000                    
        db     0x00                      
        dw     11011111b *256 +11011010b
        db     0x00                     
   
ring1_code_l:
   
        dw     0xffff                    
        dw     0x0000                    
        db     0x00                      
        dw     11011111b *256 +10111010b
        db     0x00                     

int_code_l:
   
        dw     0xffff                    
        dw     0x0000                    
        db     0x00                      
        dw     11011111b *256 +10011110b
        db     0x00                     
 
int_data_l:
   
        dw     0xffff                    
        dw     0x0000                    
        db     0x00                      
        dw     11011111b *256 +10010010b
        db     0x00                     
   
tss0_l:
      times (max_processes+10) dd 0,0

tss0t_l:
      times (max_processes+10) dd 0,0

tss0i_l:
      times (256+10) dd 0,0
   
app_code_l:
      times (max_processes+10) dd 0,0
   
app_data_l:
      times (max_processes+10) dd 0,0

tss0sys_l:
      times (max_processes+10) dd 0,0

gdte:

   
idts:
      dw  idte-$-1
      dd  idts+8
      dw  0
   
      times 0x62 dd 0,0
   
idte:

build_process_gdt_tss_pointer:
   
        mov    ecx,0x40000
        xor    edi,edi
      setgdtl2:
        mov    [edi+gdts+ tss0 +0], word 128
        mov    [edi+gdts+ tss0 +2], cx
        mov    eax,ecx
        shr    eax,16
        mov    [edi+gdts+ tss0 +4], al
        mov    [edi+gdts+ tss0 +7], ah
        mov    [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
        add    ecx,128
        add    edi,8
        cmp    edi,8*(max_processes+5)
        jbe    setgdtl2
   
        ret

build_process_gdt_gate_pointer:

        xor    edi,edi
        mov    dx,tss0
      setidtl1:
        mov    ecx,[esi]
        mov    [edi+gdts+ tss0t +0], word 0
        mov    [edi+gdts+ tss0t +2], dx
        mov    [edi+gdts+ tss0t +4], word 11100101b*256
        mov    [edi+gdts+ tss0t +6], word 0
        add    dx,8
        add    edi,8
        cmp    edi,8*(max_processes+5)
        jb     setidtl1

        ret

build_interrupt_table:

        mov  [l.eflags],dword 0x11002 
        mov  [l.ss0], int_code
        mov  [l.ss1], ring1_code
        mov  [l.ss2], ring2_code
        mov  [l.esp0], 0x52000
        mov  [l.esp1], 0x53000
        mov  [l.esp2], 0x54000

        mov  eax,cr3
        mov  [l.cr3],eax
        mov  [l.cs],int_code
        mov  [l.ss],int_data
        mov  [l.ds],int_data
        mov  [l.es],int_data
        mov  [l.fs],int_data
        mov  [l.gs],int_data
        
        mov  eax,sys_int
        mov  [l.esp],0x720000
        mov  edi,0x290000

     newint:
        push edi
        mov  ebx,[eax]
        mov  [l.eip],ebx
        mov  esi,tss_sceleton
        mov  ecx,120/4
        cld
        rep  movsd
        pop  edi

        add  edi,128
        add  [l.esp],1024
        add  eax,4

        cmp  eax,sys_int+4*0x60
        jb   newint

;;

        mov    esi,boot_sched_3_2
        call   boot_log
   
        mov    ecx,0x290000
        xor    edi,edi
      setgdtl2i:
        mov    [edi+gdts+ tss0i +0], word 128          
        mov    [edi+gdts+ tss0i +2], cx                
        mov    eax,ecx
        shr    eax,16
        mov    [edi+gdts+ tss0i +4], al                
        mov    [edi+gdts+ tss0i +7], ah                
        mov    [edi+gdts+ tss0i +5], word 01010000b *256 +11101001b
        add    ecx,128                                 
        add    edi,8
        cmp    edi,8*0x60
        jbe    setgdtl2i
   
;;

        mov    esi,boot_sched_3_3
        call   boot_log

        xor    edi,edi
        mov    edx,tss0i
      setidtl2:
        mov    [edi+idts+ 8 +0], word 0
        mov    [edi+idts+ 8 +2], dx
        mov    [edi+idts+ 8 +4], word 11100101b*256
        mov    [edi+idts+ 8 +6], word 0
        add    edx,8
        add    edi,8

        cmp    edi,8*0x60
        jb     setidtl2

        ret

build_syscall_interrupt_table:

        mov  [l.eflags],dword 0x11002 
        mov  [l.ss0], int_code
        mov  [l.ss1], ring1_code
        mov  [l.ss2], ring2_code
        mov  [l.esp0], 0x52000
        mov  [l.esp1], 0x53000
        mov  [l.esp2], 0x54000

        mov  eax,cr3
        mov  [l.cr3],eax
        mov  [l.cs],int_code
        mov  [l.ss],int_data
        mov  [l.ds],int_data
        mov  [l.es],int_data
        mov  [l.fs],int_data
        mov  [l.gs],int_data
        
        mov  [l.esp],0x780000
        mov  edi,0x298000

     newint2:
        push edi
        mov  ebx,i40
        mov  [l.eip],ebx
        mov  esi,tss_sceleton
        mov  ecx,120/4
        cld
        rep  movsd
        pop  edi

        add  [l.esp],4096
        add  edi,128
        add  eax,4

        cmp  edi,0x298000+128*(max_processes+5)
        jb   newint2

;;
   
        mov    ecx,0x298000
        xor    edi,edi
      setgdtl2i2:
        mov    [edi+gdts+ tss0sys +0], word 128          
        mov    [edi+gdts+ tss0sys +2], cx                
        mov    eax,ecx
        shr    eax,16
        mov    [edi+gdts+ tss0sys +4], al                
        mov    [edi+gdts+ tss0sys +7], ah                
        mov    [edi+gdts+ tss0sys +5], word 01010000b *256 +11101001b
        add    ecx,128
        add    edi,8
        cmp    edi,8*(max_processes+5)
        jbe    setgdtl2i2

;;

        mov    dx,tss0sys
        mov    edi,8*0x40
        
        mov    [edi+idts+ 8 +0], word 0
        mov    [edi+idts+ 8 +2], dx
        mov    [edi+idts+ 8 +4], word 11100101b*256
        mov    [edi+idts+ 8 +6], word 0

        ret

   
updatecputimes:
   
        pusha
   
        call _rdtsc
        mov  eax,[idleuse]       
        mov  [idleusesec],eax
        mov  [idleuse],dword 0
        mov  ecx,[0x3004]
        mov  edi,0x3020
      newupdate:
        mov  ebx,[edi+0x14]
        mov  [edi+0x1c],ebx
        mov  [edi+0x14],dword 0
        add  edi,0x20
        loop newupdate
   
        popa
        ret

   
sys_int:
   
    dd   s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,sa,sb,sc,sd,se,sf
   
    dd   s10        ,s11        ,i_unknown12,i_unknown13
    dd   i_unknown14,i_unknown15,i_unknown16,i_unknown17
    dd   i_unknown18,i_unknown19,i_unknown1a,i_unknown1b
    dd   i_unknown1c,i_unknown1d,i_unknown1e,i_unknown1f
   
    dd   irq0  ,irq1  ,p_irq2 ,p_irq3 ,p_irq4 ,p_irq5,p_irq6 ,p_irq7
    dd   p_irq8,p_irq9,p_irq10,p_irq11,p_irq12,irqD  ,p_irq14,p_irq15
   
    dd   i_unknown30,i_unknown31,i_unknown32,i_unknown33
    dd   i_unknown34,i_unknown35,i_unknown36,i_unknown37
    dd   i_unknown38,i_unknown39,i_unknown3a,i_unknown3b
    dd   i_unknown3c,i_unknown3d,i_unknown3e,i_unknown3f
   
    dd   i40        ,i_unknown41,i_unknown42,i_unknown43
    dd   i_unknown44,i_unknown45,i_unknown46,i_unknown47
    dd   i_unknown48,i_unknown49,i_unknown4a,i_unknown4b
    dd   i_unknown4c,i_unknown4d,i_unknown4e,i_unknown4f
   
    dd   i_unknown50,i_unknown51,i_unknown52,i_unknown53
    dd   i_unknown54,i_unknown55,i_unknown56,i_unknown57
    dd   i_unknown58,i_unknown59,i_unknown5a,i_unknown5b
    dd   i_unknown5c,i_unknown5d,i_unknown5e,i_unknown5f
   
    dd   i_unknown60,i_unknown61,i_unknown62,i_unknown63
    dd   i_unknown64,i_unknown65,i_unknown66,i_unknown67
    dd   i_unknown68,i_unknown69,i_unknown6a,i_unknown6b
    dd   i_unknown6c,i_unknown6d,i_unknown6e,i_unknown6f
   
    dd   i_unknown70,i_unknown71,i_unknown72,i_unknown73
    dd   i_unknown74,i_unknown75,i_unknown76,i_unknown77
    dd   i_unknown78,i_unknown79,i_unknown7a,i_unknown7b
    dd   i_unknown7c,i_unknown7d,i_unknown7e,i_unknown7f
   
    dd   i_unknown80,i_unknown81,i_unknown82,i_unknown83
    dd   i_unknown84,i_unknown85,i_unknown86,i_unknown87
    dd   i_unknown88,i_unknown89,i_unknown8a,i_unknown8b
    dd   i_unknown8c,i_unknown8d,i_unknown8e,i_unknown8f
   
    dd   i_unknown90,i_unknown91,i_unknown92,i_unknown93
    dd   i_unknown94,i_unknown95,i_unknown96,i_unknown97
    dd   i_unknown98,i_unknown99,i_unknown9a,i_unknown9b
    dd   i_unknown9c,i_unknown9d,i_unknown9e,i_unknown9f
   
    dd   i_unknowna0,i_unknowna1,i_unknowna2,i_unknowna3
    dd   i_unknowna4,i_unknowna5,i_unknowna6,i_unknowna7
    dd   i_unknowna8,i_unknowna9,i_unknownaa,i_unknownab
    dd   i_unknownac,i_unknownad,i_unknownae,i_unknownaf
   
    dd   i_unknownb0,i_unknownb1,i_unknownb2,i_unknownb3
    dd   i_unknownb4,i_unknownb5,i_unknownb6,i_unknownb7
    dd   i_unknownb8,i_unknownb9,i_unknownba,i_unknownbb
    dd   i_unknownbc,i_unknownbd,i_unknownbe,i_unknownbf
   
    dd   i_unknownc0,i_unknownc1,i_unknownc2,i_unknownc3
    dd   i_unknownc4,i_unknownc5,i_unknownc6,i_unknownc7
    dd   i_unknownc8,i_unknownc9,i_unknownca,i_unknowncb
    dd   i_unknowncc,i_unknowncd,i_unknownce,i_unknowncf
   
    dd   i_unknownd0,i_unknownd1,i_unknownd2,i_unknownd3
    dd   i_unknownd4,i_unknownd5,i_unknownd6,i_unknownd7
    dd   i_unknownd8,i_unknownd9,i_unknownda,i_unknowndb
    dd   i_unknowndc,i_unknowndd,i_unknownde,i_unknowndf
   
    dd   i_unknowne0,i_unknowne1,i_unknowne2,i_unknowne3
    dd   i_unknowne4,i_unknowne5,i_unknowne6,i_unknowne7
    dd   i_unknowne8,i_unknowne9,i_unknownea,i_unknowneb
    dd   i_unknownec,i_unknowned,i_unknownee,i_unknownef
   
    dd   i_unknownf0,i_unknownf1,i_unknownf2,i_unknownf3
    dd   i_unknownf4,i_unknownf5,i_unknownf6,i_unknownf7
    dd   i_unknownf8,i_unknownf9,i_unknownfa,i_unknownfb
    dd   i_unknownfc,i_unknownfd,i_unknownfe,i_unknownff
   

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                            ;;
;;                   SYSTEM CALL ENTRY                        ;;
;;                                                            ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

align 4

i40:

      cli

      mov    edi,[0x3000]    
      imul   edi,8
      mov    [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b

      mov    eax,[schd]
      mov    [usedi40+eax],byte 1
      push   eax

      mov    edi,[0x3000]    
      imul   edi,256
      mov    [edi+0x80000+0xB0],eax

      mov    eax,0
    search_free_i40:
      cmp    [usedi40+eax],byte 0
      je     found_free_i40
      inc    eax
      cmp    eax,110
      jbe    search_free_i40
      jmp    $
    found_free_i40:
        
      mov    [schd],eax

      mov    edx,8
      imul   edx,[schd]
      add    edx,tss0sys
      mov    edi,8*0x40
        
      mov    [edi+idts+ 8 +0], word 0
      mov    [edi+idts+ 8 +2], dx
      mov    [edi+idts+ 8 +4], word 11100101b*256
      mov    [edi+idts+ 8 +6], word 0

      mov   ebx,[0x3000]
      shl   ebx,3
      add   ebx,tss0_l

      mov   ecx,[0x3000]
      shl   ecx,2

      mov   eax,[0x3000]
      mov   [tasknum+ecx],eax

      mov   eax,[ebx]
      mov   [reg1+ecx],eax
      mov   eax,[ebx+4]
      mov   [reg2+ecx],eax

      mov   ecx,8
      imul  ecx,[esp]             
      mov   eax,[tss0sys_l+ecx]
      mov   [ebx],eax
      mov   eax,[tss0sys_l+ecx+4]
      mov   [ebx+4],eax

      call  save_registers

      mov   esi,[0x3000]   
      imul  esi,128

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -