Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Implementacija sistemskih poziva

[es] :: Kernel i OS programiranje :: Implementacija sistemskih poziva

[ Pregleda: 3989 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Texas Instruments

Član broj: 227540
Poruke: 272
95.180.72.*



+61 Profil

icon Implementacija sistemskih poziva04.04.2010. u 12:44 - pre 170 meseci
Zna li neko kako su implementirani sami sistemski pozivi, recimo za DOS, za ispis karaktera na ekran?
 
Odgovor na temu

burex
46°05'N 19°39'E

Član broj: 24964
Poruke: 987
*.adsl.eunet.rs.



+679 Profil

icon Re: Implementacija sistemskih poziva04.04.2010. u 13:29 - pre 170 meseci
DOS koristi interrupt 0x21 kao "gateway" za prihvatanje sistemskih poziva, a kada se podesi registar AH da bude 9 i u registar DX se ubaci pokazivač ka početku stringa koji želimo da ispišemo, onda DOS ispisuje željeni string karakter po karakter sve dok ne dođe do znaka $ (znak dolara je terminator stringa, dakle svaki string koji želimo da ispišemo mora da bude u formi 'Zdravo!$'). Ne mogu tačno da tvrdim šta se dešava ispod haube u ovom slučaju, ali pošto DOS uglavnom radi u RealMode-u i ne koristi neke naprednije grafičke režime rada, pretpostavljam da jednostavno DOS usmerava sve ove pozive ka BIOS-ovom interrupt-u 0x10, i to konkretno na ovu funkciju.

Nadam se da sam donekle pomogao :P
A man is smart. People are stupid.
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
95.180.72.*



+61 Profil

icon Re: Implementacija sistemskih poziva04.04.2010. u 14:13 - pre 170 meseci
Citat:
Ne mogu tačno da tvrdim šta se dešava ispod haube u ovom slučaju

Pa manje više je i meni jasno kako se poziva neki syscall, ali me ovo i dalje kopka i nekako mi je i dalje mistično. :)
Ti proslediš neke vrednosti kroz registre i pozovoeš neki int i šta onda, neki mali ljudi uhvate one znake i ispišu ih na ekran. :)) Šalim se, ali me zanima koje instrukcije idu ispod toga, kako izgleda taj interrupt, najprostije rečeno, kako bismo mi napisali tako nešto "from the scratch"?
 
Odgovor na temu

burex
46°05'N 19°39'E

Član broj: 24964
Poruke: 987
*.adsl.eunet.rs.



+679 Profil

icon Re: Implementacija sistemskih poziva04.04.2010. u 16:09 - pre 170 meseci
Citat:
kako bismo mi napisali tako nešto "from the scratch"?

Pročitaj još jednom:
Citat:
pretpostavljam da jednostavno DOS usmerava sve ove pozive ka BIOS-ovom interrupt-u 0x10, i to konkretno na ovu funkciju.

Dakle, pravac na http://helppc.netcore2k.net/interrupt/int-10-9 i vidi kako treba da radi BIOS int 0x10 poziv, pa lepo ištampaj na ekran šta želiš "from scratch". Ja sam lično koristio TTY mode tj. int10, sa AH=0x0E:
http://helppc.netcore2k.net/interrupt/int-10-e , i to na sledeći način:

Code:

print:
push ax

.prn:
lodsb
or al,al
jz .end

mov ah,0eh
int 10h
jmp .prn

.end:
pop ax
ret

mov si,nekitext
call print

nekitext db 'BLAAAAAA!',13,10,0


A man is smart. People are stupid.
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
95.180.72.*



+61 Profil

icon Re: Implementacija sistemskih poziva04.04.2010. u 16:28 - pre 170 meseci
Nisi me razumeo, ili se ja nisam lepo izrazio šta me konkretno zanima.
Dakle, to što si mi ti naveo kao primer je korišćenje biosovog interrupt-a 10h, ali mene zanima šta se dešava unutar njega, kakve instrukcije koristi? Kada sam to pisao "kako bismo mi to napisali from the scratch", mislio sam na samu implementaciju int 10h.
 
Odgovor na temu

burex
46°05'N 19°39'E

Član broj: 24964
Poruke: 987
*.adsl.eunet.rs.



+679 Profil

icon Re: Implementacija sistemskih poziva04.04.2010. u 17:27 - pre 170 meseci
Uopšteno - kada se pozove funkcija za ispis teksta, BIOS piše u određenu oblast memorije (pretežno 0xB8000 na x86 sistemima, ako se dobro sećam) i to u odgovarajućem formatu (8bita za ASCII kod karaktera + 8bita za boje i ostale parametre), a prisutna grafička kartica grabi ono što tamo piše i izbljune sve na ekran po potrebi sa svojim ugrađenim "fontovima". Dakle, ako baš želiš da radiš na najnižem mogućem nivou (a u protected/long mode-u je to imperativ), jednostavno crtkaš ono što ti treba u memorijski bafer na 0xB8000 (pod uslovom da radiš u tekstualnom režimu).

Primer jedan:
Code:

char *video = (char *) 0xb8000;
unsigned int i,n,off=0;
off = 80;
  for (i=0;i<80;i++)
  {
    video[n] = ' ';
    n++;
    video[n] = 0x10;
    n++;
  }
  
video[68+off] = 'H';
video[69+off] = 0x10;
video[70+off] = 'e';
video[71+off] = 0x10;
video[72+off] = 'l';
video[73+off] = 0x10;
video[74+off] = 'l';
video[75+off] = 0x10;
video[76+off] = o';
video[77+off] = 0x10;
video[78+off] = '!';
video[79+off] = 0x10;

A man is smart. People are stupid.
 
Odgovor na temu

[es] :: Kernel i OS programiranje :: Implementacija sistemskih poziva

[ Pregleda: 3989 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.