(original) (raw)
(C) Ville Turjanmaa, Helsinki, 25.8.2003, All rights reserved. ������� Mario79 24/12/2003 e-mail: mario79@ezmail.ru web: www.mario79.narod.ru MenuetOS (0.75) ���� � ���������� ���������� 1) ��������: ������� ����� 1a) ������������������ ��������� �������� 1b) ������������� ����� 1c) ��������� ����� ���� 2) ���������� ����������: ��� ��� �������� 2a) ������� �������� 2b) ��������� �������� ����������� ���������� 2c) ��������� ������ 2d) �������������� ����������� 2e) ����������� 2f) ��������� �������� ���������� 2g) ����������� ������ ���������� 2h) ������� ���������� ������ 2i) ���������� ���������� ������ ����������� - � MenuetOS MenuetOS ���� �������� �� ����� 32-� ���������� ���������� ��� ��������� �����-����� 32 ���������� ����������������, ��� ��������� ��� ��������� � ���������� ��������� ����������. Menuet �� ����� ������� ������ unix � �������� �������, ��� ��������������, �������� ���������� �� ����� ������������ ���������. Menuet �� ������������ �� �� ����� ������������� ������������ �������, ��� ��� ���� �������� � ���, ����� ������� �������������� ������ ����� ���������� ������� ������������ �����������, ������� ��������� ���������������� � ������� ������. ��������� ���������� ��� �� ������������� ��� ���������������� � ����������, ��������� ����� �������������� � ����� ������ ������. ������ ��� ���������� ���������������� ������� ������������� ��� ���������������� �� ����� 32-� ��������� ����������. GUI (����������� ��������� ������������) ����������� ����� ��� ������������� � �����������. (C) Ville Turjanmaa, Helsinki, 25.8.2003, All rights reserved. 1) ��������: ������� ����� 1a) ������������������ ��������� �������� ����� ��������� ��������, ������� bios ��������� bootsector Menuet, ������� � ���� ������� ��������� ����. Menuet ����� ���� ��������� � ������� ��� ����������. ����� ����� �������� � ������� MenuetOS ������������, ����� ���� ������� ���������. � ���� ������ ���� ���������� ������ BIOS Vesa � ���������� ������������ � ��������� ����������� ������ ����������� �����������. ���� �� �� �������, ������������ ������� Menuet ��������� ��� ��������� ������������ ��������. �������� ��������� �� ������� ����� ���������, ��� Menuet ����� �������� ���������, �� ��� ���� ����� ��������� ������������. ����� ����, ��� ����� ������, ���� ��������� ramdisk � ������������� � ����������� �����, ��������� �������������. � ���� ������ Menuet ������������� ����� ��� ���������� ��� 32-� ������ OS. 1b) ������������� ����� Menuet ���������� ��������, ������������ ��������������� � ������������ ����� ������������ ���������. ������� ����� ���������� ��������: - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . . . ���� . . ������� . . ------------------- . . --------------------- . . ���� 0 . . ���� 3 . . . . . . ����������� (IRQ 0 ) . . ������ � ���������� . . ����� ���������� . . ��������� ����� ���� . . ������ 1/100s . . . . . . . . ������ 1: OS-���� . . ������ 2,3.. : . . ����, GUI, ���� . . ���������� . . . . . . ���� ��������� . <------ . INT 0x40: ��������� . . ������� . . ����� . . . . . . ��������� ������� . ------> . ������� � ����������� . . . . . - - - - - - - - - - - - - - - - - - - - - - - - - - - ���������� ��������� � ������� ������ ������������ � 16 ��. ���� ������������ �������� ������ ������ 16 ��, ����� ���������� ����������� � ������� ������ ������������ � 10 ��. ������ ������ � ������ ��������� - os ������. OS ������ ������������ ���������� ���� ����� ������� �������, ��������: ����, ����������� ����, ���������� ��������� � ����. ��� �������� �������������, os ������ �� ����� ������� ���������� �� ��������� � ������� ����������. ��������� ������ ����������� ����� ���������� 0x40 � ������� ���������� ������� � ��������. ���� �� ������������ ��� �������� ����������. ����������� �� ������ �������� ����� ���������� ������� � ���������� ����������. �������� ������ ����������� ���, ����� �������� � �������� ����������� ������. ���������� �� ������ ������������� ������������ ����� ��� ������� ���������� ������. ��� ��������� �� ����������� ������ ���������� �� ����� ����������. ����������� ����������� ����� ���������� ������� � 1/100 �������. ������������ ����� �����, ����� ���������� � �������� change_task (��������� ������) � ��������� ��� ��������� event_wait (����� ������), ��������. ���� ����� ���������� �� ����������� ������ ������������� �������, ��� ��� ������������� �����. ����������, ������������ ������, �������� ��� 'firstapp' � kernel.asm. 1c) ��������� ����� ���� ������� ��� ���� �������� � Kernel.asm. Kernel16.inc � Kernel32.inc �������� ������������ �������� ���������. Bootmosf.asm - �������� � ������� Bootmf32.asm - �������� � ���������� Kernel.asm <- Kernel16.inc <- Bootcode.inc ���������� ��������� �������� <- Booteng.ing ���� ��������� �������� <- Pci16.inc ������� 16-� ��������� pci <- Kernel32.inc <- Sys32.inc ���������� ���������� <- Stack.inc ������� ��������� <- Queue.inc �������� ������� <- Ip.inc �������� ip <- Tcp.inc �������� tcp <- Udp.inc �������� udp <- Ethernet.inc �������� ��������� ���� Ethernet (�� ������ ��������� CSMA-CD) <- Rtl8029.inc ������� Rtl8029 <- I8255x.inc ������� I8255x <- Rtl8139.inc ������� Rtl8139 <- Shutdown.inc ���������� � ������������ <- Fat32.inc ������ / ������ hd (����������) <- Vesa12.inc ������� vesa 1.2 <- Vesa20.inc ������� vesa 2.0 <- Vga.inc ������� VGA <- Sb16.inc Sound blaster (�������� �����) <- Mouse.inc ������ ���� <- Skincode.inc ���������� ���� <- Skindata.inc ����������� ���������� <- Memmap.inc ����� ������ <- Pci32.inc ������� 32-� ��������� pci Kernel16.inc � kernel32.inc ����� ����� �������������� ��� ������������ ������������������� ������������, ������� �������� ����������� ��������. ���� ����� ������������ ����� ������������� ���� ��� ������ ��������� �� ������. 2) ���������� ����������: ��� ��� �������� 2a) ������� �������� ������� �������� ��������� ���, ����� ��������� �� ���������� ��������� ����. ���������� ������� ������������ � Interrupt Descriptor Table (������� ����������� ����������), ������� � ���� ������� ���������� ��������� �������� � General Descriptor Table (����� ������� ��������). GDT ����� ��������� �� ����������� Task Switch Segments (�������� ������������ ������) � ������� TSS�s. ������ ������� ����� TSS ��������������� ��� ������ � ��� �������� ������ TSS ��� ���������� ��������. ��� ��� ����������� ����������� ��� � TSS ���������� ��� � TSS ���������� ������ ��� ������� ������������ ��������. Menuet ��������� ������ ������������ ������ � ������ ���������� � ������� �����������. ��������� ������ : ����������� : IRQ�s : ��������� ����� : : : Int 0x0-0x11 : (���������� ������) : Irq 0x0-0xF : Int 0x40 v : v : v : v v : v : v : v IDT : JMP : IDT : IDT - ������ ������ : : - ������ ������ : - ������ ������ v : v : v : v v : v : v : v GDT : GDT : GDT : GDT - TSS ��������� : - TSS ��������� : - TSS ��������� : - TSS ��������� v : v : v : v v : v : v : v TSS : TSS : TSS : TSS - ����������� : - �������� : - ����������� : - ��������� ������ ��� ������� ��� ���� TSS: ����������� � ��������� � ���������. TSS�s ������������� ��������������� �������� ��������� os ��� ������� ����������� ��������. ������������ ��������� ����� ���������� ������ � ���������� ������������� ����� GDT. ���� ���������� ������� ��������� ��������� �����, os ������� �������� TSS � ��������� ������. ��� ��� ������ ������������� ������ ���������� ������ ���, ����� ���������� ��������� �����. ������� ���������� �� ������ ������������� ������������ ����� ��� ���������� ������, ��� ��� ����� ��������� ���������� ������ ����������� � ���� (4096 ������). ����� ����������� ��������� ������, �� ���������� ������� jmp TSS, ����� ��������� ������� TSS ��� ��������� ����� TSS, � ����������� �� ����, ����� ����� �������� �������� � ��������� ����� ��������. 2b) ��������� �������� ����������� ���������� (��������� ������ � IRQs 0x1-0xF) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . ���������� ������� �������� . . . . ��� : Task_gate . . ������������ : sys32.inc, �idts:� . . ������ : 0x60 * 8 bytes . . ��������� �� : GDT ( TSS0I_L ) . . . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . GDT ( TSS0I_L ) . . . . ��� : �������� TSS . . ������������ : sys32.inc, gdt, tss0i_l: . . ������ : 0x60 * 8 bytes . . ��������� �� : TSS, mem 0x290000, 0x60 ����� � ��������� 128 ���� . . . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . ������� TSS � 0x290000 . . . . ��� : Task State Segment (������� ��������� ������) . . ������������ : [0x290000] . . ������ : 0x60 * 128ytes . . ��������� �� : GDT, ������ . . . . eip -> mem : [sys_int], 0x60 * 4 byte . . esp -> mem : 0x720000, 0x60 * 1024 byte . . cs -> GDT : int_code . . ds -> GDT : int_data . . ss -> GDT : int_data . . es -> GDT : int_data . . gs -> GDT : int_data . . fs -> GDT : int_data . . eflags : dword 0x11002 ( cli, resume ) . . ss0 -> GDT : inte_code . . ss1 -> GDT : ring1_code . . ss2 -> GDT : ring2_code . . esp0 -> mem : 0x52000 . . esp1 -> mem : 0x53000 . . esp2 -> mem : 0x54000 . . . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2c) ��������� ������ (���������� 0x00-0x11) �������� ��������� ������ ����� ������ �������������� ������������ � ���, ��� ������ ���������, � ���������� ���� ����������� ���������� ��� �������� ������ �� ������ ���������. ��� ������ ������ �����������, ����� ����� �������� ��������, ����� ����� ��, ��� � ���������� ���������� ����������. ���������� 0x00 - > 0x11 �������� ������� s0, s1, s2, .., s11 � sys32.inc. sd: ; ����� ��������� �������� ������, ���������� ; ������������� ����������� eflags mov [error_interrupt],0xd ; ������������� ������������ ��� ������ ; ��������� � ���������� 0xd mov [error_interrupt_entry],dword sd ; ������ ��� �������������� ; ����� ���������� � TSS call show_error_parameters ; �������������� ������ ��������� ; ��� ������������� ������������� mov edx,[0x3010] ; �������� ������� ��� �������� mov [edx+0xa],byte 4 ; ������ os sti ; ��������� ���������� ��� ������������ jmp $ ; ����� ��� ������������ ����� ��������������� ������ ���������� �������� �����������, ��� ������� ������� ������ �������� ����������, ����������� �� �����. ����������� ��������� ���������� � ��������� ������ TSS (eflags), ��������. � ��� ��������� ���������� os-������, ������� ���������� �� ������ �����. 2d) Floating Point Unit - �������������� ���������� (���������� 0x07) ������������� FPU � ���������� ��������� ������� ������� Task Switched flag (����� ������������ ������). Menuet ��������� ������ ������������ ������ � ������ �����������, ������� ����������� � Task Switched flag. ��� ��� �� �� ����� ��������� � ���������� �������� jmp TSS. ������, ��� �� ������ ������� TSS ����������, �� ������ c������ ��������� ������: 1) ( s7 ) �������� ����� ����� �������� (eip � ���������������� ���������) � ����������� TSS � ������� 'fpu_handler� (sys32.inc). 2) ( fpu_handler ) ������� TS-flag, ��������� ��������� FPU � ������������ � �������� �������� iret, ������� �� ������������� TS flag. 2e) ����������� (IRQ 0) ����������� ������ ������� ������� ������� � Menuet. ����������� ����������� �������� 100 ��� � ������� ��� ����� ������ �������� change_task (��������� ������). Change_task - ������� ����, ������� ����������, ��������, ����� ��������� ������� ������� ������. ������ �������������: 1) ������� ��������� ������ ��������, ������� ����� ������������ ����� � ����������� ��������������� ����������� ���������� 2) ������� flags ���������� ���������, ����� �������������� ����� � ������ jmp -�������� 3) �������������� ��������� ������� � ������������� CPU (����������� ���������) ��� ����������. 4) a) ���� ���� ��������� ������ �������, ����� ��������� ������ � process list (������ ���������) � �������� � �������� TSS � GDT b) ���� ���� ��������� ������ ��������, ������������ � ������ ������������ ��������. irq0: ; ����������� ; ��������� ������ ���������� ������ ���������� [error_interrupt] ; ��������� �� erroneus ������� ����������, ; ������� ������ ���� ������, ��� ��� ����� �������������� �����. cmp [error_interrupt],-1 je no_error_in_previous_process mov edi,[error_interrupt] ; ������� ���������� GDT flags 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 ; ������������ flags (�����) � ����������� TSS mov [edi+l.eflags-tss_sceleton],dword 0x11002 ; cli mov [0xffff],byte 0 ; �change task� flag (���� ��������� ������) ��� ������������ ; ��� ��������� �������� � �������� ������ mov [error_interrupt],-1 ; .. �� �������� ������������ �������� ����� no_error_in_previous_process: mov edi,[0x3000] ; �������� ���������� ������� ����� ����� � GDT imul edi,8 ; ��� ����� ��� ����� ���� ������ ����� � �������� jmp 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 ; ���������� ���������� ������ (-1) 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 ; ���������� �������� �do not change task� je nodecffff ; (�� ����������� ������) dec byte [0xffff] nodecffff: shl bx,3 ; ���������� ����� GDT ��� ��������� ������ add bx,tss0 mov [tss_s],bx mov al,0x20 ; ������������� Programmable Interrupt Controller mov dx,0x20 ; (��������������� ���������� ����������) out dx,al db 0xea ; jmp .. ( to gdt ) tss_t dd 0 ; word (tss0+(process_slot*8)):dword 0 tss_s dw tss0 jmp irq0 ; ����� ����� ��� ���������� irq0 2f) ��������� �������� ���������� �� ����� �������� ���� �������������� ������� GDT, ������� ������������ ���������� ��������� ���������� ������. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . GDT ( TSS0_L ) . . . . ��� : ��������� TSS . . ������������ : sys32.inc, gdt, tss0i_l: . . ������ : ( max_processes ) * 8 bytes . . ��������� �� : ������� ���������� TSS � [0x40000] . . . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ��� �������� ��������, os ���������� ��������� Task State Segment (������� ��������� ������) � ����� ��������� (���� 3) ��� GDT, ������� ���������� ����������� ������������� ����������� ����������� ���������� ������. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . ������� ���������� TSS . . . . ��� : Task State Segment (������� ��������� ������) . . ������������ : [0x290000] . . ������ : ( max_processes ) * 128 bytes . . ��������� �� : GDT, ������ . . . . eip -> mem : ( ������ ��������� ���������� ) . . esp -> mem : ( ������ ��������� ���������� ) . . cs -> GDT : app_code_l + ��������� ��������� . . ds -> GDT : app_data_l + ��������� ��������� . . ss -> GDT : app_data_l + ��������� ��������� . . es -> GDT : app_data_l + ��������� ��������� . . gs -> GDT : app_data_l + ��������� ��������� . . fs -> GDT : app_data_l + ��������� ��������� . . eflags : dword 0x11102 ( sti, resume ) . . ss0 -> GDT : inte_code . . ss1 -> GDT : ring1_code . . ss2 -> GDT : ring2_code . . esp0 -> mem : 0x55000 . . esp1 -> mem : 0x56000 . . esp2 -> mem : 0x57000 . . io -> abs : 512 -> ��������� ������ ������ . . . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2g) ����������� ������ ���������� Menuet ����� ��������������� �������� IRQ, ������� ���������� ������ ������ �� ������ ������������� �����������. ��� ������ ��� ����������� ������ �� �������� ���������� � ������� ����������, ����� ������ ��������. p_irq3: ; ���� �� �������, ������� ������� ; ������� IRQ ; ���������� ����������� � TSS - eflags call restore_caller ; �������������� ���������� ������ mov edi,15 ; ����� ������� ������������ call irqhandler ; ������ : irqhandler call return_to_caller ; ����������� � ���������� ������ jmp p_irq3 restore_caller: ; �������������� ���������� ��������� ; gdt, ����� �������������� �����, ����� ; �� ����� �� ����� ������ ������, ; ��� ��� ������ �������� ��� ; ������� (�������������) mov edi,[0x3000] imul edi,8 mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b ret return_to_caller: mov ebx,[0x3000] ; ����������� ������ jmp ( 0xea ) � shl bx,3 ; ������ ���������� ������ ����� add bx,tss0t mov [tss_irq12],bx db 0xea dd 0 tss_irq12 dw tss0t ret ; ����� ����� ��� ���������� IRQ 3 � ; ����������������� ����������� � �������� ; ������, ��������� ��� ������� ��������, ; ��� ��� �� ����� ������������ �� �� ; ����� ������� ��� ���� ���������� irqhandler: ... ret 2h) ������� ���������� ������ ������ ������ ���������� ������ � ���, ����� ��������� ��� ��������� ������ ������������� ������������. ��� ������� ���������� ������� �������� TSS, ��� ���������� ������������ �������, ����� ����������� ��������� �����. ��� ������ ������������ ������ ��� ���������� �������������� ������. ���������� �� ������ ������������� ������������ ����� ��� ��������� �����, ��� ��� ����� ����������� � ����� os � ������ ���������� ������. �������� ��������, ��� ���� ���������� ������ - ����� ��������� TSS. ����� ������ ��������� ����� i40, ��� �������� ��������� � ������� GDT, ����� ������� �� ��������� ��������� ��������� ����� TSS, ������� ����� ������� ��� ����� ������� ���������� ������. ��� ��� ��������� ��� �������� i40, ��� �������� ��� �� ����� ���, �� � ��������� TSS. ������ ��������� ����� ����� ���� 4096 ������ ��� ������������� � ����� ����. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . GDT ( TSS0SYS ) . . . . ��� : ��������� TSS . . ������������ : sys32.inc, �tss0sys:� . . ������ : 128 * 8 bytes . . ��������� �� : 0x298000, 0x60 ����� � ��������� 128 ������ . . . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . . . ������� TSS � 0x298000 . . . . ��� : Task State Segment (������� ��������� ������) . . ������������ : [0x290000] . . ������ : 0x60 * 128ytes . . ��������� �� : GDT, ������ . . . . eip -> mem : i40 . . esp -> mem : 0x780000, 128 * 4096 byte . . cs -> GDT : int_code . . ds -> GDT : int_data . . ss -> GDT : int_data . . es -> GDT : int_data . . gs -> GDT : int_data . . fs -> GDT : int_data . . eflags : dword 0x11002 ( cli, resume ) . . ss0 -> GDT : int_code . . ss1 -> GDT : ring1_code . . ss2 -> GDT : ring2_code . . esp0 -> mem : 0x52000 . . esp1 -> mem : 0x53000 . . esp2 -> mem : 0x54000 . . . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; ���� ���������� ������ ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; i40: cli mov edi,[0x3000] ; �������� ������� ����� � GDT ��� imul edi,8 ; ���������� ���������, ������� ����� ; ������������ ����� � jmp 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: ; ��� ���������� ������ ���������� 0x40 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 ; ��������� ����� � GDT imul edx,[schd] ; ( � 0x40 ) � ������ ����������� �� 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 add esi,0x40000 mov eax,[esi+l.eax-tss_sceleton] ; ����� ��������� � mov ebx,[esi+l.ebx-tss_sceleton] ; ���������� mov ecx,[esi+l.ecx-tss_sceleton] pusha mov edi,[esi+l.eax-tss_sceleton] ; ��� ������������� ��������� �������� mov eax,[esi+l.ebx-tss_sceleton] mov ebx,[esi+l.ecx-tss_sceleton] mov ecx,[esi+l.edx-tss_sceleton] mov edx,[esi+l.esi-tss_sceleton] mov esi,[esi+l.edi-tss_sceleton] sti ; � �� ������ �������� push eax ; ��������������� ��������� ������� and edi,0xff call dword [servetable+edi*4] pop eax cli popa ; ��������� ����� ���������� ; ��������� � ���� mov esi,[0x3000] imul esi,128 add esi,0x40000 mov [esi+l.eax-tss_sceleton],eax ; ���������� ������������ ��������� � mov [esi+l.ebx-tss_sceleton],ebx ; ����������� TSS mov [esi+l.ecx-tss_sceleton],ecx mov ebx,[0x3000] shl ebx,3 add ebx,tss0_l mov ecx,[0x3000] shl ecx,2 mov eax,[reg1+ecx] mov [ebx],eax mov eax,[reg2+ecx] mov [ebx+4],eax mov [tasknum+ecx],dword 0 mov edi,8 pop eax ; ������� ���� ��������� gdt mov [usedi40+eax],byte 0 imul edi,eax mov [edi+tss0sys_l +5], word 01010000b *256 +11101001b mov ebx,[0x3000] ; jmp -> TSS ���������� shl bx,3 add bx,tss0t mov [tss_s3],bx db 0xea tss_t3 dd 0 tss_s3 dw tss0t jmp i40 save_registers: ; ��� ����� ���������� ������ ... ret servetable: ; ��������� ������� dd sys_drawwindow ; 0-DrawWindow (����� ����) dd syscall_setpixel ; 1-SetPixel (����� �������) dd sys_getkey ; 2-GetKey (��������� �������) ... dd sys_ipc ; 60-Inter Process Communication (���������� ����� ��������) dd sys_gs ; 61-Direct graphics access (������ ������ � �������) dd sys_pci ; 62-PCI functions (������� ���� PCI) dd sys_msg_board ; 63-System message board (����� ��������� ���������) times 255 - ( ($-servetable) /4 ) dd undefined_syscall dd sys_end ; -1 ���������� ���������� 2i) ���������� ���������� ������ ����� ���������� ������� �����������, ���������� �������� ������������ �������� ������� ��������� �������. ����� ������� ������ ���� ��������� � �servetable� (������� �������) � ����� sys32.inc. �������� ��������, ��� ��� ������������� � ����� ������� ��������, �������� ������ ���� �������� ��������� ����: eax < - ebx, ebx < - ecx, ecx < - edx, edx < - esi, esi < - edi. ��� ���� ���������� �������� ������� �� ��������� � edx, �� ��� ����� ����� � ecx �� ������� ����. ����� ���������� � servertable (������� �������), ���������� ���������� ���� �� ������� ���������� .. mov eax,(new_system_function_number) mov ebx,2 int 0x40 .. ������� �� ��������� ������� �� ������� ����. new_system_function: cmp eax,2 ; ebx ����� � eax jne label1 mov dx,0x60 in al,dx mov [esp+36],eax ; ����������� ���������� � eax ��� ���������� ret label1: mov [esp+36],eax ; ����������� ���������� � eax ��� ���������� ret �� ������� ����, �� ������� ������� ����������� ��� ����������������� ������ ��� ���������� ������� ������� ����� �����. ��� ��������� ���������� ���������� ��������� � ���������� �����. mov [esp+36],eax ; ����������� eax ���������� mov [esp+24],ebx ; ebx mov [esp+32],ecx ; ecx ret ; ����������� �� ��������� ������� �������� ��������, ��� ������� 'ret' ������� ���������� ����� ����, ��� ������������ �������� ���� ����������� � �����. ���� ���� �� ���������� ���������� ��������� - ��������� �� ������� ������ ������ ���������� ���������, �� ������ ��������� ���������� ����� ��������� ����. mov esi,[0x3010] ; esi <- ���� ������ �������������� ���������� mov edi,[esi+0x10] ; edi <- ������ ���������� ��������� � ������ � �� �������� ���������� ���������� ����� � (�������� + edi). --