Źródło:


Komentarze (0)


Ocena:
0

źródło pochodzi od: fafek

Opis:
Loader jądra systemu operacyjnego (II etap).
Zasada działania jest prosta: w trakcie bootowania ładowany jest mikroskopijny programik, którego jedynym zadaniem jest wczytanie i skok do tego własnie loadera. Ten z kolei wczytuje własciwe jądro systemu, przekierowuje i ustawia przerwania.

Projekt chwilowo zamrożony, aczkolwiek bardzo chętnie do niego wrócę, jak znajdę trochę czasu.

Język: assembler


;; init


[BITS 16]
[ORG 0x500]

ReadSectors:
mov ah, 0x02    ; Read Disk Sectors

mov al, 0x02    ; Read one sector only (512 bytes per sector)

mov ch, 0x00    ; Track 0

mov cl, 0x0b    ; Sector 2

mov dh, 0x00    ; Head 0

mov dl, 0x00    ; Drive 0 (Floppy 1)

mov bx, 0xffff  ; Segment

mov es, bx
mov bx, 0x1080  ; Start of segment - offset value

.readsector
int 0x13
jc .readsector  ; If there was an error, try again



cli

xor ax, ax
mov ds, ax

lgdt [gdt_desc]
lidt [idt_desc]

mov eax, cr0
or eax, 1
mov cr0, eax

jmp 08h:clear

[BITS 32]
clear:
  mov ax, 10h
  mov ss, ax
  mov ds, ax
  mov es, ax
  mov fs, ax
  mov gs, ax
  mov esp, 09ffffh  ;; place for stack, from here we can freely uses 512 KB



;; redirect interrupts

      in      al,0x21
      mov    ah,al
      in      al,0xA1
      mov    cx,ax
 
      mov    al,0x11
      out    0x20,al
      out    0xEB,al
      out    0xA0,al
      out    0xEB,al
 
      mov    al,0x20
      out    0x21,al
      out    0xEB,al
 
      add    al,0x8
      out    0xA1,al
      out    0xEB,al
 
      mov    al,0x04
      out    0x21,al
      out    0xEB,al
      shr    al,1
      out    0xA1,al
      out    0xEB,al
      shr    al,1
      out    0x21,al
      out    0xEB,al
      out    0xA1,al
      out    0xEB,al
 
      mov    ax,cx
      out    0xA1,al
      mov    al,ah
      out    0x21,al
      mov    ecx,0x1000
      cld
picl1:  out    0xEB,al
      loop    picl1
 
      cli
      mov    al,255
      out    0xa1,al
      out    0x21,al


;;enabling irq

mov dx, 0x20
mov al, 0x11
out dx, al

mov dx, 0xA0
mov al, 0x11
out dx, al

mov dx, 0x21
mov al, 0x20
out dx, al

mov dx, 0xA1
mov al, 0x28
out dx, al

mov dx, 0x21
mov al, 0x04
out dx, al

mov dx, 0xA1
mov al, 0x02
out dx, al

mov dx, 0x21
mov al, 0x01
out dx, al

mov dx, 0xA1
mov al, 0x01
out dx, al

mov dx, 0x21
mov al, 0xfd ;;unlock keybord irq only ;)

out dx, al

mov dx, 0xA1
mov al, 0xff
out dx, al

sti

jmp 0x100080 ;; I'm in :)


hang:
  jmp hang

gdt:                    ; Address for the GDT

gdt_null:              ; Null Segment

dd 0
dd 0
gdt_code:              ; Code segment, read/execute, nonconforming

dw 0FFFFh
dw 0
db 0
db 10011010b
db 11001111b
db 0

gdt_data:              ; Data segment, read/write, expand down

dw 0FFFFh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:

%include "src/consts.asm"

%include "src/idt.asm"


gdt_desc:                      ; The GDT descriptor

dw gdt_end - gdt - 1    ; Limit (size)

dd gdt                  ; Address of the GDT



hng:
jmp hng



;; --- plik src/consts.asm

;; CONSTANTS


;; memory to use for system variables:  007E00->09FBFF


%define CARETPOS_X 0x7E00

%define CARETPOS_Y 0x7E01

%defin e READEDKEYLEN 0x7E02

%define READEDKEY 0x7E03 ;; 256B table


%define noname 0x7F03


;; --- plik src/idt.asm

;;idt


idt0:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], '0';
t:
jmp t

pop ds
pop es
pop fs
pop gs
popa
iret

idt1:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], '1';
t1:
jmp t1

pop ds
pop es
pop fs
pop gs
popa
iret

idt2:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], '2';
t2:
jmp t2

pop ds
pop es
pop fs
pop gs
popa
iret

idt3:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], '3';
t3:
jmp t3

pop ds
pop es
pop fs
pop gs
popa
iret

idt4:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], '4';
t4:
jmp t4

pop ds
pop es
pop fs
pop gs
popa
iret

idt5:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], '5';
t5:
jmp t5

pop ds
pop es
pop fs
pop gs
popa
iret

idt6:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], '6';
t6:
jmp t6

pop ds
pop es
pop fs
pop gs
popa
iret

idt7:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], '7';
t7:
jmp t7

pop ds
pop es
pop fs
pop gs
popa
iret

idt8:
mov byte [0xB8000], 'D';
mov byte [0xB8002], 'o';
mov byte [0xB8004], 'u';
mov byte [0xB8006], 'b';
mov byte [0xB8008], 'l';
mov byte [0xB800a], 'e';
mov byte [0xB800c], ' ';
mov byte [0xB800e], 'f';
mov byte [0xB8010], 'a';
mov byte [0xB8012], 'u';
mov byte [0xB8014], 'l';
mov byte [0xB8016], 't';

mov byte [0xB80a0], 'R';
mov byte [0xB80a2], 'e';
mov byte [0xB80a4], 's';
mov byte [0xB80a6], 't';
mov byte [0xB80a8], 'a';
mov byte [0xB80aa], 'r';
mov byte [0xB80ac], 't';
mov byte [0xB80ae], 'i';
mov byte [0xB80b0], 'n';
mov byte [0xB80b2], 'g';
mov byte [0xB80b4], ' ';
mov byte [0xB80b6], 'k';
mov byte [0xB80b8], 'e';
mov byte [0xB80ba], 'r';
mov byte [0xB80bc], 'n';
mov byte [0xB80be], 'e';
mov byte [0xB80c0], 'l';
mov byte [0xB80c2], '.';
mov byte [0xB80c4], '.';
mov byte [0xB80c6], '.';

mov ecx, 0
idt8_loop:
inc ecx
cmp ecx, 0xfffff
jb idt8_loop

jmp 0x100080
iret

idt9:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], '9';
t9:
jmp t9

pop ds
pop es
pop fs
pop gs
popa
iret

idt10:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], 'a';
t10:
jmp t10

pop ds
pop es
pop fs
pop gs
popa
iret

idt11:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], 'b';
t11:
jmp t11

pop ds
pop es
pop fs
pop gs
popa
iret

idt12:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], 'c';
t12:
jmp t12

pop ds
pop es
pop fs
pop gs
popa
iret

idt13:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], 'd';

jmp 0x100080

pop ds
pop es
pop fs
pop gs
popa
iret

idt14:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], 'e';
t14:
jmp t14

pop ds
pop es
pop fs
pop gs
popa
iret

idt15:
pusha
push gs
push fs
push es
push ds

mov byte [0xB8000], 'f';
t15:
jmp t15

pop ds
pop es
pop fs
pop gs
popa
iret


irq1: ;keyboard

push gs
push fs
push es
push ds
pusha
mov ax,0x10
mov ds,ax
mov es,ax

mov byte [0xB800e], 'T'

mov al,0x61
out 0x20, al

in al, 0x60
mov ebx, READEDKEY

mov ah, [READEDKEYLEN]
add bl, ah
mov byte [ebx], al
inc ah
mov [READEDKEYLEN], ah

in  al,61h
mov  ah,al
or  al,80h
out  61h,al
mov  al,ah
out  61h,al

mov al, 0x20
out 0x20, al

popa
pop ds
pop es
pop fs
pop gs
iret


idt:
;first entry

dw idt0
dw 0x08
dw 0x8E00
dw 0x00

dw idt1
dw 0x08
dw 0x8E00
dw 0x00

dw idt2
dw 0x08
dw 0x8E00
dw 0x00

dw idt3
dw 0x08
dw 0x8E00
dw 0x00

dw idt4
dw 0x08
dw 0x8E00
dw 0x00

dw idt5
dw 0x08
dw 0x8E00
dw 0x00

dw idt6
dw 0x08
dw 0x8E00
dw 0x00

dw idt7
dw 0x08
dw 0x8E00
dw 0x00

dw idt8
dw 0x08
dw 0x8E00
dw 0x00

dw idt9
dw 0x08
dw 0x8E00
dw 0x00

dw idt10
dw 0x08
dw 0x8E00
dw 0x00

dw idt11
dw 0x08
dw 0x8E00
dw 0x00

dw idt12
dw 0x08
dw 0x8E00
dw 0x00

dw idt13
dw 0x08
dw 0x8E00
dw 0x00

dw idt14
dw 0x08
dw 0x8E00
dw 0x00

dw idt15
dw 0x08
dw 0x8E00
dw 0x00

%rep 0x10 ;; fill the rest ;0

dw 0x00
dw 0x08
dw 0x8E00
dw 0x00
%endrep


dw 0x00 ;irq0

dw 0x08
dw 0x8E00
dw 0x00

dw irq1 ;irq1 - keyboard

dw 0x08
dw 0x8E00
dw 0x00


end_of_idt:

idt_desc:
dw end_of_idt - idt - 1
dd idt

powrót

Tagi do źródła:
boot, system operacyjny, own os, loader, assembler


Nikt jeszcze nie skomentował tego źródła.


assembler baza danych bot c crawler delphi html java kontakt box loader mail obsługa sieci obsługa zapyt(..) own os php pop3 porównywanie (..) przeszukiwanie(..) robot sieciowy rozmowa symulator rozm(..) system operacy(..) voteban stop wysyłanie e-m(..) boot dekodowanie mim(..) java juzef kolejny skrypt (..) mysql pobieranie zawa(..) przeglądanie e(..) sdl whois wysyłanie e-ma(..)

Wszystkie...


sources.pl to strona przeznaczona dla programistów, początkujących programistów i zupełnych amatorów programowania. Tu możesz umieścić swój kod, program napisany przez Ciebie, lub po prostu skomentować kod innego programisty.

Szukaj:


Źródeł: 30, oczekujących: 3, odrzuconych: 11

O stronie | kontakt |

Sources.pl

Ilość wejść: dzisiaj - 210 (unikalne: 168), ogółem - 685642 (unikalne: 610706)