Hallo liebe Leute, hoffe alle sind gesund! Ich wende mich mit einer Frage bezüglich x86 Prozessoren an euch: In den letzten Wochen habe ich angefangen (zum Spaß) einen Kernel in C zu schreiben der startet und einfach Guess a number spielt (also Tastatur und Monitor laufen). Nun würde ich gerne zum experimentieren ein simples Filesystem für eine x86 Maschine schreiben. Soweit nichts neues, in C 8-Bit habe ich so etwas schon vor langem einmal gemacht. Allerdings haben nun x86 Prozessoren keinen eigenen Speicher (bzw. nicht viel) sondern sprechen eine Festplatte an. Konkrete Frage: wie Genaus kann ich eine SATA-Festplatte simpel ansprechen? Wie erreiche ich dass ich auf die einzelnen Speicher-Seiten der Platte zugreifen kann und darin "blättern" kann? Das ganze ohne virtual Memory sondern einfach physische Adresse :) Das Programm läuft auf einem ACER bzw ich bin auch über Codebeispiele für ARM zB Raspberry sehr dankbar wenn jemand so nett wäre hier eines zu posten? Alles Liebe & bleibt gesund, Andreas
Andreas schrieb: > Allerdings haben nun x86 > Prozessoren keinen eigenen Speicher (bzw. nicht viel) sondern sprechen > eine Festplatte an. Hä? Auch wenn der RAM nicht auf der CPU sitzt haben die Dinger in der Regel auf der Platine wo sie drauf sitzen mehr als genug davon. > Konkrete Frage: > wie Genaus kann ich eine SATA-Festplatte simpel ansprechen? > Wie erreiche ich dass ich auf die einzelnen Speicher-Seiten der Platte > zugreifen kann und darin "blättern" kann? Simpel ist hier garnichts, die CPU kann überhaupt nicht direkt auf eine Festplatte zugreifen. Dafür sind spezielle Controller zuständig. Der SATA-Kontroller ist in der Regel einen eigenständigen Chip (ggf. im Chipsatz der zur CPU gehört integriert, aber nicht in der CPU) der auch entsprechend mit eigenen Steuerbefehlen angesprochen werden will. Der übernimmt dann die Kommunikation mit der Festplatte und wenn du alles richtig gemacht hast landet irgendwann dann auch mal die Info die du haben willst via DMA im RAM. Wenn die Daten mal im RAM sind kannst du die dann mit der CPU weiter verarbeiten... Als Beispiel mal die Kap.14 - 16 reinziehen: https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/c600-series-chipset-datasheet.pdf (Du hast ja leider nicht angegeben welchen Chipsatz dein Rechner benutzt). Normale Programmierer nutzen für sowas normalerweise die Funktionen die das Betriebssystem mit seinen Hardwaretreibern dafür bereitstellt und versuchen das nicht selbst zu Fuß zu bauen. Wenn du hier Beispiele benötigst wirst du dir wohl größere Teile des Quellcodes von Linux und den zugehörigen Treibern reinziehen müssen. Viel Spass:-)
Schon alles gemacht vor vielen vielen Jahren. Deine Aussage ist ein wenig schwammig - x86 ist ein großes Feld. Real Mode? Protected Mode? Long Mode? Das hat einen enormen Einfluss darauf, ob bzw. wie du über das BIOS an die Daten kommst. Für die letzten beiden solltest du dich ausführlich einlesen, so ein x86er ist ein bisschen komplexer als Mikrocontroller. QEmu kennst du? Eigentlich unverzichtbar zur Entwicklung von solchen Sachen. Anders als z.B. VMWare oder VirtualBox kann QEmu ein System sehr realistisch simulieren, Geschwindigkeit ist ja egal. An den Schreiber über mir: Ja es gibt ein BIOS, das mit Hilfe der Firmware im Controller generische Funktionen bereitstellt um auf alles mögliche zuzugreifen. Teilweise sind die Funktionen Jahrzehnte alt (Graphik), teilweise gibt es keine, aber Storage ist vergleichsweise gut zugreifbar. Anders könnte dein Bootloader (egal ob win oder linux) nicht den Kernel von der Platte laden. UEFI klammere ich hier mal aus, das ist schon wieder eine ganz andere Geschichte.
Der Wikipedia-Link oben listet doch schon die nötigen BIOS-Calls auf. Es ist nicht so, dass so ein (ähnliches) Projekt nicht schon viele andere gemacht hätten, hier ein paar Links: https://github.com/ghaiklor/ghaiklor-os-gcc https://github.com/cirosantilli/x86-bare-metal-examples http://mikeos.sourceforge.net/write-your-own-os.html https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf https://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part https://www.alanfoster.me/posts/writing-a-bootloader/ Etliches ist in Assembler, da C für Unbedarfte einige Fallstricke mit sich bringt und man in Assembler auch besser sieht, was genau geschieht.
Ich werfe mal noch http://www.lowlevel.eu (deutsch) und https://wiki.osdev.org (englisch) in den Raum.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.