PDA

View Full Version : Un kernel col C++


DanieleC88
12-06-2004, 18:32
Purtroppo mi trovo a dover riscriver daccapo il sistema operativo :cry: :cry: :cry: :cry: ... va be', è un'occasione per rifarlo in C++ :D :D !

C'è solo un problema: quando provo a compilare, GCC mi dice:

bin/main.o: In function `__static_initialization_and_destruction_0(int, int)':
bin/main.o(.text+0xa9): undefined reference to `__dso_handle'
bin/main.o(.text+0xb5): undefined reference to `__cxa_atexit

Che devo fare? Cionci, maxithron, mjordan, et cetera: help!!!

ri
12-06-2004, 19:42
spiacente, la mia palla di vetro si sintonizza sul canale delle televendite, non riesco ad aiutarti...

NA01
12-06-2004, 22:28
se è in c++ devi usare g++, non gcc

ma hai fatto un sistema operativo????

maxithron
13-06-2004, 13:54
RI-EDIT

ho visto il post del kernel e mi sono ricordato!!

allora, hai bisogno proprio di studiarti le varie opzioni di g++.

DanieleC88
13-06-2004, 19:20
Scusatemi, era solo un problema di GCC (comunque usavo "gcc -x c++": non sono così tanto stupido...)

Un sistema operativo? Ci ho già provato, ma in C.
Ora mi chiede "__builtin_delete": devo creare una routine che elimini una classe creata all'interno del kernel? (tipo usando "free"? un sostituto del comando "delete" del C++?)

maxithron
14-06-2004, 12:25
Originariamente inviato da DanieleC88
Scusatemi, era solo un problema di GCC (comunque usavo "gcc -x c++": non sono così tanto stupido...)

Nessuno ti stava dando dello stupido :) tutt'altro!! però, potevi specificarlo che già passavi l'opzione per il c++ ;)



Ora mi chiede "__builtin_delete": devo creare una routine che elimini una classe creata all'interno del kernel? (tipo usando "free"? un sostituto del comando "delete" del C++?)


potresti spiegarmi meglio questo punto?

maxithron
14-06-2004, 13:03
Non so se ho ben compreso il problema della __builtin_delete, ma ti riferisci ad un problema di distruttore?

ilsensine
15-06-2004, 08:33
Non è semplice usare il c++ per fare un kernel. Il motivo principale è che il c++ tenta, dove può, di creare un layer di astrazione per la gestione della memoria (soprattutto per le classi).
Utilizzare il c++ per il kernel richiede una certa conoscenza di come il tuo compilatore c++ gestisca la memoria, in modo da creare l'ambiente di emulazione necessario. Nota che da compilatore a compilatore questo può variare.
La "__builtin_delete" è solo un sintomo di quello che sto dicendo -- probabilmente, risolto questo problema, ne dovrai affrontare altri simili.

DanieleC88
15-06-2004, 22:28
(rispondo ad entrambi) Boh, non saprei, sono un po' "artigianale" nelle cose, io...
Comunque, ho creato una void __builtin_delete(void*) che fa qualcosa di strano (ma non cancella un bel niente... tanto per consumare bytes...). Ora ho uno strano problema: quello che programmo in Assembler in oggetti separati da alcuni archivi creati con AR non viene trovato dal GNU LD al momento del linking. Anche se con `objdump -d file` le funzioni ci sono. Non so come spiegarmi meglio, magari vi mando il sorgente e date un'occhiata a questo problemino.

DanieleC88
15-06-2004, 22:33
Originariamente inviato da maxithron
Nessuno ti stava dando dello stupido :) tutt'altro!!

L'avevo capito, ironizzavo un po' :D :D .

Luc@s
15-06-2004, 22:45
voglio vedere il cod :D:D:D

ilsensine
16-06-2004, 09:13
Originariamente inviato da DanieleC88
Ora ho uno strano problema: quello che programmo in Assembler in oggetti separati da alcuni archivi creati con AR non viene trovato dal GNU LD al momento del linking. Anche se con `objdump -d file` le funzioni ci sono. Non so come spiegarmi meglio, magari vi mando il sorgente e date un'occhiata a questo problemino.
Sì ho scornato anch'io contro questa "feature". La soluzione è creare dei file .o in sostituzione di alcuni archivi .a problematici; ad esempio:

ld -r -o archivio.o file1.o file2.o ...

Per qualche motivo, ld non riesce a soddisfare le dipendenze incrociate negli archivi .a. Puoi usare i file archivio .o così creati al posto dei file .a, specificandoli direttamente come oggetti normali; ad esempio:

gcc -o programma main.o librerie/archivio.o
L'uso con ld è analogo.

DanieleC88
16-06-2004, 18:09
Si, infatti LD mi dà un po' di problemi, ma stranamente mancava solo questo:

extern "C"

.... :muro: :muro: :muro:

Ora va meglio, ma purtroppo la mia `inb` non funziona un granchè.
Presto posterò anche l'intero codice, per la gioia di grandi e piccini :D :D !

DanieleC88
16-06-2004, 18:11
Originariamente inviato da Luc@s
voglio vedere il cod :D:D:D

Guarda, meno male che intendevi codice, mi stavo per pisciare sotto dalle risate... (è una lunga storia, magari ve la racconto qualche altra volta... non potete capire :) )

ilsensine
17-06-2004, 08:03
Originariamente inviato da DanieleC88
Si, infatti LD mi dà un po' di problemi, ma stranamente mancava solo questo:

extern "C"

Che ti poxxxx... :huh:

DanieleC88
27-06-2004, 17:54
Volevo solo avvisarvi che presto inserirò il codice del mio kernel.
Vi avviso: è un pre-pre-pre-pre-pre-pre-alpha, quindi non aspettatevi un granchè... Cmq, ho un problemino col bootloader, poi vi spiegherò meglio.

/\/\@®¢Ø
27-06-2004, 21:22
Originariamente inviato da ilsensine
Non è semplice usare il c++ per fare un kernel. Il motivo principale è che il c++ tenta, dove può, di creare un layer di astrazione per la gestione della memoria (soprattutto per le classi).

Da quel che sapevo io per gli oggetti allocati sullo stack in piu' vengono solo chiamati costruttore e distruttore automaticamente.
Per gli oggetti allocati nello heap invece una invocazione new dovrebbe essere analogo ad una malloc seguita dalla chiamata al costruttore e similmente una delete corrisponderebbe ad un operator ~ + free. Visto che operatore new e delete si possono ridefinire (tra l'altro e' l'unico caso in cui vedo utile ridefinire i due operatori globablmente) non dovrebbero esserci enormi differenze... o c'e' forse dell'altro ? :confused:

ilsensine
28-06-2004, 08:33
Le eccezioni?

DanieleC88
29-06-2004, 11:50
L'unica cosa che capisco io di tutto questo è che scriversi una delete manualmente è una bella rottura... (non ho un minimo di conoscenze tecinche, sto ancora al liceo)

Cmq, per il bootloader, il problema è chiamare il kernel ad un mb di memoria:

mov $0x10000,%eax
call *(%eax)

Questo dovrebbe funzionare ma devo abilitare l'A20. Il codice che ho tradotto io non funziona un granchè.

P.S.: che razza di istruzione è "bt" in assembly?

DanieleC88
29-06-2004, 11:55
Hm.. ho avuto una bella idea (bella per me, non so per voi): fare un sistema operativo tutti insieme! In questo forum, eccetto me :D, ci sono quasi solo persone esperte, con tutte le capacità per farlo.
??

AnonimoVeneziano
29-06-2004, 11:56
Originariamente inviato da DanieleC88

P.S.: che razza di istruzione è "bt" in assembly?


E' un istruzione abbastanza complessa e difficile da spiegare , presente dal 386 in su , sarebbe il Bit Test .

Cerca su google un Assembly Reference per le istruzioni che non conosci

Ciao

DanieleC88
29-06-2004, 12:06
Be' quell'istruzione mi blocca Bochs (è la parte non funzionante del codice per l'A20). Resta fermo a fare solo quello e non va avanti. Poi potrete vederlo direttamente nel codice.

DanieleC88
30-06-2004, 22:27
Ora sembra andare avanti anche usando "bt" ma la A20 non la abilita lo stesso. Strano.

Cmq, vi mando anche il codice. ATTENZIONE: l'estensione è ZIP solo perchè altrimenti il forum non la riconosce, ma è un .TGZ!!!

** Ho dovuto rimuovere dalla cartella "bin" il file floppy1.44 che è un'immagine da 1.44Mb di un floppy. Ricreatela con bximage o semplicemente creandola come nuovo file vuoto.

DanieleC88
09-07-2004, 22:39
...siete vivi?

Cos'ha il bootloader (attualmente kernel/boot/loader.s)? Non funziona proprio.

DanieleC88
11-07-2004, 19:01
Lo sapevo, non dovevo inserire il codice completo. Ogni volta che lo faccio non mi risponde più nessuno. :cry:

Perchè? :confused: :huh:

Luc@s
11-07-2004, 19:34
perche nn tutti siamo interessati a farci un Os.....perquanto sia una cosa interessante ;)

Luc@s
13-07-2004, 10:56
http://www.mega-tokyo.com/osfaq2/index.php/all%20in%20one

DanieleC88
15-07-2004, 20:34
Non intendevo dire che dobbiate farci un OS, è solo che era rimasta la domanda "perchè non mi va il bootloader?" in sospeso... e mi restano dei dubbi come questo ogni volta che nella discussione ci metto il codice incriminato. Nessuno risponde più. Anche se si tratta di semplici pezzi di codice in Visual Basic, è matematico. :cry:

Comunque, non fa niente, in culo alla modalità reale, mi adatterò alla modalità protetta ed alla grafica ci penserò più tardi con un driver specifico.

Grazie comunque a tutti per avermi risposto ed aiutato. E grazie a te per l'OS-FAQ. Ce l'avevo già, ma era la versione vecchia, quindi grazie ancora, sarà utilissima di sicuro! :D

Luc@s
15-07-2004, 20:44
forza e coraggio!
Se vuoi una mano.........io ci sono;)

The3DProgrammer
15-07-2004, 22:42
Originariamente inviato da DanieleC88
L'unica cosa che capisco io di tutto questo è che scriversi una delete manualmente è una bella rottura... (non ho un minimo di conoscenze tecinche, sto ancora al liceo)

Cmq, per il bootloader, il problema è chiamare il kernel ad un mb di memoria:

mov $0x10000,%eax
call *(%eax)

Questo dovrebbe funzionare ma devo abilitare l'A20. Il codice che ho tradotto io non funziona un granchè.

P.S.: che razza di istruzione è "bt" in assembly?



stai al liceo e ti scrivi un kernel da solo?

e io che credevo di essere intelligente:muro:

skerzo ciauz

The3DProgrammer
15-07-2004, 22:49
Originariamente inviato da DanieleC88
Ora sembra andare avanti anche usando "bt" ma la A20 non la abilita lo stesso. Strano.

Cmq, vi mando anche il codice. ATTENZIONE: l'estensione è ZIP solo perchè altrimenti il forum non la riconosce, ma è un .TGZ!!!

** Ho dovuto rimuovere dalla cartella "bin" il file floppy1.44 che è un'immagine da 1.44Mb di un floppy. Ricreatela con bximage o semplicemente creandola come nuovo file vuoto.


probabilmente lo avrai già, cmq te li butto li lo stesso:

The IA-32 Intel Architecture Software Developer’s Manual
consists of four volumes: Basic Architecture, Order Number
253665; Instruction Set Reference A-M, Order Number 253666;
Instruction Set Reference N-Z, Order Number 253667; and the
System Programming Guide, Order Number 253668. Refer to all
four volumes when evaluating your design needs.


questi 4 volumi sono la bibbia della programmazione low level. Dentro ci trovi tutto, dalla descrizione delle istruzioni con relativo esempio al formato degli MSR dal 386 ad oggi (ovviamente x le CPU intel). Io li ho usati per scrivere un "programmino" che rileva (tra le altre cose) la frequenza di bus di sistema.

ciauz ;)

cionci
16-07-2004, 02:22
Originariamente inviato da The3DProgrammer
Io li ho usati per scrivere un "programmino" che rileva (tra le altre cose) la frequenza di bus di sistema.

Ci sono novità sul tuo bench ?

The3DProgrammer
16-07-2004, 07:09
sto sviluppando la versione 2005 :)

dovrei rilasciarla a fine settembre.


ciauz cionci :)

Luc@s
16-07-2004, 11:16
Originariamente inviato da The3DProgrammer
Io li ho usati per scrivere un "programmino" che rileva (tra le altre cose) la frequenza di bus di sistema.

ciauz ;)

E stato difficile farlo??
Posso vederne i sorgenti?

The3DProgrammer
16-07-2004, 11:49
ciao,

per rilevare la frequenza di bus è necessario lavorare in modalità kernel ( detta anche ring 0) per cui è richiesta la scrittura di un device driver (.sys in NT, .vxd in win9x) per eseguire le istruzioni rdmsr e wrmsr. Non dico che è stato difficile, ma neanche semplice. Cmq nn posso farti vedere il sorgente, anche se posso via email mandarti un esempio di driver in ring 0. Se sei interessato a questo tipo di sw ti consiglio il sito www.sandpile.org, spulciando il forum trovi tutto quello che ti serve.



ora basta che siamo un po OT ;)

ciauz

cionci
17-07-2004, 02:11
Posta un po' di codice... Potrebbe essere interessante... Magari se ci potessi fare un tutorial (anche breve) sarebbe ancora più interessante ;)

The3DProgrammer
17-07-2004, 12:52
se trovo il tempo volentieri :)

ciauz

DanieleC88
17-07-2004, 13:41
Far un kernel al liceo non è poi così difficile, basta cominciare a programmare quando fai le scuole medie :D.

Comunque, fidati, non è un miracolo: il mio sistema è in uno stato pietoso e ci sono anche parecchi bug sparsi dappertutto, guardati il codice...

Piuttosto, fare un benchmark deve essere un bel traguardo. Io non saprei nemmeno da dove cominciare per scrivere un VXD e tutto il resto. Complimenti!
Comunque, hai ragione, stiamo andando un po' OT...

The3DProgrammer
18-07-2004, 17:40
mi sono scaricato il codice :)


ora gli do un'okkiata

ciauz:)

The3DProgrammer
18-07-2004, 17:43
l'archivio è corrotto:cry:

nn so se è un problema mio....

DanieleC88
18-07-2004, 23:42
No, come ho specificato anche quando ho incluso il file, in realtà si tratta di un .tar.gz, rinominato in .zip, visto che il altrimenti non viene riconosciuto dal forum. Ti avviso che ormai è diventato un po' vecchio, visto che ho fatto varie modifiche ed aggiunte.

The3DProgrammer
19-07-2004, 09:09
ah scusa

mi era sfuggito sto particolare :)

ora gli do un'okkiata

:)