Forum: Mikrocontroller und Digitale Elektronik x86 Memory management


von Andreas (Gast)


Lesenswert?

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

von John Doe (Gast)


Lesenswert?


von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

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:-)

von Johannes (Gast)


Lesenswert?

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.

von Planloser (Gast)


Lesenswert?

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.

von S. R. (svenska)


Lesenswert?

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
Noch kein Account? Hier anmelden.