Prezentul - salut lume - pe asamblare, asamblare, articole, programare - programare c,

Cum începe învățarea unui nou limbaj de programare (sau a mediului)? Deoarece scriem un program simplu care afișează un salut scurt precum "Hello World!". De exemplu, pentru C acest lucru ar arata cam asa:

Este orientativ, dar complet neinteresant. Programul, desigur, funcționează, salutul său scrie; dar acest lucru necesită un întreg sistem de operare! Și dacă aș vrea să scriu un program pentru care nu este nevoie de nimic? Introducem o dischetă în computer, vom porni din ea și. "Hello World"! Puteți chiar să strigați acest salut din modul protejat ...
Nu mai repede decât să fii făcut. De unde să încep. Pentru a câștiga cunoștințe, bineînțeles. Pentru aceasta, este foarte ușor să obțineți codul sursă Linux și Thix. Primul sistem este bine cunoscut tuturor, al doilea este mai puțin cunoscut, dar nu mai puțin util.

Ai înțeles? Acum să o facem. Este clar că primul pas este să scriem un sector de boot pentru sistemele mini-de operare (și acesta va fi sistemul de mini-operare!). Deoarece procesorul este încărcat în modul pe 16 biți, asamblorul și link-ul din pachetul bin86 sunt folosite pentru a crea sectorul de boot. Desigur, puteți căuta altceva, dar ambele exemple îl folosesc; și vom urmări și pe urmele profesorilor. Sintaxa acestui asamblator este un pic ciudat, combinând caracteristici, caracteristice atât pentru Intel, cât și pentru ATT, dar după câteva săptămâni de chin puteți să vă obișnuiți.

Segment de boot (boot.S)

În mod conștient nu voi oferi lista completă de programe. Astfel, ideile de bază devin mai clare și veți fi mult mai plăcut dacă vă scrieți singur totul.

Mai întâi, să definim constantele de bază.
START_HEAD = 0 - Capul unității pe care o vom folosi.
START_TRACK = 0 - Pista de unde să începeți să citiți.
START_SECTOR = 2 - Sectorul din care vom citi nucleul nostru.
SYSSIZE = 10 - mărimea kernel-ului în sectoare (fiecare sector conține 512 octeți)
FLOPPY_ID = 0 - Identificatorul unității. 0 pentru prima, 1 pentru a doua
HEADS = 2 - Numărul de capete de antrenare.
SECTORS = 18 - Numărul de piese de pe dischetă. Pentru formatul de 1,44 MB, acest număr este de 18.

Primul lucru pe care îl facem este să ne mutăm într-un loc mai acceptabil.

Acum trebuie să configurați segmentele pentru date (es, ds) și pentru stiva corectă. Este, desigur, neplăcut că totul trebuie făcut manual, dar ce puteți face? În plus față de noi și BIOS, nimeni nu este în memoria calculatorului.

Și mesajul este așa

În acest moment, un modest "Boot date" apare pe afișajul computerului. Acest lucru nu este, de fapt, mai rău decât "Hello World", dar hai să luăm ceva mai mult. Să intrăm în modul protejat și să scoatem deja acest mesaj "Hello" de la programul scris în C.

Kernel-ul este de 32 de biți. Acesta va fi amplasat separat de sectorul de bagaje și colectat deja cu ajutorul gcc și gaz. Sintaxa de asamblare a gazelor corespunde cerințelor ATT, deci totul va fi mai simplu aici. Dar mai întâi trebuie să citim kernelul. Din nou, utilizați funcția finită 0x2 întrerupere 0x13.

Funcția însăși a citirii este extrem de simplă: umplerea lungă și plină de tact a parametrilor, iar apoi, într-o singură lovitură, citiți kernelul. Dificultățile vor începe atunci când kernelul încetează să se potrivească în 17 sectoare (adică 8,5 KB); dar este încă în viitor, dar acum este suficient de o lectură atât de rapidă

În acest moment, se afișează "Booting data.done" și lampa unității de dischetă este dezactivată. Toți au murit și sunt pregătiți pentru un număr de deces - un salt în modul protejat.

Vom afișa un mesaj de avertizare - că intrăm în modul protejat. Lăsați-o pe toată lumea să știe ce suntem importanți.

În timp ce suntem încă în viață cu BIOS, amintiți-vă poziția cursorului și salvați-l într-un loc cunoscut (0000: 0x8000). Kernelul va colecta mai târziu toate datele și îl va folosi pentru a afișa mesajul câștigător.

Acum atenție, interzicem întreruperi (nu este nimic de distras în timpul unei astfel de activități) și încărcăm tabelul descriptorilor

Avem un tabel descriptor care constă din trei descriptori: un zero (întotdeauna prezent), un segment de cod și un segment de date.

Trecerea la modul protejat poate avea loc în cel puțin două moduri, dar ambele sisteme de operare pe care le-am selectat pentru exemplu (Linux și Thix) utilizează comanda lmsw pentru compatibilitatea cu procesorul 286. Vom acționa în același mod

Asta e tot munca sectorului de bagaje - nu putin, dar nu prea mult. Acum, cu el, spunem la revedere și ne îndreptăm spre miez.

La sfârșitul fișierului de asamblare, este util să adăugați următoarea instrucțiune.

Ca rezultat, codul compilat va ocupa exact 512 octeți, ceea ce este foarte convenabil pentru pregătirea imaginii discului de boot.

Primul oftat al kernelului (cap.S)

Kernelul, din păcate, va începe din nou cu codul de asamblare. Dar acum va fi destul de puțin.

De fapt, setăm valorile corecte pentru segmente pentru date (ES, DS, FS, GS). Prin scrierea valorii descriptorului de date corespunzător.

Apelați funcția mult așteptată deja scrisă în C.

Și nu mai avem nimic de făcut aici.

Să vorbim în limbaj de nivel înalt (start.c)

Acum, pentru a nu fi confundați cu funcțiile construite în glibc, vom elimina definiția lor

În sfârșit, începeți să scrieți codul într-un limbaj de nivel înalt. deși cu inserții mici de asamblare.

Așa că am adus acest ecran "Hello World" pe ecran. Cât de mult a fost făcut și doar două rânduri pe ecran

Și ce e rău. Un nou sistem de operare a strigat. Lumea a acceptat-o ​​cu bucurie. Cine știe, poate acesta este noul Linux.

Pregătirea imaginii de boot (floppy.img)

Acum pregătiți imaginea de boot a sistemki.Dlya noastră începe să adune sectorul de boot.

Am tăiat antetul pe 32 de biți și obținem un cod binar curat.

Și vom conecta împreună sectorul de boot și kernel-ul

Imaginea este gata. Am scris pe o dischetă (pregătește câteva pentru experimente, am terminat trei bucăți), reporniți computerul și bucurați-vă ...

E-mea, ce am facut ...: - []

E minunat, nu-i așa? E bine să te simți ca viitorul Torvalds sau altcineva. Prima traseu este călcată, puteți merge în siguranță - finalizați scrierea și rescrierea sistemului ...

Procedura descrisă până acum este aceeași pentru o varietate de sisteme de operare, fie UNIX, fie Windows. Ce scrie tu. nimeni nu știe. La urma urmei, va fi sistemul dvs. ...