Πρώτα απ 'όλα, σχολιάστε ότι αυτό είναι το πρώτο μου άρθρο και ελπίζω να σας αρέσει σε όλους.
Σε αυτήν τη σειρά θα μιμηθούμε Ο Linus Torvalds, πρόκειται να δημιουργήσουμε το λειτουργικό μας σύστημα από το 0. Σε αυτό το πρώτο επεισόδιο θα δούμε την εκκίνηση και θα βάλουμε ένα κείμενο στην οθόνη από τον πυρήνα μας.
Στην περίπτωσή μου καλείται το λειτουργικό σύστημα NextDivel. Η πρώτη απόφαση που πρέπει να λάβουμε μόλις εξετάσουμε το λειτουργικό σύστημα είναι τι πρόκειται να είναι το bootloader;
Εδώ υπάρχουν πολλές παραλλαγές, και θα μπορούσαμε ακόμη και να δημιουργήσουμε μία από εμάς. Ωστόσο, σε αυτό το σεμινάριο πρόκειται να χρησιμοποιήσω GRUB, γιατί οι περισσότεροι γνωρίζουν λίγο πολύ κάτι γι 'αυτόν. Δημιουργούμε έναν φάκελο που θα είναι η ρίζα του λειτουργικού μας συστήματος και εκεί δημιουργούμε το φάκελο / boot / grub
mkdir nextroot && cd nextroot
mkdir -p boot/grub
Εκεί δημιουργούμε το αρχείο grub.cfg ως εξής:
menuentry "NextDivel" {
echo "Booting NextDivel"
multiboot /next/START.ELF
boot
}
Σε αυτό το αρχείο έχουμε δει πώς GRUB θα φορτώσει τον πυρήνα μας, σε αυτήν την περίπτωση, στο /next/START.ELF. Τώρα πρέπει να δημιουργήσουμε τον πυρήνα μας.
Για αυτό θα χρειαστούμε GCC y GAS (ο συναρμολογητής του έργου GNU, συνήθως έρχεται με το gcc). Έτσι θα δημιουργήσουμε τον πυρήνα.
Πρώτα φτιάχνουμε ένα αρχείο που ονομάζεται kernel.asm. Αυτό το αρχείο θα περιέχει το σημείο εκκίνησης του πυρήνα μας και θα καθορίσει επίσης το multiboot (ένα χαρακτηριστικό ορισμένων bootloader όπως GRUB). Το περιεχόμενο του kernel.asm θα είναι:
.text
.globl start
start:
jmp multiboot_entry
.align 4
multiboot_header:
.long 0x1BADB002
.long 0x00000003
.long -(0x1BADB002+0x00000003)
multiboot_entry:
movl $(stack + 0x4000), %esp
call NextKernel_Main
loop: hlt
jmp loop
.section ".bss"
.comm stack,0x4000
Όλα όσα σχετίζονται με το multiboot είναι απλά να ακολουθήσετε τις προδιαγραφές. Όλα θα ξεκινήσουν στην αρχή, θα καλέσουν multiboot_entry, θα έχουμε ορίσει την κεφαλίδα multiboot στο πρώτο 4k και θα το βάλουμε (με movl)
Αργότερα καλούμε NextKernel_Main που είναι η συνάρτηση C του πυρήνα μας. Στο βρόχο σταματάμε να σταματήσουμε τον υπολογιστή. Αυτό μεταγλωττίζεται με:
as -o kernel.o -c kernel.asm
Τώρα πρόκειται να εισέλθουμε στον προγραμματισμό στο C. Θα νομίζετε ότι τώρα όλα είναι ένα κομμάτι κέικ, βάζουμε ένα Printf en κύριος και αυτό είναι, το έχουμε κάνει.
Λοιπόν όχι, από τότε Printf y κύριος είναι λειτουργίες που καθορίζονται από το λειτουργικό σύστημα, αλλά τις δημιουργούμε! Μπορούμε να χρησιμοποιήσουμε μόνο τις λειτουργίες που ορίζουμε εμείς.
Σε επόμενα κεφάλαια θα μιλήσω για το πώς να βάλουμε τη δική μας βιβλιοθήκη C (glibc, bionic, newlibc) αλλά κατά καιρούς. Μιλήσαμε ότι θέλουμε να βάλουμε κείμενο στην οθόνη, θα δούμε πώς το κάνουμε.
Υπάρχουν δύο επιλογές, μία είναι να καλέσετε το BIOS και ένα άλλο είναι η άμεση διαχείριση της μνήμης οθόνης. Θα κάνουμε το τελευταίο επειδή είναι πιο καθαρό από το C και θα μας επιτρέψει επίσης να το κάνουμε όταν μπαίνουμε σε προστατευμένη λειτουργία.
Δημιουργούμε ένα αρχείο που ονομάζεται NextKernel_Main.c με το ακόλουθο περιεχόμενο:
int NextKernel_Main()
{
char *str = "NextDivel says Hello World", *ch;
unsigned short *vidmem = (unsigned short*) 0xb8000;
unsigned i;
for (ch = str, i = 0; *ch; ch++, i++)
vidmem[i] = (unsigned char) *ch | 0x0700;
return 0;
}
Με αυτό χειριζόμαστε άμεσα τη μνήμη VGA και χαρακτήρας ανά χαρακτήρα το γράφουμε. Συντάσσουμε απενεργοποιώντας το stdlib:
gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding
Αν το έχετε φτάσει μέχρι τώρα, θα θελήσετε να δοκιμάσετε το ολοκαίνουργιο λειτουργικό σας σύστημα τώρα, αλλά δεν έχουμε τελειώσει ακόμα. Χρειαζόμαστε ένα μικρό αρχείο που να λέει στον μεταγλωττιστή πού βρίσκεται στο αρχείο να αφήσει κάθε ενότητα. Αυτό γίνεται με ένα σενάριο συνδέσμου. Δημιουργούμε link.ld:
ENTRY(start)
SECTIONS
{
. = 0x00100000;
.multiboot_header :
{
*(.multiboot_header)
}
.text :
{
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(4096);
}
.data :
{
data = .; _data = .; __data = .;
*(.data)
*(.rodata)
. = ALIGN(4096);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .; _end = .; __end = .;
}
Με αυτό καθορίζουμε τη θέση κάθε ενότητας και το σημείο εισόδου, εκκίνηση, που έχουμε ορίσει στο kernel.asm. Τώρα μπορούμε να ενώσουμε όλα αυτά τα παρασκευάσματα:
gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding -lgcc
Τώρα αντιγράφουμε το START.ELF στο / επόμενο μέσα στο φάκελό μας που προσομοιώνει τη ρίζα του λειτουργικού μας συστήματος. Πηγαίνουμε στον ριζικό φάκελο του νέου λειτουργικού μας συστήματος με την κονσόλα και επιβεβαιώνουμε ότι υπάρχουν δύο αρχεία: ένα /boot/grub/grub.cfg και ένα άλλο /next/START.ELF.
Πηγαίνουμε στον επάνω κατάλογο και καλούμε ένα βοηθητικό πρόγραμμα δημιουργίας ISO με το όνομα GRUB grub-mkrescue
grub-mkrescue -o nextdivel.iso nextroot
Μόλις το κάνουμε αυτό θα έχουμε ένα ISO. Αυτό το ISO μπορεί να ανοίξει σε υπολογιστές x86 (64 bit επίσης) και εικονικές μηχανές. Για να το δοκιμάσω, θα το χρησιμοποιήσω QEMU. Καλούμε QEMU από τη γραμμή εντολών:
qemu-system-i386 nextdivel.iso
Θα ξεκινήσει SeaBIOS και αργότερα θα έχουμε GRUB. Αργότερα, αν όλα είναι σωστά, θα δούμε τη φράση μας.
Θα νομίζετε ότι αυτό είναι δύσκολο, απαντώ, ναι είναι.
Η δημιουργία ενός λειτουργικού συστήματος είναι δύσκολη και αυτό εδώ δεν κάνει τίποτα χρήσιμο. Σε μελλοντικά κεφάλαια θα δούμε πώς να χειριστούμε τα χρώματα στην οθόνη, να διατηρήσουμε τη μνήμη και αν μπορώ, πώς να λάβω δεδομένα από το πληκτρολόγιο.
Εάν κάποιος δεν θέλει να αντιγράψει τα πάντα εδώ, έχω ένα αποθετήριο στο GitHub (πιο περίπλοκο) με το λειτουργικό σύστημα NextDivel. Εάν θέλετε να μεταγλωττίσετε NextDivel απλά πρέπει να έχεις git και cmake:
git clone https://github.com/AdrianArroyoCalle/next-divel
cd next-divel
mkdir build && cd build
cmake ..
make
make DESTDIR=next install
chmod +x iso.sh
./iso.sh
qemu-system-i386 nextdivel.iso
Σας ενθαρρύνω να συνεργαστείτε στο NextDivel εάν έχετε το χρόνο και την επιθυμία να δημιουργήσετε ένα λειτουργικό σύστημα. Ίσως ακόμη ανώτερο από το Linux ... ο χρόνος θα το πει.
:O
Ο Torvalds πήρε το λειτουργικό σύστημα Minix (που προέρχεται από το UNIX) στον Andrew S. Tanenbaum και το βελτίωσε.
Ο Tanenbaum είχε έναν αγώνα με τον Linus, προσβάλλουν ο ένας τον άλλον. Ο Tanenbaum λέει ότι το Microkernel είναι το μέλλον (HURD, Minix new cone Microkernel).
http://www.taringa.net/posts/linux/17215999/Linux-vs-Hurd-Kernel-Monolitico-vs-Microkernel.html
Αυτή ήταν η καλύτερη ανάρτηση που έχω δει μέχρι τώρα σε αυτό το ιστολόγιο. Θέλω ήδη να μάθω τι άλλο να κάνω.
Εντυπωσιαστείτε
Πραγματικά εντυπωσιακό !!
ΦΟΥΜΟΥΟΥΟΥΟΥΑ!
Είναι το geekiest post που έχω δει ποτέ hehe. Συγχαρητήρια Adrian, ένα άρθρο της πόρνης! εξαιρετικά ενδιαφέρον !!! 🙂
Συμφωνώ. Φαντάζομαι αυτήν την κατάσταση:
Χρήστης GNU / Linux Power (με χαρούμενο πρόσωπο):
"Ξέρω ήδη πώς να συνθέσω το Gentoo μου"
Nerd (περιφρονητικά): «pff, έχω δημιουργήσει τη δική μου διανομή ...»
Ναι, μπορώ να δημιουργήσω τη δική μου διανομή linux. Στην πραγματικότητα, αναπτύσσω ένα initramfs και έναν πυρήνα για ενσωματωμένο linux. Δεν είναι το ίδιο να δημιουργείς ένα λειτουργικό σύστημα από ένα linux distro. Το πρώτο είναι πολύ πιο δύσκολο, σχεδόν αδύνατο, το δεύτερο, όπως είπατε, μπορεί να είναι οτιδήποτε, ακόμη και το Ubuntu με το λογότυπο xD άλλαξε. Έτσι θα το άφηνα έτσι:
Χρήστης GNU / Linux (με χαρούμενο πρόσωπο)
- Ξέρω ήδη πώς να συνθέσω το Gentoo μου
Ημι-σπασίκλας
- Pff, έχω ακολουθήσει ένα linux από το μηδέν και έκανα τη δική μου διανομή
Nerd (με περιφρονητική στάση)
- pff, επειδή έχω προγραμματίσει έναν πυρήνα στο assembler και στο C
Saludos!
Αυτό είναι ενδιαφέρον για μένα, εν αναμονή των ακόλουθων κεφαλαίων.
Είδα αυτό το σεμινάριο πριν από λίγο καιρό, είναι για το C ++
https://github.com/SamyPesse/How-to-Make-a-Computer-Operating-System
Ευχαριστώ για τον σύνδεσμο, θα το ρίξω μια ματιά.
Θα ήθελα ένα λειτουργικό σύστημα 100% συμβατό με γραφικά AMD: /
Windows
χαχαχα στα Windows Catalyst δεν έχει υποστήριξη OpenGL, αν και στο Linux δεν μπορώ να χρησιμοποιήσω όλη τη γραφική ισχύ που θα περιμένω να δω τι θα συμβεί!
απλώς περιμένετε να εξαφανιστεί η βαλβίδα
Μαγική, τέλεια, εξαιρετική συνεισφορά, μοιάζει με μια μεγάλη σειρά δημοσιεύσεων 🙂
Buah Θα ήθελα να μάθω πώς να προγραμματίζω για να σας βοηθήσω, απλά ως τρόπος εξάσκησης με τη γνώση ότι μαθαίνετε και βοηθάτε κάποιον. Προς το παρόν σας αφήνω το σύνθημα για να τραβήξετε την προσοχή στο έργο μόλις το ολοκληρώσετε "Χρησιμοποιήστε το NextDivel, το πορνό φαίνεται το ίδιο (ή καλύτερο).", Θα σκουπίσετε το xD.
Mooooooolaaa !!!!
Πολύ καλό άρθρο, αλλά απλώς περίεργο γιατί δεν έχετε ακολουθήσει το έργο Linux From Scratch;
αφορά
Λοιπόν, το Linux από το Scratch είναι εντάξει και μπορείτε να πείτε ότι είναι δικό σας, αλλά είναι πραγματικά πολύ μηχανικό:
- Λήψη γραμματοσειρών
-Πιτάξτε τα
-Συντάσσω
-Εγκαθιστώ
-ΕΠΟΜΕΝΟ
Εδώ, παρόλο που το αποτέλεσμα είναι χειρότερο στο τέλος, μπορείτε να πείτε ότι έχετε ελέγξει όλα τα αρχεία.
Όπως προκύπτει από το προηγούμενο σχόλιό μου, επειδή δεν έχει το ίδιο επίπεδο πολυπλοκότητας. Επιπλέον, το linux από το μηδέν δεν είναι πραγματικά, σε αντίθεση με το όνομά του, δημιουργώντας ένα σύστημα από το μηδέν. Η δημιουργία ενός συστήματος από το μηδέν προγραμματίζει τον εαυτό σας, γράφοντας τον δικό σας πυρήνα, όχι τον πυρήνα linux, αν είναι δυνατόν ακόμη και τον δικό σας bootloader αντί grub, lilo, syslinux κ.λπ. Αν και ένα LFS δεν είναι μικρό επίτευγμα και είναι αρκετά περίπλοκο, δεν έρχεται καν κοντά στον προγραμματισμό του δικού σας πυρήνα
Επιπλέον, συμφωνώ με τον AdrianArroyo Calle ότι είναι πολύ μηχανικό, το έχω διαβάσει κάποτε και καταλήγετε να εγκαταλείπετε στην έκτη σελίδα, σας λένε επίσης να χρησιμοποιήσετε ποιες εκδόσεις των πακέτων γιατί διαφορετικά οι οδηγίες δεν λειτουργούν (αυτό δείχνει την έλλειψη ευελιξίας , Κατά τη γνώμη μου ). Νομίζω ότι είναι καλύτερο να έχετε κάτι από τη δική σας ιδέα, να συντάξετε τα πακέτα που θέλετε, ακόμη και να προγραμματίσετε κάποια, να συντάξετε έναν πυρήνα linux και με ειρήνη.
Saludos!
uuuoooohh !! Δεν έχω καταλάβει ποτέ μια ανάρτηση όσο αυτή.
Συνεχίστε 😀
Δεν ξέρω τι συμβαίνει:
σφάλμα: δεν βρέθηκε κεφαλίδα πολλαπλής εκκίνησης.
σφάλμα πρέπει πρώτα να φορτώσετε τον πυρήνα
Αν είναι παρηγοριά, έκανα το ίδιο λάθος. Προσπαθήστε να χρησιμοποιήσετε τις πηγές που βρίσκονται στο GitHub, εκεί το πρόβλημα έχει ήδη επιλυθεί. Τέλος πάντων νομίζω ότι αν αλλάξετε τη γραμμή στο grub.cfg από "multiboot /next/START.ELF" σε "kernel /next/START.ELF" μπορεί να λειτουργήσει. Δεν γνωρίζω ακριβώς.
Πρώτα απ 'όλα, υπέροχη είσοδος 🙂
Αντιμετωπίζω το ίδιο πρόβλημα με τη φόρτωση του πυρήνα από το grub. Ακόμη και χρησιμοποιώντας πηγές GitHub ή αλλάζοντας multiboot για πυρήνα ...
σφάλμα: δεν βρέθηκε κεφαλίδα πολλαπλής εκκίνησης.
σφάλμα: χωρίς φορτωμένο πυρήνα
Χρησιμοποιείτε το clang ως μεταγλωττιστή; Αλλάξτε το για το gcc
Θυμηθήκατε να χρησιμοποιήσετε το σενάριο σύνδεσης; Είναι απαραίτητο για τον σύνδεσμο (ld στην περίπτωσή μας) να γνωρίζει πού στο αρχείο πρόκειται να βάλει κάθε πράγμα. Σε αυτήν την περίπτωση, η κεφαλίδα multiboot πρέπει να βρίσκεται στην αρχή.
Χρησιμοποιείτε το σύστημα CMake; Εάν το χρησιμοποιήσετε, νομίζω ότι δεν αποτυγχάνει.
Εάν δεν λειτουργεί για εσάς, θα προσπαθήσω να βρω άλλη λύση.
[+100]
Τέλεια !!!
Είναι πολύ ωραίο 🙂
Βγάζω το καπέλο μου. Εντυπωσιακή ανάρτηση. Συγχαρητήρια.
Γοχα!
Θα ήταν υπέροχο αν μπορούσατε να ανοίξετε εφαρμογές που έγιναν σε HTML5 και Javascript χωρίς να χρειάζεται να χρησιμοποιήσετε πρόγραμμα περιήγησης, είναι αυτό δυνατό;
Μιλάω για να είναι σαν εγγενείς εφαρμογές.
Έτσι θα ήταν εύκολο να προγραμματίσετε αυτό το λειτουργικό σύστημα 😀
Σε αυτήν την περίπτωση δεν πρόκειται να το κάνω γιατί χρειάζεται πολύ περισσότερη δουλειά πίσω από αυτό, αλλά υπάρχει ένα λειτουργικό σύστημα που ονομάζεται "είναι" που κάνει αυτό που λέτε. Στην πραγματικότητα, η γραμμή εντολών είναι JavaScript και τα παράθυρα σχεδιάζονται χρησιμοποιώντας λειτουργίες JavaScript Canvas. Οι μηχανικοί της Nintendo το έκαναν και τώρα είναι ανοιχτού κώδικα.
http://code.google.com/p/es-operating-system/
Valla, ευχαριστώ για τις πληροφορίες 😀
θα ρίξω μια ματιά
Όποιος μπορεί να κάνει το δικό του λειτουργικό σύστημα μπορεί να πεθάνει ειρηνικά, αφού το πνευματικό επίπεδο που πρέπει να επιτύχει με αυτό. Σας κάνει να απαλλαγείτε από τον παράδεισο ή την κόλαση.
Κομμάτι απόσπασης.
Μέχρι στιγμής κανείς δεν είναι γνωστό ότι έχει φτιάξει μόνο κάτι που μπορεί να ειπωθεί ως ένα αξιοπρεπές λειτουργικό σύστημα κατασκευασμένο από το μηδέν, ούτε καν το Linux Torvalds όπως λέτε στην αρχή, καθώς αυτό ξεκίνησε από πηγές του Unix και όλα τα άλλα έχουν γραφτεί στο κοινό σε περισσότερα από ένα άτομα, η ζωή είναι πολύ σύντομη και ξεκινώντας από το μηδέν είναι αδιανόητη για οποιονδήποτε, ακόμη και αν το αντίθετο είναι επιθυμητό, είναι εμφανές σε πολλά λάθη που έγιναν κατά την αντιγραφή και επικόλληση από το Linux Torvalds
Οι πηγές unix είναι κλειστές, η χρήση του minix ... που είναι κάτι άλλο.
και αυτοί που έκαναν το QDOS τι;
βασίζονταν σε κάτι;
Από αυτό που βλέπω, ποιος δεν έχει το δικό του λειτουργικό σύστημα είναι επειδή δεν το θέλει, χαχαχαχα.
Τώρα σοβαρά, πολύ ενδιαφέρον! Πολλά είναι πέρα από τις περιορισμένες γνώσεις προγραμματισμού μου, αλλά θα διαβάσω τα υπόλοιπα μέρη αυτής της σειράς με αναμονή.
Ευχαριστώ για την ανάρτηση!
Με άφησες με ένα πρόσωπο O_O ... χωρίς την πρόθεση να υποτιμήσω τις συνεισφορές κάποιου, είναι το πιο «υπέρ» που έχω δει τελευταία. Χαιρετισμοί.
Πολύ καλό άρθρο, Adrián. Παρακαλώ συνέχισε…
Αστειεύεστε την Ημέρα των ανόητων του Απριλίου; Μην είσαι «Εμμηνόμηση του Linus Torvalds: Δημιουργήστε το δικό σας λειτουργικό σύστημα από το μηδέν». Δεν νομίζω ότι είναι δύσκολο για όσους ακολουθούν καριέρα σε κάποιο ινστιτούτο τεχνολογίας ή πανεπιστήμιο. αλλά για μένα είμαι αρχάριος τοξότης (υπάρχουν αυτοί που μας αποκαλούν "Noob", αλλά θεωρώ τον εαυτό μου πιο Newbie κάπως τεμπέλης) που μοιάζει να μην πατάω στη γη Τέλος πάντων, ΑΥΤΟ ΤΟ ΑΡΘΡΟ ΔΗΜΙΟΥΡΓΕΙ ΕΥΘΥΝΗ ΕΝΙΣΧΥΣΗ ΚΑΙ ΧΩΡΙΣ ΔΙΠΛΗ ΕΜΠΟΡΙΑ ΚΑΙ ΣΕΒΑΝΟ ΓΙΑ ΤΟΝ ΣΥΝΕΔΡΙΟ, ΣΥΓΓΡΑΦΕΙΣ. Το πρώτο πράγμα που θα κάνω είναι να προσπαθήσω να καταλάβω τουλάχιστον λίγο από αυτό το πολύτιμο υλικό.
ΕΥΧΑΡΙΣΤΟΥΜΕ Adrian Arroyo Calle, εξαιρετική δουλειά και ευγενική παράδοση γνώσεων.
LEL Εξαιρετική ανάρτηση, συνεχίστε.
Que Grandioso post, esto es lo que extrañaba de desde linux. Que maravilla.
Υπέροχη ανάρτηση, ευχαριστώ πολύ.
Δεν κατάλαβα τι κάνει το αρχείο link.ld, μπορεί κάποιος να το εξηγήσει;
Το αρχείο link.ld ενημερώνει τον σύνδεσμο (σε αυτήν την περίπτωση ld) όπου κάθε μέρος του κώδικα πρέπει να βρίσκεται στο αρχείο που προκύπτει. Ορίζουμε επίσης το σημείο εισόδου, καθώς καθώς δεν διαθέτουμε λειτουργικό σύστημα δεν μπορούμε να χρησιμοποιήσουμε το κύριο ως κανονικό πρόγραμμα, στην περίπτωση αυτή επιλέγουμε τη λειτουργία εκκίνησης.
Υπέροχη όλη η ανάρτησή σας! Περιμένοντας τα 7! Τι γίνεται αν έχω αμφιβολία, για παράδειγμα, εάν ήθελα μόνο να τρέξω έναν αλγόριθμο, χωρίς λειτουργικό σύστημα, πώς ξέρω τι μπορώ να χρησιμοποιήσω και τι όχι C;
Εάν το χρησιμοποιείτε έτσι, δεν θα μπορούσατε να χρησιμοποιήσετε τίποτα από το stdlib, το οποίο είναι σχεδόν αυτό που όλοι χρησιμοποιούν (χωρίς malloc, δωρεάν, printf, scanf, strcmp, κ.λπ.). Όλα πρέπει να εφαρμοστούν απευθείας από τη μνήμη ή το ASM. Ίσως σε ένα υψηλότερο κεφάλαιο να δείξω πώς να εγκαταστήσω μια βιβλιοθήκη C για το λειτουργικό σύστημα. Εάν χρησιμοποιείτε C ++ δεν μπορείτε να χρησιμοποιήσετε εξαιρέσεις και τους νέους τελεστές διαγραφής (και σίγουρα περισσότερους).
Νομίζω αυτό μπορεί να σας δώσει μια καλύτερη ιδέα για το πώς να το κάνετε.
Γεια σας, πριν από περίπου 5 χρόνια, ακολούθησα μια παρόμοια δημοσίευση και ανέπτυξα ένα μικροκάρτα που ξεκινά με τον ίδιο τρόπο, έχει κάποιες πτυχές που πρέπει να βελτιωθούν, αλλά μπορεί να σας ενδιαφέρει, εκτελείται σε προστατευμένη λειτουργία, εκτελεί πολλαπλές εργασίες και εκτελεί εικονικοποίηση μνήμης, πρόσφατα δούλεψα πρόγραμμα οδήγησης δίσκου και μονάδα δίσκου cd για να το εγκαταστήσετε και όχι μόνο να εκτελείται σε ζωντανό cd ... Χαιρετισμούς
Αγαπητέ μου, έχω ένα σφάλμα κατά την εκτέλεση της εντολής:
gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -freestanding -lgcc
link.ld: 5 σφάλμα σύνταξης
collect2: error: ld επέστρεψε 1 κατάσταση εξόδου
σύνδεσμος.ld
Ε = 0x00100000;
.multiboot_header: {
* (. multiboot_header)
}
Στη γραμμή 5 δεν βλέπω το σφάλμα, κάνει κάποιος το ίδιο;
Δουλεύω με ένα virtualized debian wheezy στο virtualbox
πρόσθεσε το ";" στο τέλος του * (. multiboot_header)
Εξαιρετική πρωτοβουλία, σίγουρα θα ακολουθήσω τα κεφάλαια αυτής της ανάρτησης, σκοπεύω να μάθω πολλά από αυτήν. Σας ευχαριστώ πολύ που αφιερώσατε χρόνο για να μας διδάξετε. Μια μοναδική λεπτομέρεια ως προς αυτό, πρέπει να σημειωθεί ότι ο Linus Torvalds δεν είναι ο δημιουργός οποιουδήποτε λειτουργικού συστήματος, δημιούργησε τον πυρήνα του συστήματος GNU / Linux (αυτό που έχει χρησιμοποιηθεί σε άλλο λειτουργικό σύστημα), το οποίο εξακολουθεί να αξίζει, αλλά είναι Είναι σημαντικό να πιστώσετε τον Richard Stallman για τη δημιουργία του περισσότερου λειτουργικού συστήματος.
Σας ευχαριστώ πολύ για τη συμβολή και ελπίζω να λάβετε υπόψη την παρατήρησή μου.
Μου ταιριάζει με το θέμα για λίγο, με ενδιέφερε μόλις διάβασα τον τίτλο. αλλά το μήνυμα συνεχίζει
σφάλμα: δεν βρέθηκε κεφαλίδα πολλαπλής εκκίνησης.
σφάλμα πρέπει πρώτα να φορτώσετε τον πυρήνα
Έχω ανεβάσει αυτό που παίρνω σε ένα ρεπό στο github https://github.com/rkmax/GenyOS
Το ίδιο συμβαίνει και σε μένα. Βρήκατε τη λύση;
μια ερώτηση που άρχισα να εισάγω τη σύνταξη και η γραμμή menuentry μου λέει εντολή δεν βρέθηκε ποιος μπορούσε να μου πει γιατί
Ετσι κανω εγω
BLACK @ BLACK-pc: ~ / blackroot $ menuentry «NextDivel» {
menuentry: η εντολή δεν βρέθηκε
Το περιεχόμενο αυτού του περιεχομένου δεν πρέπει να εισαχθεί στη γραμμή εντολών, αλλά στο αρχείο που δημιουργείτε ονομάζεται grub.cfg
Εξαιρετικό άρθρο, σας ευχαριστώ!
Θεαματικός…!! είναι ακριβώς όπως ο σύνδεσμος που λείπει.
Μου αρέσουν τα μαθήματα Emulating LInus Torvalds, αλλά υπάρχει ένα βήμα που δεν καταλαβαίνω, το εξής:
Τώρα αντιγράφουμε το START.ELF στο / επόμενο μέσα στο φάκελό μας που προσομοιώνει τη ρίζα του λειτουργικού μας συστήματος. Πηγαίνουμε στον ριζικό φάκελο του νέου λειτουργικού μας συστήματος με την κονσόλα και επιβεβαιώνουμε ότι υπάρχουν δύο αρχεία: ένα /boot/grub/grub.cfg και ένα άλλο /next/START.ELF.
Πηγαίνουμε στον επάνω κατάλογο και καλούμε ένα βοηθητικό πρόγραμμα για τη δημιουργία ISO με GRUB που ονομάζεται grub-mkrescue
Θα μπορούσε κάποιος να το εξηγήσει: σ
Απλώς για να δημιουργήσουμε ένα ελάχιστο ISO που μπορεί να φορτώσει το GRUB, αντιγράφουμε τον πυρήνα στο (το / του ISO, οποιονδήποτε φάκελο) /next/START.ELF και το αρχείο ρυθμίσεων GRUB στο (το / του ISO, οποιονδήποτε φάκελο) / εκκίνηση /grub/grub.cfg. Μόλις γίνει αυτό, δεν έχουμε εγκαταστήσει ακόμα το GRUB στο ISO και υπάρχει ένα βοηθητικό πρόγραμμα που δημιουργεί το ISO από ένα φάκελο και εγκαθιστά το GRUB που ονομάζεται grub-mkrescue. Τότε τελικά θα καταλήξαμε σε ένα bootable ISO που έχει εγκατεστημένο το GRUB, το οποίο μπορεί να διαβάσει τη διαμόρφωση για να εκτελέσει αργότερα σωστά το START.ELF. Δεν ξέρω αν έχω εξηγήσει τον εαυτό μου, αλλά αυτό που κάνουμε είναι ένα είδος συστήματος ψευδών αρχείων με το οποίο δημιουργούμε ένα ISO.
Καταπληκτική
Λοιπόν, κοιτάξτε πραγματικά ένα νέο σύστημα όχι τόσο πολύ, αλλά εάν βελτιώσετε το linux, για παράδειγμα, δημιουργώντας ένα linux exonucleus με ένα στοιχείο διακομιστή που ενεργεί ως ένα μικρο-πυρήνα, αν το επιθυμείτε, δηλαδή μια εξω δομή με μικροπυρηνική συμπεριφορά που θα ήταν σούπερ και linux.
Το άλλο πράγμα είναι ότι δεν είμαι ειδικός στον προγραμματισμό, μόνο μερικά τυροκομικά c ++ και κάποια java, θα ήταν αρκετό για μένα να δώσω στο πρόγραμμα linux kernel ένα module, να το κόβω, να το τροποποιήσω κ.λπ.
Χωρίς αμφιβολία πρέπει να κάνω ήδη διακοπές.
Αυτό είναι καλό και σε ποιο πρόγραμμα το σχεδιάζει και κωδικοποιεί;
παρακαλώ δώσε μου την απάντηση
Κατά τη σύνταξη από το git σας παίρνω:
[jmponce @ jar build] $ cmake ..
- Δημιουργία καταλόγου NextRoot
- Δημιουργία σεναρίου ISO
make DESTDIR = επόμενη εγκατάσταση
./iso.sh
- Βρέθηκε Doxygen: / usr / bin / doxygen (found version "1.8.9")
- Η διαμόρφωση ολοκληρώθηκε
- Η παραγωγή ολοκληρώθηκε
- Τα αρχεία build έχουν γραφτεί στο: / home / jmponce / next-divel / build
[jmponce @ jar build] $ make
Εξαρτήσεις σάρωσης του στόχου START.ELF
[7%] Δημιουργία αντικειμένου ASM-ATT src / CMakeFiles / START.ELF.dir / start / boot.asm.o
[14%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / NextShellLite.cpp.o
[21%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_Screen.cpp.o
[28%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / NextKernel_Main.cpp.o
[35%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_Panic.cpp.o
[42%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_Timer.cpp.o
[50%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_Memory.cpp.o
[57%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_Ports.cpp.o
[64%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_GDT.cpp.o
[71%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_ISR.cpp.o
[78%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_String.cpp.o
[85%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_IRQ.cpp.o
[92%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_IDT.cpp.o
[100%] Δημιουργία αντικειμένου CXX src / CMakeFiles / START.ELF.dir / start / ND_Keyboard.cpp.o
Σύνδεση του CXX με δυνατότητα εκτέλεσης START.ELF
/ usr / bin / ld: Μη συμβατό /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/libgcc.a παραλείπεται κατά την αναζήτηση -lgcc
/ usr / bin / ld: δεν μπορώ να βρω -lgcc
collect2: error: ld επέστρεψε κατάσταση εξόδου 1
src / CMakeFiles / START.ELF.dir / build.make: 402: Αποτυχημένες οδηγίες για το στόχο 'src / START.ELF'
make [2]: *** [src / START.ELF] Σφάλμα 1
CMakeFiles / Makefile2: 106: Αποτυχία στις οδηγίες για τον στόχο 'src / CMakeFiles / START.ELF.dir / all'
make [1]: *** [src / CMakeFiles / START.ELF.dir / all] Σφάλμα 2
Makefile: 117: Αποτυχία οδηγιών για το στόχο «όλα»
make: *** [all] Σφάλμα 2
Το σφάλμα φαίνεται να είναι ότι δεν μπορεί να βρει το llibgcc αφού έχετε την έκδοση 64-bit και προς το παρόν το σύστημα μεταγλώττισης αναγκάζεται να χρησιμοποιήσει 32-bit. Πρέπει να εγκαταστήσετε ένα πακέτο συμβατότητας στη διανομή σας ή καλύτερα, να χρησιμοποιήσετε ένα σύστημα 32-bit.
Έχω 32 bit και έχω το ίδιο σφάλμα, εννοείτε το λειτουργικό σύστημα ή την αρχιτεκτονική; το δικό μου είναι 64 Bit, αλλά χρησιμοποιώ το Ubuntu 32 bit, μην ρωτάτε, οικονομικά προβλήματα, με αυτό το λέω όλα.
Εξαιρετικό θέμα, περιμένοντας μεγαλύτερη εμβέλεια. Στην υγειά σας
Τέλεια ελπίζω για περισσότερα
Γεια σας, είμαι νέος πρεσβευτής που θέλει να δημιουργήσει ένα λειτουργικό σύστημα που υποστηρίζει όλα τα προγράμματα και τις πλατφόρμες, έτσι ώστε οι προγραμματιστές να μην χρειάζεται να διαθέτουν ισχυρά μηχανήματα ή εφαρμογές ή προγράμματα σε υπολογιστή.
γι 'αυτό με ενδιαφέρει αυτή η ανάρτηση, αλλά όταν κατεβάζω το git σας ή προσπαθώ να το δημιουργήσω, όλα πάνε καλά μέχρι να εκτελέσω την εντολή ./iso.sh ή grub-mkrescue -o nextdivel.iso nextroot θα λάβετε αυτό το σφάλμα
"Grub-mkrescue: προειδοποίηση: Το xorriso σας δεν υποστηρίζει" –grub2-boot-info ". Ορισμένες λειτουργίες έχουν απενεργοποιηθεί. Χρησιμοποιήστε το xorriso 1.2.9 ή μεταγενέστερη έκδοση ..
grub-mkrescue: προειδοποίηση: Το xorriso σας δεν υποστηρίζει "–grub2-boot-info". Η εικόνα του πυρήνα σας είναι πολύ μεγάλη. Η εκκίνηση του δίσκου έχει απενεργοποιηθεί. Χρησιμοποιήστε το xorriso 1.2.9 ή μεταγενέστερη έκδοση .. »
Πραγματικά δεν έχω ιδέα αφού γνωρίζω πολλά για εφαρμογές και ιστούς, αλλά δεν ξέρω τίποτα για το grub
Ίσως χρειαστεί να ενημερώσετε το πρόγραμμα xorriso στη διανομή σας. Τι διανομή και έκδοση χρησιμοποιείτε;
Χρησιμοποιώ το xubuntu 14.04lts και προσπαθώ να εκτελέσω το xorriso, αλλά το κέλυφος μου λέει ότι δεν μπορεί να το βρει και παίρνω apt-get εγκατάσταση xorriso αν και περίμενα ειλικρινά κάποια απάντηση, επειδή είχα μια κακή εμπειρία στην εγκατάσταση πραγμάτων που δεν γνωρίζω στο linux hehe. Θα το ενημερώσω τώρα και θα σας πω τι συνέβη
Στη συνέχεια, εγκαταστήστε το xorriso από το κέντρο λογισμικού ή απλώς από το τερματικό "sudo apt-get install xorriso"
Έχω ήδη κάνει ό, τι μου είπες και με το git και το δικό μου, παίρνω αυτό το xorriso 1.3.2: RockRidge χειριστής συστημάτων αρχείων, έργο libburnia.
Ρεύμα οδήγησης: -outdev 'stdio: nextdivel.iso'
Ρεύμα πολυμέσων: stdio file, overwriteable
Κατάσταση πολυμέσων: είναι κενό
Σύνοψη μέσων: 0 συνεδρίες, 0 μπλοκ δεδομένων, 0 δεδομένα, 1901m δωρεάν
Προστέθηκε στην εικόνα ISO: κατάλογος '/'='/tmp/grub.OEqSzV'
xorriso: ΕΝΗΜΕΡΩΣΗ: Προστέθηκαν 546 αρχεία σε 1 δευτερόλεπτο
xorriso: FAILURE: Δεν είναι δυνατός ο προσδιορισμός των χαρακτηριστικών του αρχείου προέλευσης '/ media / gaia / Jupiter1 / ShellSystem / nextroot / nextroot': Δεν υπάρχει τέτοιο αρχείο ή κατάλογος
xorriso: ΕΝΗΜΕΡΩΣΗ: Προστέθηκαν 546 αρχεία σε 1 δευτερόλεπτο
xorriso: ματαίωση: -abort_on 'FAILURE' αντιμετώπισε 'FAILURE'
Και το κοτλέ μου δεν καταλαβαίνω ότι η δομή μου είναι /nextroot/boot/grub/grub.cfg και nextroot / next / START.ELF
Ευχαριστώ, είμαι έτοιμος να προχωρήσω, ένας φίλος με βοήθησε και μου είπε ότι έκανα λάθος ήταν η οργάνωση του καταλόγου, οπότε το έκανα και αυτό είναι.
Με συγχωρείτε, μπορείτε να μου πείτε ποια διαδικασία εκτελέσατε αφού δεν έχω το σφάλμα να εκκινήσω: κανένα τέτοιο αρχείο ή κατάλογο
καμία εκκινήσιμη συσκευή.
Στην υγειά σας! Θα σας ζητούσα την εύνοια αν μπορούσατε να μου στείλετε ένα email με αυτό που εξηγείτε εδώ, έχω μπερδευτεί λίγο και πρέπει να συγκρίνω αυτό που έχω με αυτό που εξηγείτε, ίσως αυτό που δεν είναι σαφές για μένα είναι αν η δημιουργία του grub. cfg γίνεται στο τερματικό gcc ή πού ακριβώς; σε ευχαριστώ πολύ φίλε!
Δημιουργείτε το αρχείο grub.cfg με οποιονδήποτε επεξεργαστή κειμένου και πρέπει να το αποθηκεύσετε στο PROJECT_FOLDER / boot / grub / grub.cfg
Γεια σας Adrian, πρώτα απ 'όλα, σας συγχαίρω και σας ευχαριστώ για τη συμβολή σας.
Ξέρετε ότι το κάνω αυτό για μια εξάσκηση και άρχισα να το συνδυάζω μετά την καθοδήγησή σας, αλλά μετά την έναρξη βρήκα το πρώτο σφάλμα
$ as -o πυρήνα.o -c πυρήνας.asm
bash: as: η εντολή δεν βρέθηκε ...
Παρόμοιες εντολές είναι:
'ΑΝΩΝΥΜΗ ΕΤΑΙΡΙΑ'
'μετα Χριστον'
Δουλεύω στο fedora 20, και δεν μπορώ να βρω λύση σε αυτό το θέμα, θα εκτιμούσα την καθοδήγησή σας σχετικά με το αν πρέπει να αλλάξω κάτι σε gcc ή αέριο
ευχαριστώ εκ των προτέρων
Πρέπει να εγκαταστήσετε το GAS για να μπορώ να δω τον κωδικό σφάλματος. Δεν έχω στη διάθεσή μου το Fedora, αλλά θεωρητικά, αν εγκαταστήσεις το gcc-c ++, θα εγκαταστήσεις ολόκληρη τη σουίτα GCC και το GNU.
Είμαι μαζί σας, ξέρω κάτι για το C ++, το C # (αν και αυτό το τελευταίο δεν είναι πολύ χρήσιμο σε αυτό το θέμα) το κακό είναι ότι ακόμα δεν έχω εμπειρία, δεν χειρίζομαι ποτέ τη γλώσσα C, η δημοσίευσή σας είναι υπέροχη, δεν έχω πολλά να πω, αν έχω χρόνο, βλέπω. Ευχαριστώ.
Σας ευχαριστώ πολύ για τη μεγάλη βοήθεια….
Λατρεύω το linux είναι η καλύτερη περιοχή που υπάρχει, η αλήθεια για τα παράθυρά μου είναι σκουπίδια σε έναν ξέρω ότι ο δημιουργός του linux είναι ο δημιουργός των παραθύρων
Γεια σας, έχω ένα σφάλμα στο grub λέει
σφάλμα: αρχείο /next/START.ELF Δεν βρέθηκε
σφάλμα: πρέπει πρώτα να φορτώσετε τον πυρήνα
Θα μπορούσες να με βοηθήσεις και να κάνω googled αλλά δεν μπορώ να βρω
Σε παρακαλώ, πώς μπορώ να το δείξω το μήνυμα HELLO WORLD; Είμαι αρχάριος και ακόμα δεν ξέρω αρκετά
Τα ακόλουθα συμβαίνουν σε μένα:
gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -freestanding -lgcc
/ usr / bin / ld: kernel.o: μετεγκατάσταση R_X86_64_32 ενάντια στο σύμβολο "stack" δεν μπορεί να χρησιμοποιηθεί κατά τη δημιουργία ενός αντικειμένου PIE. μεταγλώττιση με -fPIE
/ usr / bin / ld: απέτυχε ο τελικός σύνδεσμος: μη αντιπροσωπεύσιμη ενότητα στην έξοδο
collect2: error: ld επέστρεψε 1 κατάσταση εξόδου