Newsgroup: it.comp.os.linux.development
Titolo: Funzionamento kernel [niubbo]

Ciao ragazzi, volevo farvi qualche domanda sempre sul funzionamento a basso
livello di linux.
Una cosa che non capisco, che significa ESPORTARE una funzione?
Vediamo se ho capito bene. nel kernel sono implementate le chiamate di
sistema (write, read, ecc ecc), che vengono compilate insieme ad esso; a
questo punto il kernel deve rendere disponibili queste chiamate a tutti i
programmi (altrimenti non si potrebbe leggere in input ne scrivere in output
nel caso della read e della write), COME FA? Come fa a rendere disponibili
tali chiamate? Hanno sempre lo stesso indirizzo in memoria? C'è una qualche
tabella da qualche parte che tracci le corrispondenze tra indirizzi di
memoria e effettive funzioni? Si possono rendere disponibili a tutto il
sistema anke delle semplici variabili? in questo modo potrei accedervi da
qualunque programma io decida di scrivere.. ?
Posso esportare delle MIE funzioni? o magari delle MIE variabili?
Ho le idee un tantino confuse... se nn si era capito:-P
Ciao Ciao

 Posso esportare delle MIE funzioni? o magari delle MIE variabili?
Sě, basta che ti scrivi una libreria.
Ciao
- -- 
No matter. Try again. Fail again. Fail better.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/H8UuQb6qi6QXZLkRAn8DAJ9QMmz3wptf1QQbmzxJd0CN52cHGACfSEFL
gxkChaIrfS35woasipZ4YBM=
=sAWm
-----END PGP SIGNATURE-----

 Posso esportare delle MIE funzioni? o magari delle MIE variabili?
puoi scriverti le tue syscall, ma probabilmente devi poi farti anche delle
patch per le libc.

Ciao,
  ti conviene dare un'occhiata in giro a come si scrive un driver per 
linux, ti consiglio "Linux Device Driver" di Alessandro Rubini, e' un 
buonissimo libro. Le read, write ecc. sono funzioni esportate dai driver di 
periferica o dal filesystem manager.
Ciao.
Stefano.


 chiama l'int 80.
si usa solo al ... quindi 256 massime possibile diramazioni dentro un int e'
rimasto per compatibilita' ... ma possiamo anche dire che dipiu' non servono
o no ???
cmq stiamo parlando di x86 ... altre architetture non so come li convertono
gli int ...
ciao

 o no ???
a me sembra che il registro sia ben più grande di 8 bit.

 servono o no ???
si "potrebbe" usare solo al (o ah), in quanto le syscall al momento sono
252, pero' il registro che accoglie il numero della sysc è tutto eax (32
bit), non una sua partizione di 8bit.
Se fai / mov al,numero /, chi ti garantisce che i restanti 24 bit superiori
siano azzerati?
Ciao
- -- 
No matter. Try again. Fail again. Fail better.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/IpQKQb6qi6QXZLkRAsWFAJ4qP9Qqo7zBbcUylU2rIPE83ogmeQCdHTEV
6QikJAriPo0gqZTWvB8BuO0=
=E/Gc
-----END PGP SIGNATURE-----

 a me sembra che il registro sia ben più grande di 8 bit.
a si ??? quanto e' grande al ed ah ???
quanto e' grande ax ???
e quanto e' grande eax ???
se hai costruito una cpu nuova dimmelo che sono rimasto indietro all'ora ...
ciao

 Ciao
certo hai ragione ... (ora anchio non ricordo bene il manuale degli int :-/
e non mi ri cordo bene se era al o ah ... cmq ci siam capiti) il punto e'
che nel manuale ti viene specificato inserisci il valore tot in al e poi
chiama l'int ... non ti specifica che devi azzerare eax ... (o ax per me che
li ho studiati su 386) e cmq tutto quello che scrivevo non generava bug ...
ah anzi ora che mi ricordo c'erano pure int che avevano la doppia sotto
sezione e richiedevano anche gli altri 8 bit (ma se non ricordo male erano
per scheda grafica ed altro)
cmq rimane che molto probabile per compatibilita' gli int possono contenere
solo 256 diramazioni principali
ciao

 per scheda grafica ed altro)
Dipendeva dall'interrupt, era un gran casino cmq (brutte robe il real mode).
In linux di interrupt utilizzabile in userspace ce n'è 1 solo, non c'è
rischio di confondersi :)
Per fare una prova puoi assemblare con nasm una cosa tipo questa:
; ---- cut here ----
segment .data
buf: db "prova",10
.end
segment .text
global _start
_start:
        mov eax,4       ;sys_write
        mov ebx,1       ;stdout
        mov ecx,buf
        mov edx,(buf.end-buf)
        int 80h
        mov eax,0FFFFFFFFh      ;settiamo a 1 tutti i bit di eax
        mov al,4        ;proviamo ad eseguire di nuovo la syscall di prima...
        int 80h ;..settando solo al
        mov eax,1       ;sys_exit
        xor ebx,ebx
        int 80h
; ---- cut here ----
facendo strace si vede:
write(1, "prova\n", 6)                  = 6
syscall_4294967044(0x1, 0x80490a8, 0x6, 0, 0, 0, 0xffffffda, 0x2b, 0x2b, 0,
0, 0xffffff04, 0x804809f, 0x23, 0x246, 0xbffff9d0, 0x2b, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0) = -1 (errno 38)
la prima write è eseguita regolarmente, la seconda no in quanto ci sono i
24bit superiori di eax posti a 1 che "sporcano" il registro e quindi
l'esecuzione dell'int.
Infatti mettendo un movzx eax,al prima del secondo int 80h si ripristina la
funzionalità della seconda sys_write.
Ciao.
- -- 
No matter. Try again. Fail again. Fail better.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
iD8DBQE/IxyYQb6qi6QXZLkRAkHwAJ9YDhUReQ7L4DUVWhkywbiPmUzKbgCdGc8j
HHXQ/Sk4YphLaWSTH7JeZyU=
=j2OD
-----END PGP SIGNATURE-----

 Ciao.
ok capito ... bhe parlando di int mi sono ripreso gli studi da 386 ... e
forse ho sparato a caso sull'int 80 kernel
ciao

 e quanto e' grande eax ???
32
te l'ho già detto prima, a mi sembra di ricordare che non venga usato solo ah. 

 chiama l'int 80.
Aggiungo  che  il  2.6  con  le  glibc  appropriate  permette  di  usare
sysenter/sysexit   per  le   syscall. Questo   porta  un'aumento   delle
prestazioni  visto  che  l'int   e`  abbastanza  lenta  come  operazione
(soprattutto sui P4, dove e` 8-10 volte piu` lenta che sugli athlon).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"In linea di principio sarei indifferente al natale, se solo il natale
 ricambiasse la cortesia e mi lasciasse in pace." -- Marco d'Itri