Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • vijesti
  • Kreiranje kernela operativnog sistema. Operativni sistem sličan UNIX-u: Pisanje kernela u C

Kreiranje kernela operativnog sistema. Operativni sistem sličan UNIX-u: Pisanje kernela u C

Semantičko jezgro je zastrašujuće ime koje su SEO-ovi smislili da se odnosi na prilično jednostavnu stvar. Samo trebamo odabrati ključne upite za koje ćemo promovirati našu stranicu.

I u ovom članku ću vam pokazati kako pravilno sastaviti semantičko jezgro tako da vaša stranica brzo dođe do TOP-a i ne stagnira mjesecima. I ovdje postoje "tajne".

I prije nego što pređemo na sastavljanje SA, pogledajmo šta je to i do čega bismo na kraju trebali doći.

Šta je semantičko jezgro jednostavnim riječima

Čudno, ali semantičko jezgro je obična excel datoteka, u kojoj lista sadrži ključne upite za koje ćete vi (ili vaš copywriter) pisati članke za stranicu.

Na primjer, evo kako izgleda moje semantičko jezgro:

Označio sam zelenom bojom one ključne upite za koje sam već napisao članke. Žuti - oni za koje ću pisati članke u bliskoj budućnosti. A bezbojne ćelije znače da će ti zahtjevi doći malo kasnije.

Za svaki ključni zahtjev odredio sam učestalost, konkurentnost i izmislio "upečatljiv" naslov. Evo otprilike iste datoteke koju biste trebali dobiti. Sada se moj SL sastoji od 150 ključnih riječi. To znači da imam „materijal“ za najmanje 5 mjeseci unaprijed (čak i ako napišem jedan članak dnevno).

Malo niže ćemo govoriti o tome na što biste se trebali pripremiti ako iznenada odlučite naručiti kolekciju semantičke jezgre od stručnjaka. Evo reći ću ukratko - daće vam istu listu, ali samo za hiljade "ključeva". Međutim, u SA nije bitna količina, već kvalitet. I mi ćemo se fokusirati na ovo.

Zašto nam je uopšte potrebno semantičko jezgro?

Ali zaista, zašto nam treba ova muka? Možete, na kraju, samo tako pisati visokokvalitetne članke i time privući publiku, zar ne? Da, možete pisati, ali ne možete privući.

Glavna greška 90% blogera je samo pisanje visokokvalitetnih članaka. Ne šalim se, imaju zaista zanimljive i korisne materijale. Ali pretraživači ne znaju za to. Oni nisu vidovnjaci, već samo roboti. Shodno tome, ne stavljaju vaš članak u TOP.

Postoji još jedna suptilna stvar u naslovu. Na primjer, imate vrlo kvalitetan članak na temu "Kako poslovati u "knjigi o njuškama". Tu opisujete sve o Facebooku vrlo detaljno i profesionalno. Uključujući kako promovirati tamošnje zajednice. Vaš je članak najkvalitetniji, najkorisniji i najzanimljiviji na internetu na ovu temu. Niko nije ležao pored tebe. Ali i dalje ti neće pomoći.

Zašto kvalitetni artikli lete iz TOP-a

Zamislite da vašu web stranicu nije posjetio robot, već provjeravač uživo (procjenitelj) iz Yandexa. Shvatio je da imate najbolji članak. A ruke vas stavljaju na prvo mjesto u rezultatima pretraživanja za upitom "Promocija zajednice na Facebooku".

Znate li šta će se sljedeće dogoditi? Izaći ćeš odatle vrlo brzo. Jer niko neće kliknuti na vaš članak, čak ni na prvom mjestu. Ljudi unose upit "Promocija zajednice na Facebooku", a vaš naslov je "Kako poslovati u "brnjici". Originalno, svježe, smiješno, ali ... ne na zahtjev. Ljudi žele da vide tačno ono što su tražili, a ne vaš kreativac.

Shodno tome, vaš će članak isprazniti zauzeti mjesto u VRHU izdanja. A živi procjenitelj, vatreni obožavatelj vašeg rada, može moliti vlasti koliko god želi da vas ostavi barem u TOP-10. Ali to neće pomoći. Sva prva mjesta će zauzeti prazni, poput ljuski od sjemenki, artikli koje su jedni od drugih prepisivali dojučerašnji školarci.

Ali ovi članci će imati ispravan “relevantan” naslov - “Promocija zajednice na Facebooku od nule” ( korak po korak, 5 koraka, od A do Z, besplatno itd.) Šteta? Ipak bi. Pa, bori se protiv nepravde. Napravimo kompetentno semantičko jezgro kako bi vaši članci zauzeli zaslužena prva mjesta.

Još jedan razlog da odmah počnete sa kompajliranjem SA

Postoji još jedna stvar o kojoj ljudi iz nekog razloga ne razmišljaju mnogo. Morate pisati članke često - barem svake sedmice, a po mogućnosti 2-3 puta sedmično da biste dobili više prometa i brže.

To svi znaju, ali gotovo niko to ne radi. A sve zato što imaju “kreativnu stagnaciju”, “ne mogu se natjerati”, “samo lijenost”. Ali zapravo, cijeli problem je upravo u odsustvu specifičnog semantičkog jezgra.

U polje za pretragu sam uneo jedan od svojih osnovnih ključeva — „smm“ i Yandex mi je odmah dao desetak nagoveštaja o tome šta bi još moglo da zanima ljude koji su zainteresovani za „smm“. Moram samo da kopiram ove ključeve u svesku. Zatim ću svaki od njih provjeriti na isti način i prikupiti tragove o njima.

Nakon prve faze prikupljanja CL-a, trebali biste dobiti tekstualni dokument, koji će sadržavati 10-30 širokih osnovnih ključeva, s kojima ćemo dalje raditi.

Korak #2 - Parsing Basic Keys u SlovoEB

Naravno, ako napišete članak na upit "webinar" ili "smm", onda se čudo neće dogoditi. Nikada nećete moći doći do TOP-a za tako širok upit. Moramo razbiti osnovni ključ na mnogo malih upita o ovoj temi. A to ćemo učiniti uz pomoć posebnog programa.

Koristim KeyCollector ali se plaća. Možete koristiti besplatni analog - program SlovoEB. Možete ga preuzeti sa službene stranice.

Najteže u radu sa ovim programom je pravilno ga postaviti. Kako pravilno postaviti i koristiti Slovoeb pokazujem. Ali u tom članku fokusiram se na odabir ključeva za Yandex-Direct.

A ovdje pogledajmo karakteristike korištenja ovog programa za kompajliranje semantičkog jezgra za SEO korak po korak.

Prvo kreiramo novi projekat i imenujemo ga prema širokom ključu koji želite da raščlanite.

Obično projektu dam isto ime kao i moj osnovni ključ kako se kasnije ne bih zbunio. I da, upozorit ću vas na još jednu grešku. Ne pokušavajte raščlaniti sve osnovne ključeve u isto vrijeme. Tada će vam biti veoma teško da filtrirate "prazne" ključne upite iz zlatnih zrna. Hajde da analiziramo jedan po jedan ključ.

Nakon izrade projekta, izvodimo osnovnu operaciju. To jest, mi zapravo analiziramo ključ kroz Yandex Wordstat. Da biste to učinili, kliknite na dugme "Worstat" u sučelju programa, unesite svoj osnovni ključ i kliknite na "Počni prikupljati".

Na primjer, hajde da analiziramo osnovni ključ za moj blog "kontekstualno oglašavanje".

Nakon toga počinje proces, a nakon nekog vremena program će nam dati rezultat - do 2000 ključnih upita koji sadrže "kontekstualno oglašavanje".

Također, pored svakog zahtjeva bit će "prljava" učestalost - koliko je puta ovaj ključ (+ njegove riječi i repovi) pretraživan mjesečno putem Yandexa. Ali ne savjetujem vam da izvlačite bilo kakve zaključke iz ovih brojki.

Korak #3 - Prikupljanje tačne frekvencije za ključeve

Prljava frekvencija nam neće ništa pokazati. Ako se fokusirate na to, nemojte se kasnije iznenaditi kada vaš ključ za 1000 zahtjeva ne donese nijedan klik mjesečno.

Moramo pronaći neto frekvenciju. A za to prvo odabiremo sve pronađene ključeve s kvačicama, a zatim kliknemo na dugme Yandex Direct i ponovo pokrenemo proces. Sada će Slovoeb tražiti tačnu učestalost zahtjeva mjesečno za svaki ključ.

Sada imamo objektivnu sliku – koliko puta su koji zahtjev uneli korisnici interneta u proteklom mjesecu. Sada predlažem da grupišete sve ključne upite po učestalosti, kako bi bilo praktičnije raditi s njima.

Da biste to učinili, kliknite na ikonu "filter" u "Frekvencija"!" “, i navedite da filtrirate ključeve sa vrijednošću “manje od ili jednako 10”.

Sada će vam program pokazati samo one zahtjeve čija je učestalost manja ili jednaka vrijednosti "10". Možete izbrisati ove upite ili ih kopirati za budućnost u drugu grupu ključnih riječi. Manje od 10 je vrlo nisko. Pisanje članaka za ove zahtjeve je gubljenje vremena.

Sada moramo odabrati one ključne riječi koje će nam donijeti manje-više dobar promet. A za to moramo saznati još jedan parametar - nivo konkurencije zahtjeva.

Korak #4 - Provjera paralelnosti upita

Svi "ključevi" na ovom svijetu podijeljeni su u 3 tipa: visokofrekventni (HF), srednje frekvencijski (MF), niskofrekventni (LF). Oni takođe mogu biti visoko konkurentni (VC), srednje konkurentni (SC) i nisko konkurentni (NC).

Po pravilu, HF zahtjevi su istovremeno i VC. Odnosno, ako se upit često pretražuje na Internetu, onda postoji mnogo web-lokacija koje žele napredovati na njemu. Ali to nije uvijek slučaj, ima sretnih izuzetaka.

Umjetnost sastavljanja semantičkog jezgra leži upravo u pronalaženju takvih upita koji imaju visoku frekvenciju, a njihov nivo konkurencije je nizak. Ručno određivanje nivoa konkurencije je veoma teško.

Možete se fokusirati na indikatore kao što su broj glavnih stranica u TOP-10, dužina i kvalitet tekstova. nivo povjerenja i web stranice u VRHU izdanja na zahtjev. Sve ovo će vam dati neku ideju o tome koliko je teška konkurencija za pozicije za ovaj konkretan zahtjev.

Ali preporučujem da koristite servis Mutagen. Uzima u obzir sve parametre koje sam naveo, plus još desetak, za koje ni vi ni ja vjerovatno nismo ni čuli. Nakon analize, servis daje tačnu vrijednost – koliki je nivo konkurencije za ovaj zahtjev.

Ovdje sam provjerio zahtjev "podešavanje kontekstualnog oglašavanja u google adwords". Mutagen nam je pokazao da ovaj ključ ima paralelnost "više od 25" - to je maksimalna vrijednost koju pokazuje. I ovaj zahtjev ima samo 11 pregleda mjesečno. Tako da nam ne odgovara.

Možemo kopirati sve ključeve koje smo pokupili u Slovoebu i obaviti masovnu provjeru u Mutagenu. Nakon toga ostaje nam samo da pregledamo listu i uzmemo one zahtjeve koji imaju puno zahtjeva i nizak nivo konkurencije.

Mutagen je usluga koja se plaća. Ali možete besplatno obaviti 10 provjera dnevno. Osim toga, cijena verifikacije je vrlo niska. Za sve vreme koje sam radio sa njim, još nisam potrošio ni 300 rubalja.

Inače, na račun nivoa konkurencije. Ako imate mladu stranicu, onda je bolje odabrati upite sa nivoom konkurencije 3-5. A ako promovirate više od godinu dana, onda možete uzeti 10-15.

Inače, na račun učestalosti zahtjeva. Sada moramo napraviti posljednji korak, koji će vam omogućiti da privučete mnogo prometa čak i za upite niske frekvencije.

Korak #5 - Sakupljanje "repova" za odabrane ključeve

Kao što je više puta dokazano i potvrđeno, vaša stranica će primati najveći dio prometa ne od glavnih ključeva, već od takozvanih „repova“. To je kada osoba unese čudne ključne upite u polje za pretragu, sa frekvencijom od 1-2 mjesečno, ali takvih upita ima puno.

Da vidite "rep" - samo idite na Yandex i unesite odabrani upit ključa u traku za pretraživanje. Evo šta ćete vidjeti.

Sada samo trebate napisati ove dodatne riječi u poseban dokument i koristiti ih u svom članku. Pri čemu ih nije potrebno stavljati uvijek pored glavnog ključa. U suprotnom, pretraživači će vidjeti "ponovnu optimizaciju" i vaši članci će pasti u rezultatima pretraživanja.

Samo ih koristite na različitim mjestima u svom članku, a onda ćete i od njih dobiti dodatni promet. Također bih preporučio da pokušate koristiti što više oblika riječi i sinonima za vaš glavni ključni upit.

Na primjer, imamo zahtjev - "Postavljanje kontekstualnog oglašavanja". Evo kako to možete preformulisati:

  • Podešavanje = postavljanje, pravljenje, kreiranje, pokretanje, pokretanje, omogućavanje, hostovanje…
  • Kontekstualno oglašavanje = kontekst, direktno, teaser, YAN, adwords, km. direktno, adwords…

Nikada ne znate tačno kako će ljudi tražiti informacije. Dodajte sve ove dodatne riječi u svoje semantičko jezgro i koristite ih prilikom pisanja tekstova.

Dakle, prikupljamo listu od 100 - 150 ključnih riječi. Ako sastavljate semantičko jezgro po prvi put, može vam trebati nekoliko sedmica da ga dovršite.

Ili mu možda slomiti oči? Možda postoji prilika da se delegira kompilacija CL specijalistima koji će to učiniti bolje i brže? Da, postoje takvi stručnjaci, ali nije uvijek potrebno koristiti njihove usluge.

Vrijedi li naručiti SA od stručnjaka?

Uglavnom, stručnjaci za sastavljanje semantičke jezgre će vas odvesti samo na korake 1 - 3 naše šeme. Ponekad će, uz veliku dodatnu naknadu, preduzeti i korake 4-5 - (sakupljanje repova i provjeravanje konkurencije zahtjeva).

Nakon toga će vam dati nekoliko hiljada ključnih upita s kojima ćete morati dalje raditi.

A ovdje je pitanje hoćete li sami pisati članke ili ćete za to angažirati copywritere. Ako se želite fokusirati na kvalitet, a ne na kvantitet, onda to morate sami napisati. Ali tada vam neće biti dovoljno da dobijete samo listu ključeva. Morat ćete odabrati one teme koje razumijete dovoljno dobro da napišete kvalitetan članak.

I tu se postavlja pitanje - zašto nam onda zapravo trebaju specijalisti u SA? Slažem se, raščlanjivanje osnovnog ključa i prikupljanje tačnih frekvencija (koraci #1-3) nije nimalo teško. Trebat će vam bukvalno pola sata.

Najteže je odabrati zahtjeve visoke frekvencije koji imaju nisku konkurenciju. A sada, kako se ispostavilo, treba vam HF-NC, o kojem možete napisati dobar članak. To je upravo ono što će vam oduzeti 99% vremena rada na semantičkom jezgru. I nijedan specijalista to neće učiniti umjesto vas. Pa, isplati li se trošiti novac na naručivanje takvih usluga?

Kada su usluge SA stručnjaka korisne

Druga stvar je ako u početku planirate privući copywritere. Tada ne morate razumjeti predmet zahtjeva. Vaši autori tekstova to također neće razumjeti. Oni će jednostavno uzeti nekoliko članaka na ovu temu i od njih sastaviti "svoj" tekst.

Takvi će članci biti prazni, jadni, gotovo beskorisni. Ali biće ih mnogo. Sami možete napisati najviše 2-3 kvalitetna članka sedmično. A armija copywritera će vam dati 2-3 usrana teksta dnevno. Istovremeno će biti optimizirani za zahtjeve, što znači da će privući neku vrstu prometa.

U ovom slučaju, da, mirno unajmite SA specijaliste. Neka u isto vrijeme sastave i TK za copywritere. Ali razumete, to će takođe koštati nešto novca.

Sažetak

Prođimo ponovo preko glavnih ideja u članku kako bismo konsolidirali informacije.

  • Semantičko jezgro je samo lista ključnih riječi za koje ćete pisati članke na stranici radi promocije.
  • Neophodno je optimizirati tekstove za tačne ključne upite, inače vaši čak ni najkvalitetniji članci nikada neće doći u TOP.
  • SL je poput plana sadržaja za društvene mreže. Pomaže vam da ne padnete u „kreativni blok“ i da uvek tačno znate o čemu ćete pisati sutra, prekosutra i za mesec dana.
  • Za kompajliranje semantičkog jezgra zgodno je koristiti besplatni program Slovoeb, samo vam je potreban.
  • Evo pet koraka u kompajliranju CL-a: 1 - Izbor osnovnih ključeva; 2 - Parsiranje osnovnih ključeva; 3 - Prikupljanje tačne frekvencije za zahtjeve; 4 - Provjera konkurentnosti ključeva; 5 - Zbirka "repova".
  • Ako želite sami da pišete članke, onda je bolje da sami napravite semantičku jezgru, za sebe. Stručnjaci za sastavljanje CL ovdje vam neće moći pomoći.
  • Ako želite raditi na količini i koristiti copywritere za pisanje članaka, onda je potpuno moguće uključiti delegiranje i kompajliranje semantičkog jezgra. Kad bi bar bilo dovoljno novca za sve.

Nadam se da vam je ovaj vodič bio od pomoći. Sačuvajte ga u svoje favorite kako ga ne biste izgubili i podijelite sa prijateljima. Ne zaboravite da preuzmete moju knjigu. Tu vam pokazujem najbrži put od nule do prvog miliona na internetu (iscijeđen iz ličnog iskustva preko 10 godina =)

Vidimo se kasnije!

Vaš Dmitrij Novoselov

Hajde da napišemo jednostavan kernel koji se može pokrenuti koristeći GRUB bootloader na x86 sistemu. Ovaj kernel će prikazati poruku na ekranu i čekati.

Kako se pokreće x86 sistem?

Prije nego počnemo pisati kernel, hajde da shvatimo kako se sistem pokreće i prenosi kontrolu na kernel.

Većina registara procesora već ima određene vrijednosti pri pokretanju. Registar koji ukazuje na adresu instrukcije (Instruction Pointer, EIP) pohranjuje memorijsku adresu na kojoj se nalazi instrukcija koju izvršava procesor. Zadani EIP je 0xFFFFFFFF0. Dakle, x86 procesori na nivou hardvera počinju na adresi 0xFFFFFFF0. Ovo je zapravo zadnjih 16 bajtova 32-bitnog adresnog prostora. Ova adresa se zove vektor resetovanja.

Sada memorijska mapa čipseta osigurava da 0xFFFFFFF0 pripada određenom dijelu BIOS-a, a ne RAM-u. Za to vrijeme, BIOS se kopira u RAM radi bržeg pristupa. Adresa 0xFFFFFFF0 će sadržati samo instrukciju za skok na adresu u memoriji na kojoj je pohranjena kopija BIOS-a.

Ovako počinje da se izvršava BIOS kod. Prvo, BIOS traži uređaj sa kojeg će se pokrenuti unaprijed određenim redoslijedom. Traženje čarobnog broja koji određuje da li se uređaj može pokrenuti (511. i 512. bajt prvog sektora treba da bude jednak 0xAA55).

Kada BIOS pronađe uređaj za pokretanje, on kopira sadržaj prvog sektora uređaja u RAM, počevši od fizičke adrese. 0x7c00; zatim skače na adresu i izvršava učitani kod. Ovaj kod se zove bootloader.

Bootloader učitava kernel na fizičkoj adresi 0x100000. Ova adresa se koristi kao početna adresa u svim velikim kernelima na x86 sistemima.

Svi x86 procesori pokreću se u jednostavnom 16-bitnom načinu rada realni mod. GRUB bootloader prebacuje način rada na 32-bitni zaštićeni način rada, postavljajući donji bit registra CR0 na 1 . Dakle, kernel se pokreće u 32-bitnom zaštićenom modu.

Imajte na umu da u slučaju Linux kernela, GRUB vidi dnevnike pokretanja Linuxa i učitava kernel u stvarnom načinu rada. Kernel automatski prelazi u zaštićeni način rada.

Šta nam treba?

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

Postavite ulaznu tačku u asembleru

Koliko god da se ne bih ograničavao na jedan C, morat će se nešto napisati na asembleru. Napisaćemo mali fajl na njemu koji će poslužiti kao početna tačka za naše kernel. Sve što će učiniti je pozvati eksternu funkciju napisanu u C-u i zaustaviti tok programa.

Kako možemo biti sigurni da je ovaj kod upravo početna tačka?

Koristit ćemo skriptu za povezivanje koja povezuje objektne datoteke za kreiranje konačnog izvršnog fajla. U ovoj skripti ćemo eksplicitno naznačiti da želimo učitati podatke na 0x100000.

Evo asemblerskog koda:

;;kernel.asm bits 32 ;nasm direktiva - 32-bitni odjeljak .text globalni početak extern kmain ;kmain je definiran u c fajlu start: cli ;block prekida mov esp, stack_space ;set pokazivač steka poziv kmain hlt ;zaustavite odjeljak CPU .bss resb 8192 ;8KB za stack_space:

Prva instrukcija, bitovi 32, nije x86 asemblerska instrukcija. Ovo je direktiva NASM asembleru koja specificira generiranje koda za procesor koji radi u 32-bitnom modu. U našem slučaju to nije neophodno, ali općenito korisno.

Odjeljak koda počinje u drugom redu.

global je još jedna NASM direktiva koja čini simbole izvornog koda globalnim. Na ovaj način linker zna gdje se nalazi početni simbol - naša ulazna tačka.

kmmain je funkcija koja će biti definirana u kernel.c datoteci. extern znači da je funkcija deklarirana negdje drugdje.

Zatim dolazi start funkcija, koja poziva kmmain funkciju i zaustavlja procesor pomoću hlt instrukcije. Zbog toga unaprijed deaktiviramo prekide pomoću cli instrukcije.

U idealnom slučaju, trebamo dodijeliti nešto memorije i pokazati na nju pomoću pokazivača steka (esp). Međutim, izgleda da je GRUB to već uradio za nas. Međutim, i dalje ćete dodijeliti nešto prostora u BSS sekciji i pomjeriti pokazivač steka na njegov početak. Koristimo resb instrukciju, koja rezerviše određeni broj bajtova. Neposredno prije pozivanja kmmain-a, pokazivač steka (esp) je postavljen na ispravnu lokaciju pomoću mov instrukcije.

Kernel u C

U kernel.asm smo pozvali funkciju kmmain(). Dakle, naš "sish" kod bi trebao započeti izvršavanje sa kmin() :

/* * kernel.c */ void kmmain(void) ( const char *str = "moje prvo jezgro"; char *vidptr = (char*)0xb8000; //video mem počinje ovdje. unsigned int i = 0; unsigned int j = 0; /* ova petlja briše ekran * ima 25 redova svaki od 80 kolona; svaki element zauzima 2 bajta */ dok (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; }

Sve što će naš kernel uraditi je da očisti ekran i odštampa string "moj prvi kernel".

Prvo, kreiramo vidptr pokazivač koji pokazuje na adresu 0xb8000. Sa ove adrese, u zaštićenom režimu, počinje "video memorija". Za prikaz teksta na ekranu rezervišemo 25 redova od 80 ASCII znakova, počevši od 0xb8000.

Svaki znak se ne prikazuje sa uobičajenih 8 bita, već sa 16. Sam karakter se čuva u prvom bajtu, a bajt atributa u drugom. Opisuje formatiranje karaktera, kao što je njegova boja.

Za izlaz zelenog znaka s na crnoj pozadini, upisujemo ovaj znak u prvi bajt i vrijednost 0x02 u drugi. 0 znači crnu pozadinu, 2 znači zelenu boju teksta.

Evo tabele boja:

0 - crna, 1 - plava, 2 - zelena, 3 - cijan, 4 - crvena, 5 - magenta, 6 - smeđa, 7 - svijetlo siva, 8 - tamno siva, 9 - svijetloplava, 10/a - svijetlo zelena, 11/b - svijetlo cijan, 12/c - svijetlocrvena, 13/d - svijetlo magenta, 14/e - svijetlo smeđa, 15/f - bijela.

U našem kernelu ćemo koristiti svijetlo sivi tekst na crnoj pozadini, tako da će naš bajt atribut biti 0x07.

U prvoj petlji program prikazuje prazan znak preko cijele zone 80x25. Ovo će obrisati ekran. U sljedećem ciklusu, znakovi iz stringa koji je završen nulom "moje prvo jezgro" sa bajtom atributa jednakim 0x07 upisuju se u "video memoriju". Ovo će ispisati niz na ekran.

Spojni dio

Moramo izgraditi kernel.asm u objektni fajl koristeći NASM; zatim koristeći GCC za kompajliranje kernel.c u drugi objektni fajl. Zatim ih treba priključiti na izvršno jezgro za pokretanje.

Da bismo to učinili, koristit ćemo skriptu za povezivanje koja se prosljeđuje ld kao argument.

/* * link.ld */ OUTPUT_FORMAT(elf32-i386) ULAZ(početak) SEKCIJE ( . = 0x100000; .text: ( *(.text) ) .data: ( *(.data) ) .bss: ( *( .bss) ) )

Prvo ćemo postaviti izlazni format kao 32-bitni izvršni format koji se može povezati (ELF). ELF je standardni binarni format datoteke za x86 Unix sisteme. ULAZ uzima jedan argument koji specificira ime simbola koji je ulazna tačka. SECTIONS je najvažniji dio. Definira oznaku naše izvršne datoteke. Određujemo kako bi različite sekcije trebale biti povezane i gdje ih postaviti.

U zagradama nakon SECTIONS, tačka (.) prikazuje brojač položaja, koji je zadana vrijednost 0x0. Može se promijeniti, što mi radimo.

Pogledajte sljedeći red: .text: ( *(.text) ) . Zvjezdica (*) je poseban znak koji odgovara bilo kojem imenu datoteke. Izraz *(.text) označava sve .text sekcije iz svih ulaznih datoteka.

Dakle, povezivač spaja sve sekcije koda objektnih datoteka u jedan odeljak izvršne datoteke na adresi brojača pozicija (0x100000). Nakon toga, vrijednost brojača će postati jednaka 0x100000 + veličina primljenog odjeljka.

Slično, sve se dešava i sa drugim sekcijama.

grub i multiboot

Sada su svi fajlovi spremni za kreiranje kernela. Ali ostao je još jedan korak.

Postoji standard za dizanje x86 kernela pomoću pokretača koji se zove Specifikacija za višestruko pokretanje. GRUB će učitati naše kernel samo ako ispunjava ove specifikacije.

Nakon njih, kernel mora sadržavati zaglavlje u svojih prvih 8 kilobajta. Osim toga, ovo zaglavlje mora sadržavati 3 polja, koja su 4 bajta:

  • magično polje: sadrži magični broj 0x1BADB002 da identifikuju jezgro.
  • polje zastave: ne treba nam, postaviti na nulu.
  • polje kontrolna suma: ako ga dodate na prethodna dva, trebalo bi da dobijete nulu.

Naš kernel.asm će postati ovakav:

;;kernel.asm ;nasm direktiva - 32 bita 32 sekcija .text ;multiboot spec align 4 dd 0x1BADB002 ;magic dd 0x00 ;zastavice dd - (0x1BADB002 + 0x00) ;checksum. m+f+c bi trebao biti nula globalni početak extern kmain ;kmain je definiran u startu datoteke c: cli ;blok prekida mov esp, stack_space ;postavi pokazivač steka poziv kmmain hlt ;zaustavi odjeljak CPU .bss resb 8192 ;8KB za stog stack_space:

Izgradnja jezgra

Sada ćemo kreirati objektne datoteke iz kernel.asm i kernel.c i povezati ih pomoću naše skripte.

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

Ova linija će pokrenuti asembler za kreiranje kasm.o objektne datoteke u ELF-32 formatu.

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

Opcija "-c" osigurava da se skriveno povezivanje ne dogodi nakon kompilacije.

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

Ovo će pokrenuti linker sa našom skriptom i kreirati izvršnu datoteku pod nazivom kernel.

Postavite grub i pokrenite kernel

GRUB zahtijeva da ime kernela odgovara uzorku kernela- . Zato preimenujte kernel. Nazvao sam svoje kernel-701.

Sada ga stavite u imenik /boot. Ovo će zahtijevati prava superkorisnika.

U GRUB konfiguracijskoj datoteci grub.cfg dodajte sljedeće:

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

Ne zaboravite da uklonite direktivu hiddenmenu ako postoji.

Ponovo pokrenite računar i videćete listu kernela uključujući i vaš. Odaberite ga i vidjet ćete:

Operativni sistem sličan UNIX-u zanimljiv je za raščlanjivanje, kao i za pisanje sopstvenog kernela koji će štampati poruku. Pa, hoćemo li pisati?

Operativni sistem sličan UNIX-u i x86 pokretanje mašine

Šta je operativni sistem sličan UNIX-u? To je OS kreiran pod uticajem UNIX-a. Ali prije nego što krenemo u pisanje kernela za njega, hajde da vidimo kako se mašina pokreće i predaje kontrolu kernelu.

Većina registara x86 procesora ima dobro definirane vrijednosti nakon uključivanja. Registar pokazivača instrukcija (EIP) sadrži memorijsku adresu za instrukciju koju će izvršiti procesor. EIP je tvrdo kodiran na 0xFFFFFFF0. Dakle, procesor ima jasne instrukcije na fizičkoj adresi 0xFFFFFFFF0, što je, u stvari, zadnjih 16 bajtova 32-bitnog adresnog prostora. Ova adresa se zove vektor resetovanja.

Memorijska mapa čipseta sada osigurava da je 0xFFFFFFF0 mapiran na određeni dio BIOS-a, a ne na RAM. U međuvremenu, BIOS se kopira u RAM radi bržeg pristupa. Ovo se zove sjenčanje. Adresa 0xFFFFFFF0 će sadržati samo instrukciju za skok na adresu u memoriji na koju se BIOS kopirao.

Tako BIOS kod počinje da se izvršava. BIOS prvo traži uređaj za pokretanje prema konfiguriranom redoslijedu uređaja za pokretanje. Traži određeni magični broj da odredi da li se uređaj može pokrenuti ili ne (bajtovi 511 i 512 prvog sektora su 0xAA55).

Nakon što BIOS detektuje uređaj za pokretanje, on kopira sadržaj prvog sektora uređaja u RAM, počevši od fizičke adrese 0x7c00; zatim skače na adresu i izvršava kod koji je upravo učitan. Ovaj kod se zove bootloader.

Bootloader zatim učitava kernel na fizičkoj adresi 0x100000. Adresa 0x100000 se koristi kao početna adresa za sve velike kernele na x86 mašinama.

Svi x86 procesori pokreću se u pojednostavljenom 16-bitnom modu koji se zove realni adresni način. GRUB bootloader se prebacuje na 32-bitni zaštićeni način postavljanjem niskog bita CR0 registra na 1. Tako se kernel pokreće u 32-bitni zaštićeni način.

Imajte na umu da ako se pronađe Linux kernel, GRUB će dobiti dnevnik pokretanja i učitati Linux kernel u stvarnom načinu rada. I Linux kernel će se prebaciti u zaštićeni način rada.

Šta će nam trebati?

  • x86 računar (naravno)
  • NASM asembler
  • ld (GNU Linker)
  • Izvor

Pa, bilo bi lijepo imati ideju o tome kako funkcionira OS sličan UNIX-u. Izvorni kod se može naći u Github repozitoriju.

Ulazna tačka i pokretanje kernela

Za početak ćemo napisati mali fajl u x86 asembleru, koji će biti početna tačka za pokretanje kernela. Ova datoteka će pozvati eksternu C funkciju i zatim zaustaviti tok programa.

Kako osigurati da će ovaj kod poslužiti kao početna tačka za kernel?

Koristićemo linker skriptu koja povezuje objektne datoteke kako bismo kreirali konačnu izvršnu datoteku kernela. U ovoj skripti izričito navodimo da binarnu datoteku treba učitati na 0x100000. Ova adresa je mjesto gdje bi kernel trebao biti.

Evo koda za sklapanje:

;;kernel.asm bitovi 32 ;direktiva nasm - 32-bitni odjeljak .text globalni početak ekstern kmain ;kmain definiran u C-file start: cli ;block prekida mov esp, stack_space ;set pokazivača steka poziv kmain hlt ;stop procesorsku sekciju .bss resb 8192 ;8KB po stogu stack_space:

Prva instrukcija 32 bita nije instrukcija za sastavljanje x86. Ovo je direktiva za NASM asembler koja navodi da treba generirati kod za pokretanje na procesoru koji radi u 32-bitnom modu. Ovo nije nužno potrebno u našem primjeru, ali je dobra praksa eksplicitno navesti takve stvari.

Drugi red počinje odeljkom teksta. Ovdje ćemo smjestiti sav naš kod.

global je još jedna NASM direktiva, koja se koristi za postavljanje simbola izvornog koda kao globalnih.

kmmain je izvorna funkcija koja će biti definirana u našoj kernel.c datoteci. extern izjavljuje da je funkcija definirana negdje drugdje.

Funkcija start poziva funkciju kmin i zaustavlja CPU naredbom hlt. Prekidi mogu probuditi CPU od izvršavanja hlt instrukcije. Stoga prvo deaktiviramo prekide pomoću cli instrukcije.

U idealnom slučaju, trebali biste dodijeliti malo memorije za stek i pokazati na njega pomoću pokazivača steka (esp). Međutim, GRUB to radi umjesto nas, a pokazivač steka je već postavljen. Međutim, da bismo bili sigurni, dodijelit ćemo nešto prostora u BSS sekciji i postaviti pokazivač steka na početak dodijeljene memorije. Da bismo to učinili, koristimo naredbu resb, koja rezervira memoriju u bajtovima. Nakon toga ostaje oznaka koja pokazuje na rub rezerviranog memorijskog fragmenta. Prije pozivanja kmmain-a, pokazivač steka (esp) se koristi za specificiranje ovog prostora pomoću naredbe mov.

Kernel u C

U kernel.asm smo pozvali funkciju kmmain(). Dakle, C kod će početi da se izvršava u kmmain():

/* * kernel.c */ void kmmain(void) ( const char *str = "moje prvo jezgro"; char *vidptr = (char*)0xb8000; //video memorija počinje ovdje unsigned int i = 0; unsigned int j = 0; /* ova petlja briše ekran */ 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; }

*kernel.c

void kmmain (void )

const char * str = "moj prvi kernel" ;

unsigned int i = 0 ;

unsigned int j = 0 ;

/* ova petlja briše ekran */

dok (j< 80 * 25 * 2 ) {

/* prazan znak */

vidptr[j] = "";

/* bajt atributa */

vidptr[ j + 1 ] = 0x07 ;

j = j + 2

j = 0

/* ova petlja upisuje string u video memoriju */

dok (str [ j ] != "\0" ) (

/* ascii mapiranje */

vidptr [ i ] = str [ j ] ;

vidptr [ i + 1 ] = 0x07 ;

i = i + 2 ;

povratak;

Naš kernel će obrisati ekran i prikazati string "moj prvi kernel" na njemu.

Prvo, kreiramo vidptr pokazivač koji pokazuje na adresu 0xb8000. Ova adresa je početak video memorije u zaštićenom načinu rada. Memorija teksta na ekranu je samo komadić memorije u našem adresnom prostoru. I/O za ekran na memorijskoj kartici počinje od 0xb8000 i podržava 25 redova od po 80 ascii znakova.

Svaki karakterni element u ovoj tekstualnoj memoriji predstavljen je sa 16 bitova (2 bajta), a ne sa 8 bitova (1 bajt) na koje smo navikli. Prvi bajt mora imati prikaz karaktera, kao u ASCII. Drugi bajt je bajt atributa. Opisuje formatiranje znaka, uključujući različite atribute kao što je boja.

Za štampanje zelenog znaka na crnoj pozadini, pohranjujemo znak s u prvi bajt adrese video memorije i vrijednost 0x02 u drugi bajt.

0 je crna pozadina, a 2 zelena.

Ispod je tabela kodova za različite boje:

0 - crna, 1 - plava, 2 - zelena, 3 - cijan, 4 - crvena, 5 - magenta, 6 - smeđa, 7 - svijetlo siva, 8 - tamno siva, 9 - svijetloplava, 10/a - svijetlo zelena, 11/b - svijetlo cijan, 12/c - svijetlocrvena, 13/d - svijetlo magenta, 14/e - svijetlo smeđa, 15/f - bijela.

0 - crna , 1 - plava , 2 - zelena , 3 - cijan , 4 - crvena , 5 - magenta , 6 - smeđa, 7 - svijetlo siva, 8 - tamno siva, 9 - svijetlo plava, 10 / a - svijetlo zelena, 11/b - svijetlo cijan, 12/c - svijetlocrvena, 13/d - svijetlo magenta, 14/e - svijetlo smeđa, 15/f – bijela.

U našem jezgru koristit ćemo svijetlosive znakove na crnoj pozadini. Dakle, naš bajt atributa bi trebao biti 0x07.

U prvoj while petlji, program upisuje nulti karakter sa atributom 0x07 u svih 80 kolona od 25 redova. Tako se ekran briše.

U drugoj while petlji, znakovi niza "moj prvi kernel" se upisuju u dio video memorije. Za svaki znak, bajt atributa sadrži vrijednost 0x07.

Tako će linija biti prikazana na ekranu.

Spojni dio

Ugrađujemo kernel.asm i NASM u objektnu datoteku, a zatim koristimo GCC za prevođenje kernel.c u drugu objektnu datoteku. Sada je naš zadatak da povežemo ove objekte sa izvršnim boot kernelom.

Da bismo to učinili, koristimo eksplicitnu skriptu povezivača koja se može proslijediti kao argument ld (naš linker).

/* * link.ld */ OUTPUT_FORMAT(elf32-i386) ULAZ(početak) SEKCIJE ( . = 0x100000; .text: ( *(.text) ) .data: ( *(.data) ) .bss: ( *( .bss) ) )

*link.ld

OUTPUT_FORMAT (elf32 - i386)

ULAZ (početak)

SECTIONS

0x100000 ;

Tekst : ( * (. tekst ) )

Podaci : ( * (. podaci ) )

Bss : ( * (.bss ) )

Prvo, postavljamo izlazni format izvršne datoteke na 32-bitnu izvršnu datoteku (ELF). ELF je standardni binarni format datoteke za Unix-like x86 sisteme.

ENTRY uzima jedan argument. On specificira ime simbola koji bi trebao biti ulazna tačka našeg izvršnog fajla.

SECTIONS je najvažniji dio gdje definiramo oznaku izvršne datoteke. Ovo specificira kako se različite sekcije trebaju kombinirati i gdje će biti postavljene.

U vitičastim zagradama nakon naredbe SECTIONS, znak tačke (.) predstavlja brojač lokacije.

Brojač lokacija je uvijek inicijaliziran na 0x0 na početku bloka SECTIONS. Može se promijeniti dodjeljivanjem nove vrijednosti.

Kao što je već spomenuto, kod kernela mora početi na adresi 0x100000. Dakle, postavili smo brojač lokacije na 0x100000.

Pogledaj sljedeći red .text: (*(.text))

Zvjezdica (*) je poseban znak koji će odgovarati bilo kojem imenu datoteke. To jest, izraz *(.text) označava sve dijelove input.text iz svih ulaznih datoteka.

Dakle, linker spaja sve tekstualne sekcije objektnih datoteka u tekstualni dio izvršne datoteke na adresi pohranjenoj u brojaču lokacija. Odeljak koda izvršnog fajla počinje sa 0x100000.

Nakon što povezivač postavi odjeljak za tekstualni izlaz, vrijednost brojača lokacije je postavljena na 0x1000000 + veličina odjeljka za izlaz teksta.

Isto tako, podaci i bss sekcije se kombinuju i stavljaju na vrednosti brojača lokacija.

grub i multiboot

Sada su sve datoteke potrebne za izgradnju kernela spremne. Ali pošto nameravamo da pokrenemo kernel koristeći GRUB, postoji još jedna stvar koja treba da se uradi.

Postoji standard za dizanje različitih x86 kernela koristeći bootloader koji se zove Multiboot specifikacija.

GRUB će učitati kernel samo ako ispunjava Multiboot specifikaciju.

Prema njenim riječima, kernel mora sadržavati zaglavlje unutar svojih prvih 8 kilobajta.

Osim toga, ovo zaglavlje mora sadržavati 3 dodatna polja:

  • Polje magičnog broja: sadrži magični broj 0x1BADB002, za identifikaciju zaglavlja.
  • flags polje: ne treba nam sada, samo postavite njegovu vrijednost na nulu.
  • Polje kontrolne sume: kada je dato, mora vratiti nulu za sumu sa prva dva polja.

Dakle, kernel.asm će izgledati ovako:

;;kernel.asm ;nasm direktiva - 32 bita 32 sekcija .text ;multiboot spec align 4 dd 0x1BADB002 ;magični brojevi dd 0x00 ;dd zastavice - (0x1BADB002 + 0x00) ;kontrolna suma. mh+f+ks mora biti nula globalno start extern kmain ;kmain definiran u vanjskom startu datoteke: cli ;blok prekida mov esp, stack_space ;poziv pokazivača steka kmmain hlt ;stop procesor sekcija .bss resb 8192 ;8KB po steku stack_space:

; ; kernel. asm

; nasm direktiva - 32 bit

bitovi 32

odjeljak. tekst

; multiboot spec

poravnati 4

dd 0x1BADB002 ; magični brojevi

dd 0x00 ; zastave

dd - (0x1BADB002 + 0x00 ) ; ček suma. mh+ f+ ks bi trebao biti nula

globalni početak

extern kmmain ; kmmain je definiran u vanjskom fajlu

početak:

cli ; blokiranje prekida

mov esp , stog _ prostor; pokazivač steka

pozovite kmmain

hlt ; zaustavljanje procesora

Kada počnete čitati priručnike za promociju web stranice, uvijek sve počinje stvaranjem semantičke jezgre. Za početnike je ovaj prvi korak najteži. Pored toga što nije odmah jasno šta je ovo semantičko jezgro, nije jasno ni koju svrhu ima i kako ga pravilno kreirati.

U ovom članku ćemo govoriti o tome kako pravilno kreirati semantičku jezgru stranice. Takođe ćete naučiti šta je to i zašto se pravi. Zapravo, nema ničeg kompliciranog i teškog u konceptu semantičkog jezgra. Hajde da to shvatimo.

Na pitanje šta je semantičko jezgro, niko još nije odgovorio tako jednostavnim riječima kao što ćemo to sada učiniti. Dakle, semantičko jezgro stranice je lista ključnih fraza pomoću kojih će se promovirati. Sve! Cijelo značenje pojma u jednoj kratkoj jasnoj rečenici. I nema potrebe da išta mešate pametnim terminima.

Ako uđete dublje u pojam, onda je semantika nauka koja se bavi semantičkim sadržajem leksičkih jedinica. Jednostavno rečeno, semantika je proučavanje značenja nečega. U SEO-u, semantičko jezgro jasno daje do znanja značenje cijele stranice, njenog odjeljka ili jednog članka. Ovo postaje jasno pretraživaču, posetiocu, svim programerima koji će raditi sa sajtom.

Semantičko jezgro je, bez pretjerivanja, temelj svake promocije.

Kako koristiti semantičko jezgro i čemu služi

Funkcije semantičkog jezgra uključuju sljedeće aspekte promocije web stranice:

  • Najvažniji zadatak semantičkog jezgra je razumijevanje strukture stranice i njenog sadržaja. Gledajući ga, možete zamisliti koje će dijelove stranica imati i koji će članci biti u svakoj sekciji. Tako su svi nedostaci i neugodnosti konstrukcije odmah vidljivi i mogu se otkloniti u ranoj fazi.
  • Semantika postavlja vektor sadržaja. Zahvaljujući boljem razumijevanju strukture stranice, možete odabrati najrelevantnije i najefikasnije ključne fraze.
  • Semantičko jezgro je plan sadržaja stranice za dugi niz godina. Svaki put kada trebate pisati članke, možete pogledati tamo i vidjeti koji sadržaj je planiran i u kojem dijelu stranice bi trebao biti.
  • Ako se planira plaćena promocija web stranice, na primjer, zbog kontekstualnog oglašavanja, tada zahvaljujući semantičkoj jezgri možete izračunati cijenu promocije.

Kako napraviti semantičko jezgro

Prvo morate odlučiti gdje ćete uzeti ključne fraze za jezgro. Najbolji izvor za početnike je usluga Yandex WordPStat, koja pokazuje koliko je puta mjesečno ovaj ili onaj upit unet u Yandex pretragu. WordStat ima niz korisnih funkcija, kao što je filtriranje upita po regionu ili uređaju, pregled povezanih upita i još mnogo toga. I što je najvažnije, potpuno je besplatno. Više o tome.

Možete koristiti razne plaćene programe, ali za početnike je WordStat prikladniji, s obzirom na njegovu jednostavnost. Osim toga, pogodan je ne samo za Runet, gdje prevladava Yandex. Ako promovirate web lokaciju unutar CIS-a, onda je možete bezbedno koristiti, a Google statistika će biti otprilike ista.

Glavna suština stvaranja semantičke jezgre je skup ključnih fraza koje se na neki način uklapaju u temu stranice. Treba ih nekako formalizirati, sistematizirati. Tabele kao što su Excel, Google Doc Spreadsheets ili slične rade najbolje za ovo.

A za veću efikasnost, dodatne kolone se mogu dodati u tabelu semantičkog jezgra:

  • Naravno, trebalo bi da postoji kolona sa najključnijim izrazom.
  • Naravno, kolona s nazivom naslova stranice u kojoj će se koristiti ova fraza.
  • Možete dodati kolonu sa meta tagovima naslova i opisa i odmah napisati naslov i opis članka koristeći datu ključnu riječ. Prvo, odmah će vam biti jasno o čemu pisati članak, a drugo, onda nećete morati da se mučite i smišljate.
  • Možete napraviti kolonu da označite broj znakova u članku za datu ključnu frazu kako biste bolje razumjeli plan sadržaja.
  • Ako govorimo o promociji uz kontekstualno oglašavanje, potrebno je za svaki zahtjev dodati cijenu oglašavanja.
  • Sve što je potrebno može se bezbedno upisati u tabelu sematskog kernela. Ne postoji šablon za ovo, tako da tamo možete raditi šta god želite i zgodno.

Uobičajene greške pri kreiranju semantičkog jezgra

Sada znate kako pravilno kreirati semantičku jezgru stranice. Hajde na kraju da razmotrimo koje uobičajene greške prave optimizatori početnici.

  • Ako jezgro predviđa podelu lokacije na kategorije, onda je uobičajena greška stvaranje dubokih nivoa ugniježđenja. Drugi nivo se preporučuje i ne dalje. Odnosno, možete napraviti naslov, podnaslov i to je to, ne možete ga više dijeliti na manje naslove.
  • Početnici mogu zanemariti niskofrekventne zahtjeve, jer smatraju da ih nije prikladno koristiti, oni ipak neće donijeti mnogo prometa. Ali u stvari je obrnuto. Za novu stranicu, potrebni su upravo upiti niske frekvencije, niske konkurentnosti.
  • Ne možete u potpunosti vjerovati servisu koji će se koristiti za izdvajanje ključnih fraza. I upravo to rade novajlije. Mašine mogu pogriješiti i izabrati pogrešnu za vas.
  • Nema potrebe da kreirate članak zbog ključne fraze. Ako pronađete izraze "hitno prodajte kuću" i "brzo prodajte kuću", onda nema smisla za njih praviti dva različita članka.

Ova serija članaka posvećena je programiranju niskog nivoa, odnosno računarskoj arhitekturi, dizajnu operativnog sistema, programiranju na asembleru i srodnim oblastima. Do sada se pisanjem bave dva habrauzera - i. Za mnoge srednjoškolce, studente i profesionalne programere ove se teme ispostavljaju kao veoma teške za učenje. Postoji mnogo literature i kurseva posvećenih programiranju niskog nivoa, ali je od njih teško dobiti potpunu i sveobuhvatnu sliku. Teško je, nakon čitanja jedne ili dvije knjige o asembleru i operativnim sistemima, zamisliti barem općenito kako ovaj složeni sistem željeza, silicija i mnogih programa – kompjuter – zapravo funkcionira.

Svako rješava problem učenja na svoj način. Neko čita mnogo literature, neko pokušava da usput brzo pređe na praksu i razume, neko pokušava da objasni prijateljima sve što uči. I odlučili smo da kombinujemo ove pristupe. Dakle, u ovom kursu članaka ćemo pokazati korak po korak kako napisati jednostavan operativni sistem. Članci će biti preglednog karaktera, odnosno neće sadržavati iscrpne teorijske informacije, međutim, uvijek ćemo nastojati dati linkove na dobre teorijske materijale i odgovoriti na sva pitanja koja se pojave. Nemamo jasan plan, pa ćemo usput donijeti mnoge važne odluke, uzimajući u obzir vaše povratne informacije.

Možemo namjerno odvesti proces razvoja u ćorsokak kako bismo vama i sebi omogućili da u potpunosti shvatimo posljedice pogrešne odluke, kao i da usavršimo neke tehničke vještine na tome. Zato nemojte naše odluke uzimati kao jedine istinite i slijepo nam vjerovati. Još jednom naglašavamo da očekujemo od čitatelja da budu aktivni u diskusiji o člancima, što bi u velikoj mjeri trebalo da utiče na ukupan proces izrade i pisanja narednih članaka. U idealnom slučaju, voleo bih da se neko od čitalaca pridruži razvoju sistema tokom vremena.

Pretpostavićemo da je čitalac već upoznat sa osnovama asemblerskih i C jezika, kao i elementarnim konceptima računarske arhitekture. Odnosno, nećemo objašnjavati šta je registar ili, recimo, RAM. Ako vam nedostaje znanja, uvijek se možete obratiti dodatnoj literaturi. Kratka lista referenci i linkovi na sajtove sa dobrim člancima nalaze se na kraju članka. Također je poželjno biti u mogućnosti koristiti Linux, jer će sva uputstva za kompilaciju biti data za ovaj sistem.

A sada - bliže stvari. U ostatku članka, ti i ja ćemo napisati klasični "Hello World" program. Naš Halloweenworld će biti malo specifičan. Neće se pokretati ni sa jednog operativnog sistema, već direktno, da tako kažemo "na goli metal". Pre nego što pređemo direktno na pisanje koda, hajde da shvatimo kako to tačno pokušavamo da uradimo. A za ovo morate uzeti u obzir proces pokretanja računara.

Dakle, uzmite svoj omiljeni računar i pritisnite najveće dugme na sistemskoj jedinici. Vidimo veseli čuvar ekrana, sistemska jedinica radosno škripi zvučnikom, a nakon nekog vremena se operativni sistem učitava. Kao što razumijete, operativni sistem je pohranjen na tvrdom disku i ovdje se postavlja pitanje: kako se operativni sistem magično pokrenuo u RAM i počeo raditi?

Znajte ovo: sistem koji se nalazi na bilo kom računaru je odgovoran za to, i zove se ne, ne Windows, pipnite jezikom - zove se BIOS. Njegovo ime je skraćenica za Basic Input-Output System, odnosno osnovni ulazno-izlazni sistem. BIOS se nalazi na malom mikrokolu na matičnoj ploči i pokreće se odmah nakon pritiska na veliko dugme ON. BIOS ima tri glavna zadatka:

  1. Otkrijte sve povezane uređaje (procesor, tastaturu, monitor, RAM, video karticu, glavu, ruke, krila, noge i repove...) i testirajte ih na funkcionalnost. Za to je odgovoran program POST (Power On Self Test). Ako se vitalni hardver ne pronađe, onda nikakav softver neće moći pomoći, a u ovom trenutku sistemski zvučnik će zaškripati nešto zlokobno i uopće neće doći do OS-a. Hajde da ne pričamo o tužnim stvarima, pretpostavimo da imamo potpuno ispravan računar, radujmo se i pređimo na razmatranje druge funkcije BIOS-a:
  2. Omogućavanje operativnom sistemu osnovnog skupa funkcija za rad sa gvožđem. Na primjer, putem BIOS funkcija možete prikazati tekst na ekranu ili čitati podatke sa tastature. Zbog toga se naziva osnovnim ulazno-izlaznim sistemom. Operativni sistem obično pristupa ovim funkcijama putem prekida.
  3. Pokretanje učitavača operativnog sistema. U ovom slučaju, u pravilu se čita sektor za pokretanje - prvi sektor nosača informacija (flopi disk, tvrdi disk, CD, fleš disk). Redosled prozivanja medija može se postaviti u BIOS SETUP. Sektor za pokretanje sadrži program koji se ponekad naziva primarni pokretač. Grubo govoreći, zadatak bootloadera je da pokrene operativni sistem. Proces učitavanja operativnog sistema može biti vrlo specifičan i u velikoj mjeri ovisi o njegovim karakteristikama. Stoga, primarni loader pišu direktno programeri OS-a i upisuje se u sektor za pokretanje tokom instalacije. Kada se pokretač pokrene, procesor je u stvarnom načinu rada.
Tužna vijest: veličina bootloadera bi trebala biti samo 512 bajtova. Zašto tako malo? Da bismo to učinili, moramo se upoznati s uređajem diskete. Evo edukativne slike:

Na slici je prikazana površina disk jedinice. Disketa ima 2 površine. Na svakoj površini nalaze se prstenaste staze (trake). Svaka staza je podijeljena na male dijelove u obliku luka koji se nazivaju sektori. Dakle, istorijski gledano, sektor diskete ima veličinu od 512 bajtova. Prvi sektor na disku, boot sektor, BIOS čita u nulti memorijski segment na ofsetu 0x7C00, a zatim se kontrola prenosi na ovu adresu. Boot loader obično ne učitava sam OS u memoriju, već drugi bootloader program pohranjen na disku, ali iz nekog razloga (najvjerovatnije, razlog je veličina) koji se ne uklapa u jedan sektor. A pošto do sada ulogu našeg OS-a igra banalan helloworld, naš glavni cilj je da kompjuter vjeruje u postojanje našeg OS-a, čak i ako je na jednom sektoru, i pokreće ga.

Kako je uređen boot sektor? Na PC-u, jedini zahtjev za sektor za pokretanje je da njegova posljednja dva bajta sadrže vrijednosti 0x55 i 0xAA, potpis sektora za pokretanje. Dakle, već je manje-više jasno šta treba da radimo. Hajde da napišemo kod! Gornji kod je napisan za yasm asembler.

odjeljak. tekst

upotreba16

org 0x7C00 ; naš program je učitan na 0x7C00

početak:

mov ax , cs

mov ds , ax ; odaberite segment podataka



mov si , poruka

cld ; smjer za string komande

mov ah , 0x0E ; Broj funkcije BIOS-a

mov bh , 0x00 ; stranica video memorije

puts_loop:

lodsb ; učitati sljedeći znak u al

test al , al ; null karakter znači kraj niza

jz puts_loop_exit

int 0x10 ; pozivanje funkcije BIOS-a

jmp puts_loop

puts_loop_exit:

jmp$; vječni ciklus



poruka:

db "Hello World!" 0

završiti:

puta 0x1FE - završetak + početak db 0

db 0x55 , 0xAA ; potpis sektora za pokretanje

Ovaj kratki program zahtijeva niz važnih objašnjenja. org 0x7C00 linija je potrebna kako bi asembler (što znači program, a ne jezik) ispravno izračunao adrese za oznake i varijable (puts_loop, puts_loop_exit, message). Tako da mu kažemo da će se program učitati u memoriju na 0x7C00.
U redovima
mov ax , cs

mov ds , ax
segment podataka (ds) je postavljen jednak segmentu koda (cs), pošto su u našem programu i podaci i kod pohranjeni u istom segmentu.

Tada se u petlji prikazuje poruka "Hello World!", znak po znak. Za to se koristi funkcija 0x0E prekida 0x10. Ima sljedeće opcije:
AH = 0x0E (broj funkcije)
BH = broj video stranice (nemojte se još mučiti, označite 0)
AL = ASCII kod karaktera

Na liniji "jmp $" program visi. I s pravom, nema potrebe da ona izvršava dodatni kod. Međutim, da bi računar ponovo radio, moraćete da ga ponovo pokrenete.

U redu " puta 0x1FE-završetak+start db 0 ", ostatak programskog koda (osim posljednja dva bajta) je popunjen nulama. Ovo se radi tako da se nakon kompilacije potpis sektora za pokretanje pojavi u zadnja dva bajta programa.

Nekako smo shvatili programski kod, sada pokušajmo da kompajliramo ovu sreću. Za kompajliranje nam je, zapravo, potreban asembler - gore spomenuti

Top Related Articles