Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • știri
  • Crearea nucleului sistemului de operare. Sistem de operare asemănător UNIX: scrierea nucleului în C

Crearea nucleului sistemului de operare. Sistem de operare asemănător UNIX: scrierea nucleului în C

Semantic Core este un nume înspăimântător cu care SEO-urile au venit pentru a se referi la un lucru destul de simplu. Trebuie doar să selectăm interogările cheie pentru care ne vom promova site-ul.

Și în acest articol vă voi arăta cum să compuneți corect nucleul semantic, astfel încât site-ul dvs. să ajungă rapid în TOP și să nu stagneze luni de zile. Are și propriile sale „secrete”.

Și înainte de a trece la compilarea SY, să aruncăm o privire la ce este acesta și la ce ar trebui să ajungem în cele din urmă.

Care este nucleul semantic în cuvinte simple

Destul de ciudat, dar nucleul semantic este un fișier excel obișnuit, în care este prezentată lista de cuvinte cheie pentru care tu (sau redactorul tău) vei scrie articole pentru site.

De exemplu, așa arată nucleul meu semantic:

Am marcat cu verde acele cuvinte cheie pentru care am scris deja articole. Galben - cele pentru care urmeaza sa scriu articole in viitorul apropiat. Și celule incolore - asta înseamnă că la aceste solicitări se va ajunge puțin mai târziu.

Pentru fiecare cerere de cheie, am determinat frecvența, concurența și am venit cu un titlu „atrăgător”. Ar trebui să obțineți aproximativ același fișier. Acum SN-ul meu este format din 150 de cuvinte cheie. Asta înseamnă că mi se asigură „material” cu cel puțin 5 luni în avans (chiar dacă scriu un articol pe zi).

Mai jos vom vorbi despre ce să vă pregătiți dacă vă decideți brusc să comandați colecția nucleului semantic de la specialiști. Aici voi spune pe scurt - vi se va da aceeași listă, dar numai pentru mii de „chei”. Totuși, în SA, nu cantitatea este importantă, ci calitatea. Și ne vom concentra asupra acestui lucru.

De ce ai nevoie de un nucleu semantic?

Și de fapt, de ce avem nevoie de acest chin? La urma urmei, poți să scrii articole de calitate și să atragi public prin asta, nu? Da, poți scrie, dar nu vei putea atrage.

Principala greșeală pe care o fac 90% dintre bloggeri este doar să scrie articole de înaltă calitate. Nu glumesc, au conținut cu adevărat interesant și util. Dar motoarele de căutare nu știu despre asta. Nu sunt psihici, sunt doar roboți. În consecință, ei nu vă pun articolul în TOP.

Există un alt punct subtil aici cu titlul. De exemplu, aveți un articol de foarte înaltă calitate pe tema „Cum să faceți afaceri într-o „carte mordo”. Acolo descrii totul despre Facebook în detaliu și profesional. Inclusiv modul de promovare a comunităților de acolo. Articolul dvs. este articolul de cea mai înaltă calitate, util și interesant pe acest subiect de pe Internet. Nimeni nu zăcea lângă tine. Dar tot nu te va ajuta.

De ce articolele de înaltă calitate zboară din TOP

Imaginează-ți că site-ul tău nu este vizitat de un robot, ci de un inspector (evaluator) live de la Yandex. Și-a dat seama că ai cel mai tare articol. Și rukami te-a pus pe primul loc în rezultatele căutării pentru solicitarea „Promovarea comunității pe Facebook”.

Știi ce urmează? Vei zbura de acolo foarte curând. Pentru că pe articolul tău, chiar și în primul rând, nimeni nu va da clic. Oamenii introduc solicitarea „Promovare comunitară pe Facebook”, iar titlul tău este „Cum să faci afaceri într-un „mordobook” corect. Original, fresh, amuzant, dar... nu la cerere. Oamenii vor să vadă exact ceea ce căutau, nu creatia ta.

În consecință, articolul tău va fi inactiv pentru a ocupa un loc în TOP-ul SERP. Iar un evaluator în viață, un admirator înfocat al creativității tale, poate implora autoritățile atât cât vor să te lase măcar în TOP-10. Dar nu va ajuta. Toate primele locuri vor fi ocupate de articole, goale, ca cojile semințelor, care au fost copiate unele de altele de școlarii de ieri.

Dar aceste articole vor avea titlul corect „relevant” - „Promovarea comunității Facebook de la zero” ( pas cu pas, in 5 pasi, de la A la Z, gratuit etc.) Ofensator? Încă ar fi. Ei bine, lupta împotriva nedreptății. Să alcătuim un nucleu semantic competent, astfel încât articolele tale să ocupe primele locuri pe care le merită.

Un alt motiv pentru a începe să inventezi SJ chiar acum

Mai este un lucru la care, din anumite motive, oamenii se gândesc puțin. Trebuie să scrii articole des - cel puțin în fiecare săptămână, și de preferință de 2-3 ori pe săptămână pentru a câștiga mai mult trafic și mai rapid.

Toată lumea știe asta, dar aproape nimeni nu o știe. Și totul pentru că au „stagnare creativă”, „nu se pot forța în niciun fel”, „doar lene”. Dar, de fapt, întreaga problemă se află tocmai în absența unui nucleu semantic specific.

Am introdus una dintre cheile mele de bază - „smm” în câmpul de căutare, iar Yandex mi-a dat imediat o duzină de sfaturi, ce altceva ar putea fi de interes pentru oamenii care sunt interesați de „smm”. Trebuie doar să copiez aceste chei într-un caiet. Apoi le voi verifica pe fiecare în același mod și voi aduna indicii și pentru ele.

După prima etapă de colectare a SN, ar trebui să aveți un document text în care vor exista 10-30 de chei de bază largi, cu care vom lucra în continuare.

Pasul # 2 - Analizarea cheilor de bază în SlovoEB

Desigur, dacă scrieți un articol pentru cererea „webinar” sau „smm”, atunci nu se va întâmpla un miracol. Nu vei putea niciodată să ajungi în TOP pentru o solicitare atât de largă. Trebuie să împărțim cheia de bază în multe interogări mici pe acest subiect. Și vom face acest lucru cu ajutorul unui program special.

Folosesc KeyCollector, dar este plătit. Puteți utiliza un analog gratuit - programul SlovoEB. Îl puteți descărca de pe site-ul oficial.

Cel mai dificil lucru în lucrul cu acest program este să îl configurați corect. Vă arăt cum să configurați și să utilizați corect Slovoeb. Dar în acel articol, mă concentrez pe selecția cheilor pentru Yandex Direct.

Și aici, să aruncăm o privire pas cu pas la caracteristicile utilizării acestui program pentru compilarea unui nucleu semantic pentru SEO.

Mai întâi, creăm un nou proiect și îl denumim în funcție de cheia generală pe care doriți să o analizați.

De obicei, dau proiectului același nume cu cheia mea de bază, astfel încât să nu mă confund mai târziu. Și da, te voi avertiza de încă o greșeală. Nu încercați să analizați toate cheile de bază în același timp. Atunci îți va fi foarte dificil să filtrezi cuvintele cheie „goale” din boabele de aur. Să analizăm câte o cheie pe rând.

După crearea proiectului, efectuăm operația de bază. Adică, analizăm cheia prin Yandex Wordstat. Pentru a face acest lucru, faceți clic pe butonul „Vorstat” din interfața programului, introduceți cheia de bază și faceți clic pe „Începeți colectarea”.

De exemplu, să analizăm cheia de bază pentru blogul meu de „publicitate contextuală”.

După aceea, procesul va începe, iar după un timp programul ne va oferi un rezultat - până la 2000 de interogări cheie, care conțin „publicitate contextuală”.

De asemenea, lângă fiecare solicitare va exista o frecvență „murdară” - de câte ori această cheie (+ formele de cuvinte și cozile sale) a fost căutată pe lună prin Yandex. Dar nu vă sfătuiesc să trageți nicio concluzie din aceste cifre.

Pasul # 3 - Colectarea frecvențelor cheie precise

Frecvența murdară nu ne va arăta nimic. Dacă te concentrezi asupra ei, atunci nu fi surprins mai târziu când cheia ta pentru 1000 de solicitări nu aduce niciun clic pe lună.

Trebuie să scoatem la iveală frecvența pură. Și pentru a face acest lucru, selectăm mai întâi toate cheile găsite cu bifă, apoi facem clic pe butonul „Yandex Direct” și începem din nou procesul. Acum Slovoeb va căuta frecvența exactă a solicitării pe lună pentru fiecare cheie.

Acum avem o imagine obiectivă - de câte ori a fost introdusă o solicitare de utilizatorii de internet în ultima lună. Acum propun să grupăm toate interogările cheie după frecvență, astfel încât să fie mai convenabil să lucrezi cu ele.

Pentru a face acest lucru, faceți clic pe pictograma „filtru” din coloana „Frecvență”! ", Și specificați - pentru a filtra cheile cu valoarea" mai mică sau egală cu 10 ".

Acum programul vă va afișa numai acele interogări, a căror frecvență este mai mică sau egală cu valoarea „10”. Puteți șterge aceste interogări sau le puteți copia pentru viitor într-un alt grup de interogări cheie. Mai puțin de 10 este foarte puțin. Scrierea de articole pentru aceste interogări este o pierdere de timp.

Acum trebuie să alegem acele cuvinte cheie care ne vor aduce trafic mai mult sau mai puțin bun. Și pentru aceasta trebuie să aflăm încă un parametru - nivelul de concurență al cererii.

Pasul # 4 - Verificarea interogărilor competitive

Toate „cheile” din această lume sunt împărțite în 3 tipuri: frecvență înaltă (HF), frecvență medie (MF), frecvență joasă (LF). Ele pot fi, de asemenea, foarte competitive (VC), competitive medii (SK) și competitive scăzute (NK).

De regulă, cererile HF sunt primite simultan de VC. Adică, dacă o solicitare este căutată des pe Internet, atunci există o mulțime de site-uri care doresc să o promoveze. Dar nu este întotdeauna cazul, există excepții fericite.

Arta alcătuirii unui nucleu semantic constă tocmai în găsirea unor astfel de interogări care au o frecvență mare, iar nivelul lor de concurență este scăzut. Este foarte dificil să determinați manual nivelul concurenței.

Vă puteți concentra pe indicatori precum numărul de pagini principale din TOP-10, lungimea și calitatea textelor. nivelul de încredere și particulele site-urilor din TOPul emisiunii la cerere. Toate acestea vă vor oferi o idee despre cât de grea este lupta pentru poziții pentru această interogare specială.

Dar iti recomand sa profiti serviciul Mutagen... Ține cont de toți parametrii pe care i-am menționat mai sus, plus încă o duzină de care probabil nici tu, nici eu nu am auzit. După analiză, serviciul oferă valoarea exactă - care este nivelul de concurență pentru această solicitare.

Aici am verificat interogarea „Configurarea publicității contextuale în google adwords”. Mutagenul ne-a arătat că această cheie are o competitivitate de „mai mult de 25” - aceasta este valoarea maximă pe care o arată. Și această interogare are doar 11 vizualizări pe lună. Deci sigur nu ne convine.

Putem copia toate cheile pe care le-am ridicat în Slovoeb și facem un control în bloc în Mutagen. După aceea, va trebui doar să ne uităm la listă și să luăm acele cereri care au multe solicitări și un nivel scăzut de concurență.

Mutagen este un serviciu plătit. Dar poți face 10 verificări pe zi gratuit. În plus, costul verificării este foarte mic. În tot timpul în care am lucrat cu el, încă nu am cheltuit nici măcar 300 de ruble.

Apropo, în detrimentul nivelului concurenței. Dacă aveți un site tânăr, atunci este mai bine să alegeți interogări cu un nivel de concurență de 3-5. Iar dacă promovezi de mai bine de un an, atunci poți lua 10-15.

Apropo, în detrimentul frecvenței solicitărilor. Acum trebuie să facem ultimul pas, care vă va permite să atrageți mult trafic chiar și pentru solicitările de joasă frecvență.

Pasul # 5 - Colectarea cozilor pentru cheile selectate

După cum a fost dovedit și verificat de multe ori, site-ul dvs. va primi cea mai mare parte a traficului nu de la cheile principale, ci de la așa-numitele „cozi”. Acesta este momentul în care o persoană introduce cuvinte cheie ciudate în caseta de căutare, cu o frecvență de 1-2 pe lună, dar există o mulțime de astfel de solicitări.

Pentru a vedea „coada” - mergeți la Yandex și introduceți cuvântul cheie ales în bara de căutare. Iată ce vei vedea aproximativ.

Acum trebuie doar să scrieți aceste cuvinte suplimentare într-un document separat și să le folosiți în articolul dvs. Mai mult, nu trebuie să le puneți întotdeauna lângă cheia principală. În caz contrar, motoarele de căutare vor vedea „supra-optimizare” și articolele tale vor cădea în rezultatele căutării.

Folosiți-le în diferite locuri din articolul dvs. și apoi veți primi trafic suplimentar și de la ei. De asemenea, aș recomanda să încercați să utilizați cât mai multe forme de cuvinte și sinonime pentru interogarea principală a cuvintelor cheie.

De exemplu, avem o solicitare - „Configurarea publicității contextuale”. Iată cum să o reformulăm:

  • Personalizare = personalizați, faceți, construiți, rulați, rulați, activați, găzduiți...
  • Publicitate contextuală = context, direct, teaser, YAN, adwords, cms. direct, AdWords...

Nu știi niciodată exact cum vor căuta oamenii informații. Adaugă toate aceste cuvinte suplimentare la nucleul tău semantic și folosește-le atunci când scrii texte.

Deci, colectăm o listă de 100 - 150 de cuvinte cheie. Dacă este prima dată când compilați nucleul semantic, vă poate dura câteva săptămâni.

Sau poate ei bine, îi rupe ochii? Poate că există posibilitatea de a delega pregătirea CL unor specialiști care o vor face mai bine și mai repede? Da, există astfel de specialiști, dar nu întotdeauna trebuie să apelezi la serviciile lor.

Ar trebui să comand un CJ de la specialiști?

În general, specialiștii în compilarea nucleului semantic vă vor parcurge doar pașii 1 - 3 din diagrama noastră. Uneori, pentru o taxă suplimentară mare, se vor face și pașii 4-5 - (strângerea cozilor și verificarea competitivității cererilor).

După aceea, vă vor oferi câteva mii de cuvinte cheie cu care va trebui să lucrați în viitor.

Și întrebarea aici este: vei scrie singur articole sau vei angaja copywriteri pentru asta. Dacă vrei să te concentrezi pe calitate, nu pe cantitate, atunci trebuie să scrii singur. Dar atunci nu va fi suficient pentru tine doar să obții o listă de chei. Va trebui să alegeți subiecte pe care le cunoașteți suficient de bine pentru a scrie un articol de calitate.

Și aici apare întrebarea - de ce, atunci, avem de fapt nevoie de specialiști în SY? De acord, analizarea cheii de bază și colectarea frecvențelor exacte (pașii # 1-3) nu este deloc dificilă. Îți va lua literalmente o jumătate de oră.

Cel mai dificil este să selectezi cereri RF, care au concurență scăzută. Și acum, după cum se dovedește, aveți nevoie de HF-NK, pe care puteți scrie un articol bun. Acesta este exact ceea ce îți va lua 99% din timpul tău lucrând la nucleul semantic. Și niciun specialist nu va face asta pentru tine. Ei bine, merită să cheltuiți bani pentru a comanda astfel de servicii?

Când serviciile unui specialist în CN sunt utile

Este o altă chestiune dacă inițial plănuiești să atragi copywriteri. Atunci nu trebuie să înțelegeți subiectul cererii. Nici copywriterii tăi nu o vor înțelege. Pur și simplu vor lua câteva articole pe acest subiect și vor compila propriul text din ele.

Astfel de articole vor fi goale, mizerabile, aproape inutile. Dar vor fi mulți dintre ei. Pe cont propriu, puteți scrie maximum 2-3 articole de înaltă calitate pe săptămână. Iar armata de copywriteri îți va oferi 2-3 texte de rahat pe zi. În același timp, acestea vor fi optimizate pentru solicitări, ceea ce înseamnă că vor atrage un fel de trafic.

În acest caz, da, nu ezitați să angajați un specialist în YA. Lăsați-i să compună și TK pentru copywriteri în același timp. Dar înțelegi, va costa și niște bani.

rezumat

Să trecem din nou peste punctele principale din articol pentru a consolida informațiile.

  • Nucleul semantic este pur și simplu o listă de cuvinte cheie pentru care vei scrie articole pe site pentru promovare.
  • Este necesar să optimizați textele pentru întrebările cheie exacte, altfel nici articolele dvs. de cea mai bună calitate nu vor ajunge niciodată în TOP.
  • SN este ca un plan de conținut pentru rețelele sociale. Te ajută să nu cazi într-o „criză creativă” și să știi mereu exact despre ce vei scrie mâine, poimâine și peste o lună.
  • Pentru a compila nucleul semantic, este convenabil să utilizați programul gratuit Slovoeb, doar aveți nevoie de el.
  • Există cinci pași pentru compilarea unui CL: 1 - Selectarea tastelor de bază; 2 - Parsarea tastelor de bază; 3 - Colectarea frecventei exacte a cererilor; 4 - Verificarea concurenței cheilor; 5 - Culegere de „cozi”.
  • Dacă vrei să scrii singur articole, atunci este mai bine să faci singur nucleul semantic, pentru tine. Compilatorii CL nu vă vor putea ajuta aici.
  • Dacă doriți să lucrați pentru cantitate și să folosiți copywriteri pentru a scrie articole, atunci este complet posibil să implicați delegarea și compilarea nucleului semantic. Dacă ar fi destui bani pentru toate.

Sper că acest tutorial v-a fost de ajutor. Salvați-l în favorite pentru a nu-l pierde și împărtășiți-l cu prietenii. Nu uita să-mi descarci cartea. Acolo iti arat calea cea mai rapida de la zero la primul milion de pe internet (extras din experienta personala de 10 ani =)

Ne vedem mai tarziu!

Dmitri Novosyolov al tău

Să scriem un nucleu simplu care poate fi încărcat cu bootloader-ul x86 GRUB. Acest nucleu va afișa un mesaj pe ecran și va aștepta.

Cum pornește un sistem x86?

Înainte de a începe să scriem nucleul, să înțelegem cum pornește sistemul și cum transferă controlul către kernel.

În majoritatea registrelor procesorului, la pornire, anumite valori sunt deja găsite. Registrul care indică adresa instrucțiunilor (Instruction Pointer, EIP) stochează adresa de memorie la care se află instrucțiunea executată de procesor. EIP este implicit 0xFFFFFFF0... Astfel, procesoarele x86 la nivel hardware încep să funcționeze la 0xFFFFFFF0. Acesta este de fapt ultimii 16 octeți ai spațiului de adrese pe 32 de biți. Această adresă se numește vector de resetare.

Acum, cardul de memorie chipset asigură că 0xFFFFFFF0 aparține unei anumite părți a BIOS-ului, nu RAM. În acest moment, BIOS-ul se copiază în RAM pentru un acces mai rapid. Adresa 0xFFFFFFF0 va conține doar o instrucțiune pentru a trece la o adresă din memorie unde este stocată o copie a BIOS-ului.

Acesta este modul în care codul BIOS începe să se execute. În primul rând, BIOS-ul caută un dispozitiv de pe care să pornească, într-o ordine prestabilită. În căutarea unui număr magic care determină dacă dispozitivul este bootabil (al 511-lea și al 512-lea octeți ai primului sector trebuie să fie egal cu 0xAA55).

Când BIOS-ul găsește un dispozitiv de pornire, acesta copiază conținutul primului sector al dispozitivului în RAM, începând de la adresa fizică 0x7c00; apoi navighează la adresa și execută codul încărcat. Acest cod este numit bootloader.

Bootloader-ul încarcă nucleul la o adresă fizică 0x100000... Această adresă este folosită ca adresă de pornire în toate nucleele mari de pe sistemele x86.

Toate procesoarele x86 pornesc într-un mod simplu de 16 biți numit regim real... Bootloaderul GRUB comută modul la 32 de biți mod protejat prin setarea bitului inferior al registrului CR0 la 1 ... Astfel, nucleul pornește în modul protejat pe 32 de biți.

Rețineți că, în cazul nucleului Linux, GRUB vede jurnalele de pornire Linux și încarcă nucleul în modul real. Nucleul trece automat în modul protejat.

Ce ne trebuie?

  • computer x86;
  • Linux;
  • ld (GNU Linker);

Setarea punctului de intrare în asamblator

Oricât de mult nu aș vrea să mă limitez la un C, trebuie să scriu ceva în assembler. Vom scrie pe el un mic fișier care va servi drept punct de plecare pentru nucleul nostru. Tot ce va face este să apeleze o funcție externă scrisă în C și să oprească fluxul programului.

Cum ne putem asigura că acest cod este exact punctul de plecare?

Vom folosi un script de linker care leagă fișierele obiect pentru a crea executabilul final. În acest script, vom indica în mod explicit că vrem să încărcăm date la 0x100000.

Iată codul de asamblare:

;; kernel.asm biți 32; directivă nasm - secțiune de 32 de biți .text global start extern kmain; kmain este definit în fișierul c start: cli; blocul întrerupe mov esp, stack_space; setează indicatorul stivei apel kmain hlt; opri secțiunea CPU .bss resb 8192; 8KB pentru stiva stack_space:

Prima instrucțiune, biții 32, nu este o instrucțiune de asamblare x86. Aceasta este o directivă adresată asamblatorului NASM pentru a genera cod pentru un procesor care rulează în modul pe 32 de biți. În cazul nostru, acest lucru nu este necesar, dar în general util.

Secțiunea cu codul începe pe a doua linie.

global este o altă directivă NASM care face ca simbolurile codului sursă să fie globale. Astfel, linkerul știe unde se află simbolul de început - punctul nostru de intrare.

kmain este o funcție care va fi definită în fișierul kernel.c. extern înseamnă că funcția este declarată în altă parte.

Apoi vine funcția de pornire, care apelează funcția kmain și oprește procesorul cu instrucțiunea hlt. De aceea dezactivăm întreruperile în avans cu instrucțiunea cli.

În mod ideal, dorim să alocăm o parte de memorie și să îndreptăm spre ea cu un indicator de stivă (în special). Cu toate acestea, se pare că GRUB a făcut deja acest lucru pentru noi. Cu toate acestea, veți aloca în continuare ceva spațiu în secțiunea BSS și veți muta indicatorul stivei la începutul său. Folosim instrucțiunea resb, care rezervă numărul specificat de octeți. Imediat înainte de a apela kmain, indicatorul de stivă (esp) este setat la locația dorită cu instrucțiunea mov.

Miez în C

În kernel.asm, am făcut un apel la funcția kmain (). Astfel, codul nostru „cish” ar trebui să înceapă execuția cu kmain ():

/ * * kernel.c * / void kmain (void) (const char * str = "primul meu nucleu"; char * vidptr = (char *) 0xb8000; // video mem începe aici. unsigned int i = 0; unsigned int j = 0; / * această buclă șterge ecranul * există 25 de linii fiecare din 80 de coloane; fiecare element are 2 octeți * / while (j< 80 * 25 * 2) { /* blank character */ vidptr[j] = " "; /* attribute-byte - light grey on black screen */ vidptr = 0x07; j = j + 2; } j = 0; /* this loop writes the string to video memory */ while(str[j] != "\0") { /* the character"s ascii */ vidptr[i] = str[j]; /* attribute-byte: give character black bg and light grey fg */ vidptr = 0x07; ++j; i = i + 2; } return; }

Tot ce va face nucleul nostru este să șterge ecranul și să imprime șirul „primul meu nucleu”.

Mai întâi, creăm un pointer vidptr care indică adresa 0xb8000... „Memorie video” începe de la această adresă în modul protejat. Pentru afișarea textului pe ecran, rezervăm 25 de rânduri de 80 de caractere ASCII, începând cu 0xb8000.

Fiecare caracter este afișat nu cu cei 8 biți obișnuiți, ci cu 16. Primul octet conține caracterul în sine, iar al doilea - octetul-atribut. Descrie formatarea unui simbol, cum ar fi culoarea acestuia.

Pentru a afișa un caracter s verde pe un fundal negru, scriem acest caracter în primul octet și valoarea 0x02 în al doilea. 0 înseamnă fundal negru, 2 înseamnă culoarea textului verde.

Iată diagrama de culori:

0 - Negru, 1 - Albastru, 2 - Verde, 3 - Cyan, 4 - Roșu, 5 - Magenta, 6 - Maro, 7 - Gri deschis, 8 - Gri închis, 9 - Albastru deschis, 10 / a - Verde deschis, 11 / b - Cyan deschis, 12 / c - Roșu deschis, 13 / d - Magenta deschis, 14 / e - Maro deschis, 15 / f - Alb.

În nucleul nostru, vom folosi text gri deschis pe un fundal negru, astfel încât atributul nostru de octet va fi 0x07.

În prima buclă, programul scoate un caracter gol pe întreaga zonă de 80x25. Acest lucru va șterge ecranul. În ciclul următor, în „memoria video” sunt scrise caractere din șirul terminat cu nul „primul meu nucleu” cu un octet de atribut egal cu 0x07. Acest lucru va imprima șirul pe ecran.

Piesa de conectare

Trebuie să compilăm kernel.asm într-un fișier obiect folosind NASM; apoi utilizați GCC pentru a compila kernel.c într-un alt fișier obiect. Apoi, acestea trebuie atașate la nucleul executabil bootabil.

Pentru a face acest lucru, vom folosi un script de legătură care este transmis la ld ca argument.

/ * * link.ld * / OUTPUT_FORMAT (elf32-i386) INTRARE (start) SECȚIUNI (. = 0x100000; .text: (* (. text)) .data: (* (. data)) .bss: (* ( .bss)))

În primul rând, vom stabili format de iesire ca format executabil și conectabil pe 32 de biți (ELF). ELF este formatul standard de fișier binar pentru sistemele x86 Unix. INTRARE ia un argument care specifică numele simbolului care este punctul de intrare. SECȚIUNI este partea cea mai importantă. Acesta definește marcajul fișierului nostru executabil. Definim cum trebuie conectate diferitele secțiuni și unde să le plasăm.

În paranteze după SECȚIUNI, un punct (.) Reprezintă contorul de poziție, care este 0x0 în mod implicit. Poate fi schimbat, ceea ce facem noi.

Ne uităm la rândul următor: .text: (* (. Text)). Un asterisc (*) este un caracter special care se potrivește cu orice nume de fișier. Expresia * (. Text) înseamnă toate secțiunile .text din toate fișierele de intrare.

Astfel, linkerul combină toate secțiunile codului fișierului obiect într-o secțiune a fișierului executabil la adresa din contorul de poziții (0x100000). După aceea, valoarea contorului va fi egală cu 0x100000 + dimensiunea secțiunii rezultate.

În mod similar, totul se întâmplă cu alte secțiuni.

Grub și Multiboot

Toate fișierele sunt acum gata pentru a crea un nucleu. Dar mai rămâne un pas.

Există un standard pentru pornirea nucleelor ​​x86 folosind un bootloader numit Specificație multiboot... GRUB va porni nucleul nostru numai dacă îndeplinește aceste specificații.

După ele, nucleul ar trebui să conțină antetul în primii 8KB. În plus, acest antet trebuie să conțină 3 câmpuri, care sunt de 4 octeți:

  • magic câmp: conține un număr magic 0x1BADB002 pentru a identifica nucleul.
  • camp steaguri: nu avem nevoie, setați-l la zero.
  • camp suma de control: dacă îl adăugați cu cele două anterioare, ar trebui să obțineți zero.

Kernel.asm-ul nostru va deveni astfel:

;; kernel.asm; directivă nasm - 32 biți biți 32 secțiune .text; aliniere specificații multiboot 4 dd 0x1BADB002; magic dd 0x00; flags dd - (0x1BADB002 + 0x00); sumă de control. m + f + c ar trebui să fie zero pornire globală extern kmain; kmain este definit în fișierul c start: cli; blocul întrerupe mov esp, stack_space; setează pointerul stivei apelează kmain hlt; oprește secțiunea CPU .bss resb 8192; 8KB pentru stivă stack_space:

Construirea nucleului

Acum vom crea fișiere obiect din kernel.asm și kernel.c și le vom lega folosind scriptul nostru.

Nasm -f elf32 kernel.asm -o kasm.o

Această linie va rula asamblatorul pentru a genera fișierul obiect kasm.o în format ELF-32.

Gcc -m32 -c kernel.c -o kc.o

Opțiunea -c asigură că nu apare nicio legătură ascunsă după compilare.

Ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o

Aceasta va lansa linker-ul cu scriptul nostru și va crea un executabil numit nucleu.

Configurarea grub și pornirea nucleului

GRUB necesită ca numele nucleului să se potrivească cu modelul kernel- ... Deci redenumiți nucleul. Mi-am numit nucleul-701.

Acum pune-l în director / boot... Acest lucru va necesita drepturi de superutilizator.

În fișierul de configurare GRUB grub.cfg adăugați următoarele:

Titlu myKernel root (hd0,0) kernel / boot / kernel-701 ro

Nu uitați să eliminați directiva de meniu ascuns, dacă există.

Reporniți computerul și veți vedea și o listă de nuclee cu ale dvs. Selectează-l și vei vedea:

Un sistem de operare asemănător UNIX este interesant de analizat, precum și de scris propriul nucleu care va tipări un mesaj. Ei bine, scriem?

Sistem de operare asemănător UNIX și pornirea unei mașini x86

Ce este un sistem de operare asemănător UNIX? Este un sistem de operare influențat de UNIX. Dar înainte de a începe să scriem un nucleu pentru el, să vedem cum pornește mașina și transferă controlul către nucleu.

Majoritatea registrelor procesorului x86 au valori bine definite după pornire. Instruction Pointer Register (EIP) conține adresa de memorie pentru instrucțiunea executată de procesor. EIP este codificat la valoarea 0xFFFFFFF0. Astfel, procesorul are instrucțiuni clare la adresa fizică 0xFFFFFFF0, care este în esență ultimii 16 octeți ai spațiului de adrese de 32 de biți. Această adresă se numește vector de resetare.

Cardul de memorie chipset asigură acum că 0xFFFFFFF0 se mapează la o anumită parte a BIOS-ului și nu la RAM. Între timp, BIOS-ul se copiază pe RAM pentru un acces mai rapid. Aceasta se numește umbrire. Adresa 0xFFFFFFF0 va conține doar instrucțiunea de a merge la adresa de memorie unde s-a copiat BIOS-ul.

Astfel, codul BIOS începe să se execute. BIOS-ul caută mai întâi un dispozitiv de pornire în funcție de ordinea configurată a dispozitivului de pornire. Caută un anumit număr magic pentru a determina dacă dispozitivul este bootabil (octeții 511 și 512 ai primului sector sunt 0xAA55).

După ce BIOS-ul detectează dispozitivul de pornire, acesta copiază conținutul primului sector al dispozitivului în RAM, începând cu adresa fizică 0x7c00; apoi navighează la adresa și execută codul pe care tocmai l-ați încărcat. Acest cod se numește bootloader.

Bootloader-ul încarcă apoi nucleul la adresa fizică 0x100000. Adresa 0x100000 este folosită ca adresă de pornire pentru toate nucleele mari de pe mașinile x86.

Toate procesoarele x86 pornesc într-un mod simplificat de 16 biți numit modul adresă reală. Încărcătorul GRUB comută în modul protejat pe 32 de biți, setând bitul cel mai puțin semnificativ din CR0 la 1. Astfel, nucleul pornește în modul protejat pe 32 de biți.

Rețineți că, dacă este detectat un nucleu Linux, GRUB va primi jurnalul de pornire și va porni nucleul Linux în modul real. Iar nucleul Linux va trece la modul protejat.

De ce avem nevoie?

  • computer x86 (desigur)
  • asamblator NASM
  • ld (GNU Linker)
  • Sursă

Ei bine, ar fi frumos să aveți o idee despre cum funcționează un sistem de operare asemănător UNIX. Codul sursă poate fi găsit în depozitul Github.

Punctul de intrare și lansarea kernelului

Mai întâi, să scriem un fișier mic în asamblatorul x86 care va fi punctul de pornire pentru pornirea nucleului. Acest fișier va apela o funcție C externă și apoi va opri fluxul programului.

Cum vă asigurați că acest cod servește drept punct de plecare pentru nucleu?

Vom folosi un script de linker care leagă fișierele obiect pentru a crea executabilul final al nucleului. În acest script, vom indica în mod explicit că fișierul binar ar trebui să fie încărcat la adresa 0x100000. Această adresă este locul unde ar trebui să fie nucleul.

Iată codul de asamblare:

;; kernel.asm biți 32; directivă nasm - secțiune de 32 de biți .text global start extern kmain; kmain definit în fișierul C start: cli; bloc de întrerupere mov esp, stack_space; setează indicatorul stivei apel kmain hlt; secțiunea oprire procesor .bss resb 8192; 8KB per stivă stack_space:

Prima instrucțiune de biți 32 nu este o instrucțiune de asamblare x86. Aceasta este o directivă pentru asamblatorul NASM care afirmă că trebuie să genereze cod pentru a rula pe un procesor care rulează în modul pe 32 de biți. Acest lucru nu este neapărat necesar în exemplul nostru, dar este o bună practică să specificați aceste lucruri în mod explicit.

A doua linie începe cu o secțiune de text. Aici vom plasa tot codul nostru.

global este o altă directivă NASM folosită pentru a seta simbolurile codului sursă ca fiind globale.

kmain este o funcție personalizată care va fi definită în fișierul nostru kernel.c. extern declară că funcția este definită în altă parte.

Funcția de pornire apelează funcția kmain și oprește CPU-ul cu comanda hlt. Întreruperile pot trezi CPU de la executarea unei instrucțiuni hlt. Prin urmare, mai întâi dezactivăm întreruperile folosind instrucțiunea cli.

În mod ideal, ar trebui să alocați puțină memorie pentru stivă și să indicați spre ea folosind un indicator de stivă (în special). Cu toate acestea, GRUB o face pentru noi, iar indicatorul de stivă este deja setat. Cu toate acestea, pentru a fi sigur, vom aloca ceva spațiu în secțiunea BSS și vom pune indicatorul stivei la începutul memoriei alocate. Pentru a face acest lucru, folosim comanda resb, care rezervă memorie în octeți. După aceea, rămâne o etichetă care indică marginea blocului de memorie rezervat. Înainte de a apela kmain, indicatorul de stivă (esp) este folosit pentru a indica acest spațiu folosind comanda mov.

Kernel în C

În kernel.asm, am făcut un apel la funcția kmain (). Astfel, codul C va începe să se execute în kmain ():

/ * * kernel.c * / void kmain (void) (const char * str = "primul meu nucleu"; char * vidptr = (char *) 0xb8000; // memoria video începe aici unsigned int i = 0; unsigned int j = 0; / * această buclă șterge ecranul * / while (j< 80 * 25 * 2) { /* пустой символ */ vidptr[j] = " "; /* байт атрибутов */ vidptr = 0x07; j = j + 2; } j = 0; /* в этом цикле строка записывается в видео память */ while(str[j] != "\0") { /* ascii отображение */ vidptr[i] = str[j]; vidptr = 0x07; ++j; i = i + 2; } return; }

* nucleu.c

void kmain (void)

const char * str = "primul meu nucleu";

unsigned int i = 0;

unsigned int j = 0;

/ * această buclă șterge ecranul * /

în timp ce (j< 80 * 25 * 2 ) {

/ * caracter gol * /

vidptr [j] = "";

/ * octeți de atribute * /

vidptr [j + 1] = 0x07;

j = j + 2;

j = 0;

/ * în această buclă, linia este scrisă în memoria video * /

în timp ce (str [j]! = "\ 0") (

/ * afișaj ascii * /

vidptr [i] = str [j];

vidptr [i + 1] = 0x07;

i = i + 2;

întoarcere;

Nucleul nostru va șterge ecranul și va imprima șirul „primul meu nucleu”.

Mai întâi, creăm un pointer vidptr care indică 0xb8000. Această adresă este începutul memoriei video în modul protejat. Memoria text de pe ecran este doar o bucată de memorie din spațiul nostru de adrese. I/O pe ecranul cardului de memorie începe de la 0xb8000 și acceptă 25 de linii a câte 80 de caractere ascii fiecare.

Fiecare element de caracter din această memorie de text este reprezentat de 16 biți (2 octeți), nu de cei 8 biți (1 octet) cu care suntem obișnuiți. Primul octet trebuie să aibă o reprezentare de caractere ASCII. Al doilea octet este octetul de atribut. Descrie formatarea simbolului, inclusiv diverse atribute, cum ar fi culoarea.

Pentru a imprima un caracter cu verde pe fundal negru, stocăm caracterul s în primul octet al adresei memoriei video și valoarea 0x02 în al doilea octet.

0 este fundal negru și 2 este verde.

Mai jos este un tabel de coduri pentru diferite culori:

0 - Negru, 1 - Albastru, 2 - Verde, 3 - Cyan, 4 - Roșu, 5 - Magenta, 6 - Maro, 7 - Gri deschis, 8 - Gri închis, 9 - Albastru deschis, 10 / a - Verde deschis, 11 / b - Cyan deschis, 12 / c - Roșu deschis, 13 / d - Magenta deschis, 14 / e - Maro deschis, 15 / f - Alb.

0 - Negru, 1 - Albastru, 2 - Verde, 3 - Cyan, 4 - Roșu, 5 - Magenta, 6 - Maro, 7 - Gri deschis, 8 - Gri închis, 9 - Albastru deschis, 10 / a - Verde deschis, 11 / b - Cyan deschis, 12 / c - Roșu deschis, 13 / d - Magenta deschis, 14 / e - Maro deschis, 15 / f - Alb.

În nucleul nostru, vom folosi caractere gri deschis pe un fundal negru. Prin urmare, octetul nostru de atribut trebuie să fie 0x07.

În prima buclă while, programul scrie un caracter gol cu ​​atributul 0x07 pe toate cele 80 de coloane de 25 de linii. Aceasta șterge ecranul.

În a doua buclă while, caracterele șirului „primul meu nucleu” sunt scrise într-o bucată de memorie video. Pentru fiecare caracter, octetul de atribut conține valoarea 0x07.

Astfel, linia va fi afișată pe ecran.

Piesa de conectare

Compilăm kernel.asm și NASM într-un fișier obiect și apoi folosim GCC pentru a compila kernel.c într-un alt fișier obiect. Acum sarcina noastră este să asociem aceste obiecte cu nucleul executabil bootabil.

Pentru a face acest lucru, folosim un script de linker explicit care poate fi transmis ca argument la ld (linkerul nostru).

/ * * link.ld * / OUTPUT_FORMAT (elf32-i386) INTRARE (start) SECȚIUNI (. = 0x100000; .text: (* (. text)) .data: (* (. data)) .bss: (* ( .bss)))

* link.ld

OUTPUT_FORMAT (elf32 - i386)

INTRARE (început)

SECȚIUNI

0x100000;

Text: (* (. Text))

Date: (* (. Date))

Bss: (* (. Bss))

Mai întâi, setăm formatul de ieșire al executabilului la executabil pe 32 de biți (ELF). ELF este formatul standard de fișier binar pentru sistemele de tip Unix pe arhitectura x86.

ENTRY are un singur argument. Specifică numele simbolului, care ar trebui să fie punctul de intrare al executabilului nostru.

SECȚIUNI este cea mai importantă parte în care definim marcajul fișierului executabil. Acesta specifică cum ar trebui combinate diferitele secțiuni și unde vor fi amplasate.

În cadrul acoladelor care urmează instrucțiunii SECTIONS, caracterul punct (.) - reprezintă contorul de locație.

Contorul de locație este întotdeauna inițializat la 0x0 la începutul blocului SECȚIUNI. Poate fi schimbat prin atribuirea unei noi valori.

După cum sa menționat, codul kernel-ului trebuie să înceapă de la 0x100000. Astfel, am setat contorul de locație la 0x100000.

Uită-te la următoarea linie .text: (* (. text))

Asteriscul (*) este un caracter special care se va potrivi cu orice nume de fișier. Adică, expresia * (. Text) înseamnă toate secțiunile .text de intrare din toate fișierele de intrare.

Astfel, linkerul concatenează toate secțiunile de text ale fișierelor obiect în secțiunea de text a fișierului executabil la adresa stocată în contorul de locații. Secțiunea de cod a executabilului începe la 0x100000.

După ce linkerul plasează secțiunea de ieșire a textului, contorul de locație este setat la 0x1000000 + dimensiunea secțiunii de ieșire a textului.

La fel, secțiunile de date și bss sunt concatenate și plasate pe valorile contorului de locație.

Grub și Multiboot

Acum toate fișierele necesare pentru a construi nucleul sunt gata. Dar din moment ce intenționăm să pornim kernel-ul folosind GRUB, este nevoie de puțin mai mult.

Există un standard pentru pornirea diferitelor nuclee x86 folosind un bootloader numit specificația Multiboot.

GRUB va porni un nucleu numai dacă este conform cu specificația Multiboot.

Potrivit acestuia, nucleul trebuie să conțină antetul în primii 8 kiloocteți.

În plus, acest antet trebuie să conțină încă 3 câmpuri:

  • câmp de număr magic: conține numărul magic 0x1BADB002, pentru a identifica antetul.
  • câmp flags: nu avem nevoie de el acum, doar setați valoarea lui la zero.
  • câmpul sumă de control: atunci când este specificat, ar trebui să returneze zero pentru o sumă cu primele două câmpuri.

Deci kernel.asm va arăta astfel:

;; kernel.asm; directivă nasm - 32 biți biți 32 secțiune .text; aliniere cu specificații multiboot 4 dd 0x1BADB002; numere magice dd 0x00; dd flags - (0x1BADB002 + 0x00); sumă de control. mh + f + ks trebuie să fie egal cu zero global start extern kmain; kmain este definit în fișierul extern start: cli; blocarea întreruperii mov esp, stack_space; stack pointer call kmain hlt; secțiunea de oprire a procesorului .bss resb 8192; 8KB per stivă stack_space:

; ; nucleu. asm

; directiva nasm - 32 de biți

biții 32

secțiune. text

; specificații multiboot

aliniază 4

dd 0x1BADB002; numere magice

dd 0x00; steaguri

dd - (0x1BADB002 + 0x00); verifica suma. mch + f + ks ar trebui să fie egal cu zero

început global

extern kmmain; kmain este definit într-un fișier extern

start:

cli; blocarea întreruperii

mov esp, stivă _ spațiu; indicator de stivă

apelați kmain

hlt; oprirea procesorului

Când începeți să citiți tutoriale de promovare a site-ului web, începe întotdeauna cu crearea unui nucleu semantic. Pentru începători, acest prim pas este cel mai dificil. Pe lângă faptul că nu este clar imediat ce este acest nucleu semantic, nu este clar nici ce scop are și cum să-l creeze corect.

În acest articol, vom vorbi despre cum să creați corect nucleul semantic al site-ului. Și, de asemenea, veți afla despre ce este și de ce este făcut. De fapt, nu există nimic complicat și dificil în conceptul de nucleu semantic. Să ne dăm seama.

Nimeni nu a răspuns încă la întrebarea ce este nucleul semantic în cuvinte atât de simple pe care le vom face acum. Deci, nucleul semantic al site-ului este o listă de fraze cheie prin care acesta va fi promovat. Tot! Întregul sens al conceptului într-o propoziție scurtă și clară. Și nu este nevoie să încurcă nimic cu termeni inteligenți.

Dacă intrați mai adânc în termen, atunci semantica este o știință care se ocupă cu umplerea semantică a unităților lexicale. În termeni simpli, semantica studiază semnificația a ceva. În SEO, nucleul semantic face posibilă înțelegerea semnificației întregului site, a oricărei secțiuni sau a unui singur articol preluat. Acest lucru devine clar pentru motorul de căutare, vizitator, toți dezvoltatorii care vor lucra cu site-ul.

Miezul semantic, fără exagerare, este fundamentul oricărui progres.

Cum se folosește nucleul semantic și pentru ce este

Funcțiile nucleului semantic includ următoarele aspecte ale promovării site-ului web:

  • Cea mai importantă sarcină a nucleului semantic este de a înțelege structura site-ului și plenitudinea acestuia. Privind-o, vă puteți imagina ce secțiuni va avea site-ul și ce articole vor fi în fiecare secțiune. Și astfel, toate dezavantajele și inconvenientele structurii sunt imediat vizibile și pot fi eliminate într-un stadiu incipient.
  • Semantica definește vectorul de conținut. Datorită unei mai bune înțelegeri a structurii site-ului, puteți alege cele mai relevante și eficiente fraze cheie.
  • Miezul semantic este planul de conținut al site-ului pentru mulți ani de acum înainte. De fiecare dată când trebuie să scrii articole, poți să te uiți acolo și să vezi ce conținut a fost planificat și în ce secțiune a site-ului ar trebui să fie.
  • Dacă intenționați să vă promovați site-ul pe o bază plătită, de exemplu, prin publicitate contextuală, atunci datorită nucleului semantic, puteți calcula costul promovării.

Cum să faci un nucleu semantic

Mai întâi trebuie să decideți de unde veți obține expresiile cheie pentru nucleu. Cea mai bună sursă pentru începători este serviciul Yandex WordPStat, care arată de câte ori pe lună este introdusă o anumită interogare în căutarea Yandex. WordStat are o varietate de funcții utile, cum ar fi filtrarea interogărilor după regiune sau dispozitiv, vizualizarea interogărilor asociate și multe altele. Și cel mai important, este complet gratuit. Mai multe despre asta.

Puteți folosi o varietate de programe plătite, dar WordStat este mai potrivit pentru începători, având în vedere simplitatea sa. În plus, este potrivit nu numai pentru Runet, unde predomină Yandex. Dacă promovați un site în CSI, atunci îl puteți utiliza în siguranță, iar statisticile de pe Google vor fi aproximativ aceleași.

Esența principală a creării unui nucleu semantic este colecția de fraze cheie care se potrivesc cumva cu subiectul site-ului. Ele trebuie să fie formalizate și sistematizate cumva. Pentru aceasta, foile de calcul, cum ar fi Excel, foile de calcul Google Doc sau similare sunt cele mai potrivite.

Și pentru o eficiență mai mare, grafice suplimentare pot fi adăugate la tabelul de bază semantic:

  • Desigur, ar trebui să existe un grafic cu cea mai mare expresie cheie.
  • Desigur, coloana cu numele secțiunii site-ului unde va fi folosită această expresie.
  • Puteți adăuga o coloană cu metaetichetele titlu și descriere și puteți scrie imediat titlul și descrierea articolului folosind expresia cheie specificată. În primul rând, va fi imediat clar despre ce să scrieți un articol și, în al doilea rând, nu va fi nevoie să-l inventați.
  • Puteți face o coloană pentru a indica numărul de caractere din articol pentru o anumită expresie cheie pentru a înțelege mai bine planul de conținut.
  • Dacă vorbim despre promovarea publicității contextuale, trebuie să adăugați costul publicității pentru fiecare solicitare.
  • Tot ceea ce ar trebui să fie necesar poate fi scris în siguranță în tabelul nucleului sematic. Nu există un șablon pentru asta, așa că poți face tot ce vrei și este convenabil acolo.

Greșeli frecvente la crearea unui nucleu semantic

Acum știți cum să creați corect nucleul semantic al site-ului. Să aruncăm o privire la unele dintre greșelile comune pe care le fac SEO începători.

  • Dacă nucleul prevede împărțirea sitului în categorii, atunci o greșeală comună este crearea unor niveluri profunde de cuibărit. Al doilea nivel este recomandat și nu mai departe. Adică puteți crea un titlu, un subtitlu și atât, nu mai este posibil să îl împărțiți mai departe în titluri mai mici.
  • Începătorii pot ignora solicitările de joasă frecvență, deoarece consideră că nu este practic să le folosească, tot nu vor aduce mult trafic. Dar, de fapt, opusul este adevărat. Pentru un site nou, este nevoie de interogări cu frecvență joasă, necompetitive.
  • Nu puteți avea încredere completă în serviciul cu care vor fi extrase frazele cheie. Și începătorii fac exact asta. Mașinile pot fi greșite și pot alege pe cea greșită.
  • Nu este nevoie să creați un articol de dragul unei fraze cheie. Dacă găsiți expresiile „vinde urgent o casă” și „vinde rapid o casă”, atunci nu are rost să le faci două articole diferite.

Această serie de articole este dedicată programării de nivel scăzut, adică arhitecturii computerelor, proiectării sistemului de operare, programării în limbaj de asamblare și domeniilor conexe. Până acum, două habrauzera sunt angajate în scris - și. Pentru mulți elevi de liceu, studenți și programatori profesioniști, aceste subiecte se dovedesc a fi foarte greu de învățat. Există multă literatură și cursuri despre programarea la nivel scăzut, dar este dificil să obțineți o imagine completă și cuprinzătoare din acestea. Este dificil, după ce am citit una sau două cărți despre asamblare și sisteme de operare, să ne imaginăm, cel puțin în termeni generali, cum funcționează de fapt acest sistem complex de fier, siliciu și multe programe - un computer.

Fiecare rezolvă problema învățării în felul său. Cineva citește multă literatură, cineva încearcă să treacă rapid la practică și să înțeleagă pe parcurs, cineva încearcă să explice prietenilor tot ceea ce studiază. Și am decis să combinăm aceste abordări. Deci, în acest curs de articole, vom demonstra pas cu pas cum să scrieți un sistem de operare simplu. Articolele vor avea un caracter general, adică nu vor conține informații teoretice exhaustive, cu toate acestea, vom încerca întotdeauna să oferim link-uri către materiale teoretice bune și să răspundem la toate întrebările care apar. Nu avem un plan clar, așa că multe decizii importante vor fi luate pe parcurs, ținând cont de feedback-ul dumneavoastră.

Poate că vom opri în mod deliberat procesul de dezvoltare pentru a vă permite dvs. și nouă înșine să înțelegeți pe deplin toate consecințele unei decizii greșite, precum și să perfecționăm unele abilități tehnice asupra acesteia. Deci nu ar trebui să iei deciziile noastre ca fiind singurele corecte și să ai încredere orbește în noi. Încă o dată, subliniem că ne așteptăm ca cititorii să fie activi în discutarea articolelor, ceea ce ar trebui să influențeze puternic dezvoltarea generală și scrierea articolelor ulterioare. În mod ideal, am dori să vedem unii dintre cititori să se alăture dezvoltării sistemului în timp.

Vom presupune că cititorul este deja familiarizat cu elementele de bază ale limbajelor de asamblare și C, precum și cu conceptele de bază ale arhitecturii computerelor. Adică nu vom explica ce este un registru sau, să zicem, o memorie cu acces aleatoriu. Dacă nu aveți suficiente cunoștințe, puteți oricând să consultați literatura suplimentară. O scurtă listă de referințe și link-uri către site-uri cu articole bune se află la sfârșitul articolului. De asemenea, este de dorit să puteți utiliza Linux, deoarece toate instrucțiunile de compilare vor fi date special pentru acest sistem.

Și acum - mai la obiect. În restul articolului, vom scrie un program clasic „Hello World”. Lumea noastră Hello se va dovedi a fi puțin specifică. Nu va rula de pe niciun sistem de operare, ci direct, ca să spunem așa, „pe bare metal”. Înainte de a trece direct la scrierea codului, să ne dăm seama cum încercăm exact să facem acest lucru. Și pentru aceasta trebuie să luați în considerare procesul de pornire a computerului.

Deci, luați computerul preferat și apăsați pe cel mai mare buton de pe unitatea de sistem. Vedem un ecran de splash vesel, unitatea de sistem emite un bip fericit cu un difuzor, iar după un timp sistemul de operare este încărcat. După cum înțelegeți, sistemul de operare este stocat pe hard disk și aici apare întrebarea: cum a pornit magic sistemul de operare în RAM și a început să se execute?

Știți acest lucru: sistemul care se află pe orice computer este responsabil pentru acest lucru, iar numele său - nu, nu Windows, vă așteaptă limba - se numește BIOS. Numele său înseamnă Basic Input-Output System, adică sistemul de bază de intrare-ieșire. BIOS-ul se află pe un mic microcircuit de pe placa de bază și pornește imediat după apăsarea butonului mare ON. BIOS-ul are trei sarcini principale:

  1. Detectați toate dispozitivele conectate (procesor, tastatură, monitor, RAM, placă video, cap, brațe, aripi, picioare și cozi...) și verificați-le pentru funcționare. Programul POST (Power On Self Test) este responsabil pentru acest lucru. Dacă hardware-ul vital nu este găsit, atunci niciun software nu va putea ajuta, iar în acest moment difuzorul sistemului va scârțâi ceva sinistru și sistemul de operare nu va ajunge deloc în sistemul de operare. Să nu vorbim despre trist, să presupunem că avem un computer complet funcțional, ne bucurăm și trecem la examinarea celei de-a doua funcție BIOS:
  2. Furnizarea sistemului de operare cu un set de bază de funcții pentru lucrul cu hardware. De exemplu, prin funcțiile BIOS, puteți afișa text pe ecran sau puteți citi date de la tastatură. Prin urmare, se numește sistemul I/O de bază. De obicei, sistemul de operare accesează aceste funcții prin întreruperi.
  3. Lansarea încărcării sistemului de operare. În acest caz, de regulă, se citește sectorul de boot - primul sector al purtătorului de informații (dischetă, hard disk, CD, unitate flash). Ordinea mediilor de interogare poate fi setată în BIOS SETUP. Sectorul de boot conține un program numit uneori încărcător de pornire primar. În linii mari, sarcina bootloader-ului este să pornească sistemul de operare. Procesul de pornire al unui sistem de operare poate fi foarte specific și foarte dependent de caracteristicile acestuia. Prin urmare, bootloader-ul primar este scris direct de dezvoltatorii sistemului de operare și este scris în sectorul de pornire în timpul instalării. În momentul în care pornește bootloader-ul, procesorul este în modul real.
Veste tristă: dimensiunea bootloader-ului ar trebui să fie de numai 512 octeți. De ce atât de puțini? Pentru a face acest lucru, trebuie să ne familiarizăm cu dispozitivul dischetei. Iată o poză informativă:

Imaginea arată suprafața unei unități de disc. Discheta are 2 suprafete. Fiecare suprafață are urme în formă de inel. Fiecare pistă este împărțită în bucăți mici, arcuite, numite sectoare. Deci, din punct de vedere istoric, un sector de dischetă are o dimensiune de 512 octeți. Primul sector de pe disc, sectorul de boot, este citit de BIOS în segmentul de memorie zero la offset 0x7C00, iar apoi controlul este transferat la această adresă. Încărcătorul de pornire se încarcă de obicei în memorie nu sistemul de operare în sine, ci un alt încărcător. program stocat pe disc, dar din anumite motive (cel mai probabil, acest motiv este dimensiunea) care nu se încadrează într-un singur sector. Și, din moment ce rolul sistemului nostru de operare este jucat până acum de un banal Hello World, scopul nostru principal este să faceți computerul să creadă în existența sistemului nostru de operare, chiar dacă doar pe un sector, și rulați-l.

Cum funcționează sectorul de boot? Pe un computer, singura cerință pentru sectorul de boot este ca ultimii doi octeți să conțină valorile 0x55 și 0xAA - semnătura sectorului de boot. Deci, este deja mai mult sau mai puțin clar ce trebuie să facem. Să scriem codul! Codul de mai sus este scris pentru asamblatorul yasm.

secțiune. text

folosi16

org 0x7C00 ; programul nostru este încărcat la 0x7C00

start:

mov ax, cs

mov ds, ax ; selectați segmentul de date



mov si, mesaj

cld ; direcție pentru comenzi șir

mov ah, 0x0E ; Numărul funcției BIOS

mov bh, 0x00 ; pagina de memorie video

puts_loop:

lodsb ; încărcați următorul caracter în al

test al, al ; caracterul nul înseamnă sfârșitul rândului

jz puts_loop_exit

int 0x10 ; apelați funcția BIOS

jmp puts_loop

puts_loop_exit:

jmp $; ciclu etern



mesaj:

db „Bună lume!” , 0

finalizarea:

ori 0x1FE - terminare + start db 0

db 0x55, 0xAA ; semnătura sectorului de boot

Acest scurt program necesită o serie de explicații importante. Linia org 0x7C00 este necesară pentru ca asamblatorul (mă refer la program, nu la limbaj) să calculeze corect adresele pentru etichete și variabile (puts_loop, puts_loop_exit, mesaj). Așa că îl informăm că programul va fi încărcat în memorie la adresa 0x7C00.
În rânduri
mov ax, cs

mov ds, ax
segmentul de date (ds) este setat egal cu segmentul de cod (cs), deoarece în programul nostru atât datele, cât și codul sunt stocate într-un singur segment.

Apoi mesajul „Hello World!” este afișat caracter cu caracter în buclă. Funcția 0x0E a întreruperii 0x10 este utilizată pentru aceasta. Are urmatorii parametri:
AH = 0x0E (numărul funcției)
BH = numărul paginii video (nu vă deranjați încă, specificați 0)
AL = cod de caractere ASCII

La linia „jmp $” programul se blochează. Și pe bună dreptate, nu este nevoie ca ea să execute cod suplimentar. Cu toate acestea, pentru ca computerul să funcționeze din nou, va trebui să reporniți.

În linia „times 0x1FE-finish + start db 0”, restul codului programului (cu excepția ultimilor doi octeți) este umplut cu zerouri. Acest lucru se face astfel încât după compilare semnătura sectorului de boot să apară în ultimii doi octeți ai programului.

Am descoperit codul programului, acum haideți să încercăm să compilăm această fericire. Pentru compilare, avem nevoie, de fapt, de un asamblator - cel menționat mai sus

Top articole similare