[ glupi @ 10.01.2005. 22:05 ] @
Napisao sam (uz pomoc dobrih ljudi) kratak kod koji se boota i radi u real modu te u njega ubacio parce koda koje ne radi nista vec izvodi operacije koje bi trebale trajati neko vrijeme i izracunati koliko se dobije na ubrzanju u odnosu na izvodjenje istog koda na npr linuxu. To parce koda izgleda ovako (hehe nemojte se smijati ;)
Code:

segment .text
        global _start

_start:

        xor edx, edx

repeat:
        inc edx
        xor ebx, ebx
        xor eax, eax
        mov eax, 0xfffff
sss:
        dec eax
        cmp eax, ebx
        jg sss

        cmp edx, 0xfff
        jl repeat

        mov ebx, 0x03
        mov eax, 0x1
        int 0x80

Rezultat je bio zanimljiv, (ocekivao sam da ce raditi brze direktno ali ne ovoliko) ovaj kod se u linuxu izvodi minutu a "direktno" 4 sekunde. Da li je ovaj rezultat vjerodostojan ili sam zaboravio neki korak? Da li bi se na ovaj nacin mogli ubrzati i alati poput johna ili opcenito za crackanje, na taj nacin bi se mogli dobit zanimljivi rezultati, a za takve programe nije potreban standardni operativni sustav koji nam trosi resurse? Da li postoji bolji nacin da testiram brzinu izvodjenja?
[ BaCkSpAcE @ 11.01.2005. 00:23 ] @
Pa bilo je za ocekivati da ce to parce koda raditi brze ako ti samo ono predstavlja tvoj kernel. Sam operativni sistem, kao sto je Linux, ima milion problema o kojima treba da misli u toku rada, a taj tvoj programcic je za linux samo "jedna sitna riba u moru". Ti si uporedio:
- Linux koji moze sve i svasta da pokrene, znaci univerzalan je po tom pitanju
- Tvoj kernel koji je pravljen namenski i koji nista drugo ne moze da radi

Znaci razlika je ogromna u samom principu izrade, to je poredjenje babe i zabe. Usput si verovatno ovaj tvoj programcic pokrenuo pod linuxom kao obican proces, bez ikakvog prioriteta nad ostalima, a ovamo si ga pokrenuo samog sa potpunom kontrolom nad racunarom. Probaj ga uporedi sa nekim operativnim sistem koji radi u real-time modu... Imas i neke patcheve za linux da bi radio u real-time... Verujem da bi tada rezultati bili dosta povoljniji po linux...
Alati poput John-a se mogu ubrzati na ovaj nacin, samo ako imas zivaca sve lepo prepisati... I tu imas dve solucije: ako pravis svoj libc i sve ostalo sto ti treba da bi portovao John laganice, onda opet malo gubis na brzini. A ako bi sve to prepisao u ASM, e to bi vec bila prava stvar ;)
[ glupi @ 11.01.2005. 07:52 ] @
Shvacam ja to da linux ima malo vise stvari za obavljat i zbog toga mislim da bi bilo bolje na ovakav nacin rjesit takve programe jer dok se to radi obicno nema potrebe da se radi nesto drugo na kompu (npr dok spavam). Probat cu skinut i instalirat te patcheve pa vidjet kolka je razlika, ako je zamjetna onda mislim da cu prepisat johna u asm i bootat ga u real modu, jer ipak je brzina vazna.
[ sasas @ 11.01.2005. 08:07 ] @
Koliko puta si pod linuxom ponovio test? I da li su rezultati bili uvek slicni/identicni? Mozda je linux bas u trenutku izvrsavanja tvog kooda odlucio da uradi nesto zahtevno, npr. defragmentira malo RAM, upise zaostale IO transfere, ili sta god vec linux radi u slobodno vreme.

ss.

ps. ako ti je brzina vazna, real-mode nije najsrecnije resenje. mozda je bolje da se drzis protected moda.
[ BaCkSpAcE @ 11.01.2005. 19:31 ] @
Pa bitan je real-mode, kao i veca brzina odziva sistema... Andrew Morton je uradio patch za linux kernele za smanjenje latency-ja (patch se zove low latency). Cini mi se da je taj patch i ugradjen u nove kernele, tako da nema potrebe za njim. Inace, postoji TimeSys-ov patch za kernel koji radi bas fino... proguglaj malo pa ces naici na to...
[ glupi @ 11.01.2005. 21:50 ] @
Citat:
Koliko puta si pod linuxom ponovio test? I da li su rezultati bili uvek slicni/identicni?

Test sam ponovio jedno 4 puta s tim da sam resetirao komp nakon 2 testa, i rezltati su bili +-1 ili 2 sec.
Citat:
Cini mi se da je taj patch i ugradjen u nove kernele, tako da nema potrebe za njim.

Imam 2.6.3 verziju kernela, pa pretpostavljam da imam taj patch, ali cu probat skinut nesto novo i testirat. Sad mene zanima jel se isplati radit takav projekt (prepisivanje johna) i dali mogu ocekivat dobre rezultate?
[ dezelin32 @ 18.04.2005. 13:33 ] @
Moje misljenje je da je problem int 0x80. Sve ostalo je isuvise smesno - na svim procesorima se izvrsava za smesno kratko vreme. Sta uopste predstavlja poziv int 0x80 na linuxu?????

Cheers
[ tweeester @ 18.04.2005. 15:05 ] @
cek, cek, int 80 je na linux-u poziv systemskog API-ja ... ?! (fopen i slicne stvari ..)
[ DownBload @ 24.04.2005. 12:08 ] @
Citat:
dezelin32: Moje misljenje je da je problem int 0x80. Sve ostalo je isuvise smesno - na svim procesorima se izvrsava za smesno kratko vreme. Sta uopste predstavlja poziv int 0x80 na linuxu?????

Cheers


U ovom topicu se ne radi o problemu :) int 0x80 ti prebacuje code execution iz user moda (ring 3) u kernel mode (ring 0) i sluzi za pozivanje sistemskih poziva.


.
Citat:
tweeester: cek, cek, int 80 je na linux-u poziv systemskog API-ja ... ?! (fopen i slicne stvari ..)


Da, ali bas si fulao primjer :-) fopen() je implementiran na razini glibca.
[ tweeester @ 24.04.2005. 14:09 ] @
Omasio sam primer, nije bitno, hteo sam da napomenem da kod koji se samostalno butuje i izmedju ostalog poziva int 80 nije isto sto i slican kod koji pod Linux-om pozove int 80? Sad cu jos da lupam ali kad se samostalno butuje pozivanje int80 ne radi nista - ili pozove neki (pitaj boga koji, najverovatnije prazan) interup handler, dok isto to pod Linux-om prebaci na kernel execution mode, onda verovatno proveri parametre i ukapira da je u pitanju nebuloza i vrati exekuciju user modu - ali u sustini pojede veliko vreme (prelazak rin3 -> ring0 -> ring3) ? Dakle to moze biti razlog drasticne razlike u vremenu izvrsavanja.

Sto se tice fopen() - prilicno sam siguran da mora da ima posla sa kernel-om , mozda nije cela implementirana u kernel-u ali negde u sebi mora da se obrati VFS-u, ili gresim ?
[ glupi @ 25.04.2005. 22:15 ] @
Citat:
Sad cu jos da lupam ali kad se samostalno butuje pozivanje int80 ne radi nista - ili pozove neki (pitaj boga koji, najverovatnije prazan) interup handler, dok isto to pod Linux-om prebaci na kernel execution mode, onda verovatno proveri parametre i ukapira da je u pitanju nebuloza i vrati exekuciju user modu - ali u sustini pojede veliko vreme (prelazak rin3 -> ring0 -> ring3) ? Dakle to moze biti razlog drasticne razlike u vremenu izvrsavanja.

Mozda sam ja kriv jer nisam bio dovoljno preciza, ono je kod koji se vrti u linuxu i poziva exit syscall (koji pozovem preko int 0x80) da izadje van, dok u kodu koji se boota ne poziva int 80 jer nepostoji vec na drugi nacin izlazi iz koda.

Citat:

Sto se tice fopen() - prilicno sam siguran da mora da ima posla sa kernel-om , mozda nije cela implementirana u kernel-u ali negde u sebi mora da se obrati VFS-u, ili gresim ?

Pa ona ima "posla" sa kernelom preko open sistemskog poziva.
[ tweeester @ 25.04.2005. 22:44 ] @
Ma da, pre nego sto smo poceli da filozofiramo o int 80 trebalo je da pogledamo kod, ocigledno je kolko smo pazljivo pogledali onaj asembler gore :)