Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • vijesti
  • Izrada kernela operativnog sustava. Operativni sustav sličan UNIX-u: pisanje kernela u C

Izrada kernela operativnog sustava. Operativni sustav sličan UNIX-u: pisanje kernela u C

Semantička jezgra 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čku jezgru tako da vaša stranica brzo dođe na TOP i ne stagnira mjesecima. Ima i svoje "tajne".

I prije nego što prijeđemo na sastavljanje SY-a, pogledajmo što je to i do čega bismo na kraju trebali doći.

Što je semantička jezgra jednostavnim riječima

Koliko god čudno izgledalo, ali semantička jezgra je obična excel datoteka, koja sadrži popis ključnih upita za koje ćete vi (ili vaš copywriter) pisati članke za stranicu.

Na primjer, ovako izgleda moja semantička jezgra:

Označio sam zelenom bojom one ključne riječi za koje sam već napisao članke. Žuti - oni za koje ću pisati članke u bliskoj budućnosti. I bezbojne stanice - to znači da će na te zahtjeve doći malo kasnije.

Za svaki zahtjev za ključem odredio sam učestalost, istodobnost i osmislio "privlačan" naslov. Trebali biste dobiti otprilike istu datoteku. Sada se moj SN 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).

U nastavku ćemo govoriti o tome za što se pripremiti ako iznenada odlučite naručiti kolekciju semantičke jezgre od stručnjaka. Ovdje ću ukratko reći - dobit ćete isti popis, ali samo za tisuće "ključeva". Međutim, u SA nije važna količina, već kvaliteta. A mi ćemo se usredotočiti na ovo.

Zašto vam je uopće potrebna semantička jezgra?

A zapravo, zašto nam treba ova muka? Uostalom, možete samo napisati kvalitetne članke i time privući publiku, zar ne? Da, možete pisati, ali nećete moći privući.

Glavna pogreška koju čini 90% blogera je samo pisanje visokokvalitetnih članaka. Ne šalim se, imaju jako zanimljiv i koristan sadržaj. Ali tražilice ne znaju za to. Oni nisu vidovnjaci, oni su samo roboti. Sukladno tome, ne stavljaju vaš članak u TOP.

Postoji još jedna suptilna točka ovdje s naslovom. Na primjer, imate vrlo kvalitetan članak na temu „Kako poslovati u „mordo knjizi“. Tamo detaljno i profesionalno opisujete sve o Facebooku. Uključujući kako promovirati tamošnje zajednice. Vaš je članak najkvalitetniji, koristan i zanimljiv članak na ovu temu na internetu. Nitko nije ležao pored tebe. Ali to ti i dalje neće pomoći.

Zašto visokokvalitetni članci lete iz TOP-a

Zamislite da vašu stranicu ne posjećuje robot, već živi inspektor (procjenitelj) iz Yandexa. Shvatio je da imate najzgodniji članak. I rukami vas stavlja na prvo mjesto u rezultatima pretraživanja za zahtjev "Promocija zajednice na Facebooku".

Znate li što se dalje događa? Vrlo brzo ćete odletjeti odande. Jer na vaš članak, čak ni na prvom mjestu, nitko neće kliknuti. Ljudi unose zahtjev “Promocija zajednice na Facebooku”, a vaš naslov je “Kako pravilno poslovati u „mordobook-u”. Originalno, svježe, smiješno, ali ... ne na upit. Ljudi žele vidjeti točno ono što su tražili, a ne vaš kreativac.

Sukladno tome, vaš će članak biti u stanju mirovanja kako bi zauzeo mjesto u TOP SERP-a. A živi procjenitelj, vatreni obožavatelj vaše kreativnosti, može moliti vlasti koliko god žele da vas ostave barem u TOP-10. Ali neće pomoći. Sva prva mjesta zauzet će artikli, prazni, poput ljuski od sjemenki, koje su jedni od drugih prepisivali dojučerašnji školarci.

Ali ovi će članci imati točan "relevantan" naslov - "Promicanje Facebook zajednice od nule" ( korak po korak, u 5 koraka, od A do Z, besplatno itd.) Uvredljivo? Ipak bi. Pa, bori se protiv nepravde. Sastavimo kompetentnu semantičku jezgru kako bi vaši članci zauzeli prva mjesta koja zaslužuju.

Još jedan razlog da odmah počnete izmišljati SJ

Postoji još jedna stvar o kojoj ljudi iz nekog razloga malo razmišljaju. Morate pisati članke često – barem svaki tjedan, a po mogućnosti 2-3 puta tjedno kako biste dobili više prometa i brže.

To svi znaju, ali gotovo nitko to ne radi. A sve zato što imaju "kreativnu stagnaciju", "ni na koji način se ne mogu prisiliti", "samo lijenost". Ali zapravo je cijeli problem upravo u nedostatku specifične semantičke jezgre.

U polje za pretraživanje unio sam jedan od svojih osnovnih ključeva - "smm" i Yandex mi je odmah dao desetak savjeta, što bi još moglo zanimati ljude koje zanima "smm". Moram samo kopirati ove ključeve u bilježnicu. Zatim ću svaki od njih provjeriti na isti način, i prikupiti tragove i za njih.

Nakon prve faze prikupljanja SN-a, trebali biste imati tekstualni dokument u kojem će biti 10-30 širokih osnovnih ključeva, s kojima ćemo dalje raditi.

Korak # 2 - Parsiranje osnovnih ključeva u SlovoEB

Naravno, ako napišete članak na zahtjev "webinar" ili "smm", onda se čudo neće dogoditi. Nikada nećete moći dosegnuti TOP za tako širok zahtjev. Moramo podijeliti 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 web stranice.

Najteže u radu s ovim programom je ispravno ga konfigurirati. Pokazujem kako pravilno konfigurirati i koristiti Slovoeb. Ali u tom članku fokusiram se na odabir ključeva za Yandex Direct.

A ovdje, pogledajmo korak po korak značajke korištenja ovog programa za sastavljanje semantičke jezgre za SEO.

Prvo stvaramo novi projekt i imenujemo ga prema širokom ključu koji želite raščlaniti.

Projektu obično 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 vrlo teško filtrirati "prazne" ključne riječi iz zlatnih zrnaca. Analizirajmo jedan po jedan ključ.

Nakon izrade projekta provodimo osnovnu operaciju. To jest, mi zapravo analiziramo ključ kroz Yandex Wordstat. Da biste to učinili, kliknite na gumb "Vorstat" u sučelju programa, unesite svoj osnovni ključ i kliknite "Pokreni prikupljanje".

Na primjer, analizirajmo osnovni ključ za moj blog "kontekstualnog oglašavanja".

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

Također, uz svaki zahtjev bit će "prljava" učestalost - koliko je puta mjesečno pretraživan ovaj ključ (+ njegovi oblici riječi i repovi) putem Yandexa. Ali ne savjetujem vam da iz ovih brojeva izvodite bilo kakve zaključke.

Korak # 3 - Prikupljanje točnih ključnih frekvencija

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 niti jedan klik mjesečno.

Moramo iznijeti čistu frekvenciju. A da bismo to učinili, prvo odabiremo sve pronađene ključeve s kvačicama, a zatim kliknemo gumb "Yandex Direct" i ponovno pokrenemo postupak. Sada će Slovoeb tražiti točnu učestalost zahtjeva mjesečno za svaki ključ.

Sada imamo objektivnu sliku – koliko su puta u posljednjih mjesec dana korisnici interneta unijeli zahtjev. Sada predlažem grupirati sve ključne upite prema učestalosti, tako da je prikladnije raditi s njima.

Da biste to učinili, kliknite na ikonu "filter" u stupcu "Učestalost"! ", I navedite - za filtriranje ključeva s vrijednošću" manjom ili jednakom 10 ".

Sada će vam program pokazati samo one upite č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 upita. Manje od 10 je jako malo. Pisanje članaka za ove upite je gubljenje vremena.

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

Korak # 4 - Provjera konkurentskih upita

Sve "tipke" na ovom svijetu podijeljene su u 3 vrste: visokofrekventne (HF), srednje frekvencije (MF), niskofrekventne (LF). Oni također mogu biti visoko konkurentni (VC), srednje konkurentni (SK) i nisko konkurentni (NK).

U pravilu, VC zahtjeve istovremeno prima. Odnosno, ako se zahtjev često traži na Internetu, onda postoji mnogo stranica koje ga žele promovirati. Ali to nije uvijek tako, ima sretnih iznimaka.

Umijeće sastavljanja semantičke jezgre leži upravo u pronalaženju takvih upita koji imaju veliku učestalost, a njihova razina konkurencije je niska. Vrlo je teško ručno odrediti razinu natjecanja.

Možete se usredotočiti na pokazatelje kao što su broj glavnih stranica u TOP-10, duljina i kvaliteta tekstova. razina povjerenja i čestice stranica u TOP izdavanja na zahtjev. Sve ovo dat će vam predodžbu o tome koliko je teška bitka za pozicije za ovaj konkretni upit.

Ali preporučam da iskoristite servis Mutagen... Uzima u obzir sve parametre koje sam spomenuo gore, plus još desetak za koje ni vi ni ja vjerojatno nismo ni čuli. Nakon analize, usluga daje točnu vrijednost – kolika je razina konkurencije za ovaj zahtjev.

Ovdje sam provjerio upit "postavljanje kontekstualnog oglašavanja u google adwords". Mutagen nam je pokazao da ovaj ključ ima konkurentnost "više od 25" - to je maksimalna vrijednost koju pokazuje. A ovaj upit ima samo 11 pregleda mjesečno. Tako da nam definitivno ne odgovara.

Možemo kopirati sve ključeve koje smo pokupili u Slovoebu i obaviti skupnu provjeru u Mutagenu. Nakon toga ostaje nam samo pogledati popis i uzeti one zahtjeve koji imaju puno zahtjeva i nisku razinu konkurencije.

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

Inače, na račun razine konkurencije. Ako imate mladu stranicu, onda je bolje odabrati upite s razinom natjecanja od 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 poduzeti posljednji korak, koji će vam omogućiti da privučete puno prometa čak i za zahtjeve niske frekvencije.

Korak # 5 - Skupljanje repova za odabrane ključeve

Kao što je više puta dokazano i provjereno, vaša stranica će primati glavninu prometa ne s glavnih ključeva, već iz takozvanih "repova". To je kada osoba unese čudne ključne riječi u okvir za pretraživanje, s učestalošću 1-2 mjesečno, ali takvih zahtjeva ima puno.

Da biste vidjeli "rep" - samo idite na Yandex i unesite odabranu ključnu riječ u traku za pretraživanje. Evo što ćete otprilike vidjeti.

Sada samo trebate napisati ove dodatne riječi u zasebnom dokumentu i upotrijebiti ih u svom članku. Štoviše, ne morate ih uvijek stavljati pored glavne tipke. Inače će tražilice vidjeti "pretjeranu optimizaciju" i vaši će članci pasti u rezultatima pretraživanja.

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

Na primjer, imamo zahtjev - "Postavljanje kontekstualnog oglašavanja". Evo kako to preformulirati:

  • Prilagodi = prilagoditi, napraviti, izgraditi, pokrenuti, pokrenuti, omogućiti, hostirati ...
  • Kontekstualno oglašavanje = kontekst, izravno, teaser, YAN, adwords, cms. direct, adwords...

Nikada ne znate točno kako će ljudi tražiti informacije. Dodajte sve ove dodatne riječi svojoj semantičkoj jezgri i upotrijebite ih pri pisanju tekstova.

Dakle, prikupljamo popis od 100 - 150 ključnih riječi. Ako vam je ovo prvi put da sastavljate semantičku jezgru, može vam trebati nekoliko tjedana.

Ili možda dobro, slomiti mu oči? Možda postoji prilika da se priprema CL-a delegira stručnjacima koji će to učiniti bolje i brže? Da, postoje takvi stručnjaci, ali ne morate uvijek koristiti njihove usluge.

Trebam li naručiti CJ od stručnjaka?

Uglavnom, stručnjaci za sastavljanje semantičke jezgre odvest će vas samo od koraka 1 - 3 iz našeg dijagrama. Ponekad će se uz veliku dodatnu naknadu napraviti i koraci 4-5 - (sakupljanje repova i provjera konkurentnosti zahtjeva).

Nakon toga će vam dati nekoliko tisuća ključnih riječi s kojima ćete morati raditi u budućnosti.

I ovdje je pitanje hoćete li sami pisati članke ili ćete za to angažirati copywritere. Ako se želite usredotočiti na kvalitetu, a ne kvantitetu, morate pisati sami. Ali tada vam neće biti dovoljno samo da dobijete popis ključeva. Morat ćete odabrati teme koje poznajete dovoljno dobro da napišete kvalitetan članak.

I tu se postavlja pitanje - zašto su nam onda zapravo potrebni stručnjaci u SY-u? Slažem se, raščlanjivanje osnovnog ključa i prikupljanje točnih frekvencija (koraci # 1-3) uopće nije teško. Trebat će vam doslovno pola sata vremena.

Najteže je odabrati RF zahtjeve koji imaju nisku konkurenciju. A sada, kako se ispostavilo, trebate HF-NK, o kojem možete napisati dobar članak. To je upravo ono što će vam oduzeti 99% vašeg vremena rada na semantičkoj jezgri. I nijedan stručnjak to neće učiniti umjesto vas. Pa, isplati li se trošiti novac na naručivanje takvih usluga?

Kada su usluge stručnjaka za CN korisne

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

Takvi će članci biti prazni, jadni, gotovo beskorisni. Ali bit će ih mnogo. Sami možete napisati najviše 2-3 visokokvalitetna članka tjedno. A vojska copywritera osigurat će vam 2-3 sranja teksta dnevno. Istovremeno će biti optimizirani za zahtjeve, što znači da će privući neku vrstu prometa.

U ovom slučaju, da, slobodno unajmite stručnjaka za YA. Neka u isto vrijeme sastavljaju i TK za copywritere. Ali razumijete, to će također koštati nešto novca.

Sažetak

Idemo ponovno kroz glavne točke u članku kako bismo konsolidirali informacije.

  • Semantička jezgra je jednostavno popis ključnih riječi za koje ćete pisati članke na stranici radi promocije.
  • Potrebno je optimizirati tekstove za točne ključne upite, inače vaši čak i najkvalitetniji članci nikada neće ići na TOP.
  • SN je poput plana sadržaja za društvene mreže. Pomaže vam da ne upadnete u "kreativnu krizu" i da uvijek točno znate o čemu ćete pisati sutra, prekosutra i za mjesec dana.
  • Za sastavljanje semantičke jezgre zgodno je koristiti besplatni program Slovoeb, samo vam je potreban.
  • Postoji pet koraka za sastavljanje CL-a: 1 - Odabir osnovnih ključeva; 2 - raščlanjivanje osnovnih ključeva; 3 - Prikupljanje točne učestalosti zahtjeva; 4 - Provjera podudarnosti ključeva; 5 - Zbirka "repova".
  • Ako želite sami pisati članke, onda je bolje da sami napravite semantičku jezgru, za sebe. CL prevodioci vam ovdje neće moći pomoći.
  • Ako želite raditi za količinu i koristiti copywritere za pisanje članaka, onda je potpuno moguće uključiti delegiranje i kompilaciju semantičke jezgre. Kad bi barem bilo dovoljno novca za sve.

Nadam se da vam je ovaj vodič bio od pomoći. Spremite ga u svoje favorite kako ga ne biste izgubili i podijelite s prijateljima. Ne zaboravite preuzeti moju knjigu. Tu vam pokazujem najbrži put od nule do prvog milijuna na internetu (izvod iz osobnog iskustva 10 godina =)

Vidimo se kasnije!

Vaš Dmitrij Novosjolov

Napišimo jednostavnu kernel koja se može učitati s x86 GRUB bootloaderom. Ova kernel će prikazati poruku na ekranu i pričekati.

Kako se pokreće x86 sustav?

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

U većini registara procesora, pri pokretanju, određene vrijednosti se već nalaze. Registar koji upućuje na adresu instrukcija (Instruction Pointer, EIP) pohranjuje memorijsku adresu na kojoj se nalazi instrukcija koju procesor izvršava. EIP je prema zadanim postavkama 0xFFFFFFF0... Dakle, x86 procesori na hardverskoj razini počinju raditi na 0xFFFFFFF0. Ovo je zapravo zadnjih 16 bajtova 32-bitnog adresnog prostora. Ova adresa se zove vektor resetiranja.

Sada memorijska kartica čipseta osigurava da 0xFFFFFFF0 pripada određenom dijelu BIOS-a, a ne RAM-u. U ovom trenutku, BIOS se kopira u RAM radi bržeg pristupa. Adresa 0xFFFFFFF0 sadržavat će samo instrukciju za skok na adresu u memoriji gdje je pohranjena kopija BIOS-a.

Ovako se BIOS kod počinje izvršavati. Prvo, BIOS traži uređaj s kojeg će se pokrenuti, unaprijed postavljenim redoslijedom. Traženje čarobnog broja koji određuje hoće li se uređaj pokrenuti (511. i 512. bajt prvog sektora moraju biti jednaki 0xAA55).

Kada BIOS pronađe uređaj za pokretanje, kopira sadržaj prvog sektora uređaja u RAM, počevši od fizičke adrese 0x7c00; zatim navigira do adrese 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 sustavima.

Svi x86 procesori pokreću se u jednostavnom 16-bitnom načinu tzv pravi režim... GRUB bootloader prebacuje način rada na 32-bitni zaštićeni način rada postavljanjem donjeg bita registra CR0 na 1 ... Dakle, kernel se pokreće u 32-bitnom zaštićenom načinu.

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

Što nam treba?

  • x86 računalo;
  • Linux;
  • ld (GNU Linker);

Postavljanje ulazne točke u asembleru

Koliko god se ne bih želio ograničiti na jedan C, moram nešto napisati na asembleru. Na njega ćemo napisati malu datoteku koja će poslužiti kao početna točka za naš kernel. Sve što će učiniti je pozvati vanjsku funkciju napisanu u C-u i zaustaviti tijek programa.

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

Koristit ćemo skriptu povezivača koja povezuje objektne datoteke za izradu konačne izvršne datoteke. U ovoj skripti ćemo eksplicitno naznačiti da želimo učitati podatke na 0x100000.

Evo asemblerskog koda:

;; kernel.asm bitovi 32; nasm direktiva - 32-bitni odjeljak .text globalni početak extern kmain; kmain je definiran u c datoteci start: cli; blok prekida mov esp, stack_space; postavite pokazivač na stog pozovite kmain hlt; zaustavite odjeljak CPU .bss resb 8192; 8KB za stog stack_space:

Prva instrukcija, bitovi 32, nije instrukcija za sastavljanje x86. Ovo je direktiva NASM asembleru za generiranje koda za procesor koji radi u 32-bitnom načinu rada. U našem slučaju to nije potrebno, ali općenito korisno.

Odjeljak s kodom počinje u drugom retku.

global je još jedna NASM direktiva koja simbole izvornog koda čini globalnim. Dakle, povezivač zna gdje se nalazi početni simbol - naša ulazna točka.

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

Zatim dolazi funkcija start, koja poziva funkciju kmain i zaustavlja procesor s hlt instrukcijom. Zbog toga unaprijed deaktiviramo prekide cli uputom.

U idealnom slučaju, želimo dodijeliti nešto memorije i pokazati na nju pomoću pokazivača na stog (esp). Međutim, izgleda da je GRUB to već učinio za nas. Međutim, i dalje ćete dodijeliti nešto prostora u BSS odjeljku i premjestiti pokazivač na stog na njegov početak. Koristimo instrukciju resb, koja rezervira određeni broj bajtova. Neposredno prije pozivanja kmain-a, pokazivač steka (esp) se postavlja na željeno mjesto s uputom mov.

Jezgra u C

U kernel.asm smo pozvali funkciju kmain (). Dakle, naš "cish" kod bi trebao započeti izvršavanje s kmain ():

/ * * kernel.c * / void kmain (void) (const char * str = "moja prva jezgra"; char * vidptr = (char *) 0xb8000; // video mem počinje ovdje. unsigned int i = 0; unsigned int j = 0; / * ova petlja briše ekran * ima 25 redaka svaki od 80 stupaca; 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 učiniti je očistiti ekran i ispisati niz "moj prvi kernel".

Prvo stvaramo vidptr pokazivač koji pokazuje na adresu 0xb8000... "Video memorija" počinje s ove adrese u zaštićenom načinu rada. Za prikaz teksta na ekranu rezerviramo 25 redaka od 80 ASCII znakova, počevši od 0xb8000.

Svaki znak se prikazuje ne s uobičajenih 8 bitova, već 16. Prvi bajt sadrži sam znak, a drugi - atribut-bajt. Opisuje oblikovanje simbola, kao što je njegova boja.

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

Ovdje je grafikon 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 koristit ćemo svijetlosivi tekst na crnoj pozadini, tako da će naš bajt atribut biti 0x07.

U prvoj petlji program ispisuje prazan znak preko cijele zone 80x25. Ovo će izbrisati zaslon. U sljedećem ciklusu, znakovi iz nul-završenog niza "moja prva jezgra" s bajtom atributa jednakim 0x07 upisuju se u "video memoriju". Ovo će ispisati niz na ekran.

Spojni dio

Moramo prevesti kernel.asm u objektnu datoteku koristeći NASM; zatim upotrijebite GCC za prevođenje kernel.c u drugu objektnu datoteku. Zatim ih je potrebno priključiti na izvršnu jezgru 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; .tekst: (* (. tekst)) .podaci: (* (. podaci)) .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 sustave. ULAZ uzima jedan argument koji specificira ime simbola koji je ulazna točka. ODJELCI je najvažniji dio. Definira oznaku naše izvršne datoteke. Definiramo kako se različite sekcije trebaju povezati i gdje ih postaviti.

U zagradama nakon SECTIONS, točka (.) predstavlja brojač položaja, koji je prema zadanim postavkama 0x0. Može se promijeniti, što i radimo.

Gledamo sljedeći redak: .tekst: (* (. Tekst)). Zvjezdica (*) je poseban znak koji odgovara bilo kojem nazivu datoteke. Izraz * (. Text) znači sve .tekst odjeljke iz svih ulaznih datoteka.

Dakle, povezivač kombinira sve dijelove koda objektne datoteke u jedan odjeljak izvršne datoteke na adresi u brojaču položaja (0x100000). Nakon toga, vrijednost brojača bit će jednaka 0x100000 + veličina rezultirajućeg odjeljka.

Slično, sve se događa i s drugim odjeljcima.

Grub i Multiboot

Sve datoteke su sada spremne za stvaranje kernela. Ali ostao je još jedan korak.

Postoji standard za dizanje x86 kernela pomoću bootloadera tzv Specifikacija za višestruko pokretanje... GRUB će pokrenuti našu kernel samo ako zadovoljava ove specifikacije.

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

  • čarobni polje: sadrži magični broj 0x1BADB002 za identifikaciju kernela.
  • polje zastave: ne treba nam, postavi na nulu.
  • polje kontrolni zbroj: ako ga zbrojite s prethodna dva, trebali biste dobiti nulu.

Naš kernel.asm će postati ovakav:

;; kernel.asm; nasm direktiva - 32 bita 32 odjeljak .text; specifikacija za više pokretanja 4 dd 0x1BADB002; magic dd 0x00; zastavice dd - (0x1BADB002 + 0x00); kontrolni zbroj. m + f + c trebao bi biti nula globalni početak extern kmain; kmain je definiran u c datoteci start: cli; blok prekida mov esp, stack_space; postavi pokazivač staka poziv kmain hlt; zaustavi CPU odjeljak .bss resb 8192; 8KB za stog stack_space:

Izgradnja jezgre

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 generiranje kasm.o objektne datoteke u ELF-32 formatu.

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

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

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

Ovo će pokrenuti linker s našom skriptom i stvoriti izvršnu datoteku pod nazivom zrno.

Konfiguriranje grub i pokretanje kernela

GRUB zahtijeva da naziv kernela odgovara uzorku kernel- ... Dakle, preimenujte kernel. Nazvao sam svoju kernel-701.

Sada ga stavite u imenik / čizma... To će zahtijevati prava superkorisnika.

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

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

Nemojte zaboraviti ukloniti direktivu hiddenmenu, ako postoji.

Ponovno pokrenite računalo i vidjet ćete popis kernela s vašim. Odaberite ga i vidjet ćete:

Operativni sustav sličan UNIX-u zanimljiv je za raščlanjivanje, kao i za pisanje vlastitog kernela koji će ispisati poruku. Pa, hoćemo li napisati?

Operativni sustav sličan UNIX-u i dizanje x86 stroja

Što je operativni sustav sličan UNIX-u? To je OS pod utjecajem UNIX-a. Ali prije nego krenemo u pisanje kernela za njega, pogledajmo kako se stroj pokreće i prenosi kontrolu na kernel.

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

Memorijska kartica čipseta sada osigurava da se 0xFFFFFFF0 mapira na određeni dio BIOS-a, a ne na RAM. U međuvremenu, BIOS se kopira u RAM radi bržeg pristupa. To se zove sjenčanje. Adresa 0xFFFFFFF0 sadržavat će samo instrukciju za odlazak na memorijsku adresu na koju se BIOS kopirao.

Tako se BIOS kod počinje izvršavati. BIOS najprije traži uređaj za podizanje sustava prema konfiguriranom redoslijedu uređaja za pokretanje. Traži određeni čarobni broj kako bi odredio može li se uređaj pokrenuti (bajtovi 511 i 512 prvog sektora su 0xAA55).

Nakon što BIOS otkrije uređaj za pokretanje, kopira sadržaj prvog sektora uređaja u RAM, počevši od fizičke adrese 0x7c00; zatim prelazi na adresu i izvršava kod koji ste upravo učitali. Ovaj kod se naziva bootloader.

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

Svi x86 procesori pokreću se u pojednostavljenom 16-bitnom načinu rada koji se naziva real adresni način. GRUB pokretački program prebacuje se na 32-bitni zaštićeni način postavljajući najmanji bitni bit CR0 na 1. Dakle, kernel se pokreće u 32-bitni zaštićeni način.

Imajte na umu da ako se otkrije jezgra Linuxa, GRUB će primiti dnevnik pokretanja i pokrenuti Linux kernel u stvarnom načinu. I Linux kernel će se prebaciti u zaštićeni način rada.

Što trebamo?

  • x86 računalo (naravno)
  • NASM montažer
  • ld (GNU linker)
  • Izvor

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

Ulazna točka i pokretanje kernela

Prvo, napišimo malu datoteku u x86 asembleru koja će biti početna točka za pokretanje kernela. Ova datoteka će pozvati vanjsku C funkciju i zatim zaustaviti tijek programa.

Kako se uvjeriti da ovaj kod služi kao početna točka za kernel?

Koristit ćemo skriptu povezivača koja povezuje objektne datoteke za izradu konačne izvršne datoteke kernela. U ovoj skripti izričito ćemo naznačiti da binarna datoteka treba biti učitana na adresi 0x100000. Ova adresa je mjesto gdje bi kernel trebao biti.

Evo montažnog koda:

;; kernel.asm bitovi 32; nasm direktiva - 32-bitni odjeljak .text globalni početak extern kmain; kmain je definiran u početku C-datoteke: cli; prekidni blok mov esp, stack_space; set pokazivača staka poziv kmain hlt; odjeljak za zaustavljanje procesora . bss resb 8192; 8KB po stogu stack_space:

Prva instrukcija 32 bita nije instrukcija za sastavljanje x86. Ovo je direktiva za NASM asembler koja kaže da mora generirati kod za rad na procesoru koji radi u 32-bitnom načinu rada. To nije nužno potrebno u našem primjeru, ali je dobra praksa eksplicitno specificirati te stvari.

Drugi redak počinje s odjeljkom teksta. Ovdje ćemo smjestiti sav naš kod.

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

kmain je prilagođena funkcija koja će biti definirana u našoj kernel.c datoteci. extern izjavljuje da je funkcija definirana negdje drugdje.

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

U idealnom slučaju, trebali biste dodijeliti malo memorije za stog i pokazati na njega pomoću pokazivača na stog (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 staviti pokazivač na stog 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 dijela. Prije pozivanja kmain-a, pokazivač steka (esp) koristi se za usmjeravanje na ovaj prostor pomoću naredbe mov.

Jezgra u C

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

/ * * kernel.c * / void kmain (void) (const char * str = "moja prva jezgra"; char * vidptr = (char *) 0xb8000; // video memorija počinje ovdje unsigned int i = 0; unsigned int j = 0; / * ova petlja briše ekran * / dok (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 kmain (praznina)

const char * str = "moja prva jezgra";

unsigned int i = 0;

unsigned int j = 0;

/ * ova petlja briše ekran * /

dok (j< 80 * 25 * 2 ) {

/ * prazan znak * /

vidptr [j] = "";

/ * bajtovi atributa * /

vidptr [j + 1] = 0x07;

j = j + 2;

j = 0;

/ * u ovoj petlji, red se zapisuje u video memoriju * ​​/

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

/ * ascii prikaz * /

vidptr [i] = str [j];

vidptr [i + 1] = 0x07;

i = i + 2;

povratak;

Naša kernel će očistiti ekran i ispisati niz "moj prvi kernel" na njega.

Prvo stvaramo vidptr pokazivač koji pokazuje na 0xb8000. Ova adresa je početak video memorije zaštićenog načina rada. Memorija teksta na ekranu samo je dio memorije u našem adresnom prostoru. U/I zaslon memorijske kartice počinje od 0xb8000 i podržava 25 redaka od 80 ascii znakova svaki.

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

Za ispis znaka sa zelenom bojom 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 tablica 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 - 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 koristit ćemo svijetlosive znakove na crnoj pozadini. Stoga, naš atributni bajt mora biti 0x07.

U prvoj while petlji program upisuje prazan znak s atributom 0x07 u svih 80 stupaca od 25 redaka. Time se briše zaslon.

U drugoj while petlji, znakovi niza "moja prva jezgra" zapisuju se u dio video memorije. Za svaki znak, bajt atributa sadrži vrijednost 0x07.

Tako će se linija prikazati na ekranu.

Spojni dio

Prevodimo kernel.asm i NASM u objektnu datoteku, a zatim koristimo GCC za prevođenje kernel.c u drugu objektnu datoteku. Sada je naš zadatak povezati ove objekte s izvršnom jezgrom za pokretanje.

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; .tekst: (* (. tekst)) .podaci: (* (. podaci)) .bss: (* ( .bss)))

* link.ld

OUTPUT_FORMAT (elf32 - i386)

ULAZ (početak)

ODJELCI

0x100000;

Tekst: (* (. Tekst))

Podaci: (* (. Podaci))

Bss: (* (. Bss))

Prvo postavljamo izlazni format izvršne datoteke na 32-bitnu izvršnu datoteku (ELF). ELF je standardni format binarne datoteke za sustave slične Unixu na arhitekturi x86.

ENTRY uzima jedan argument. Određuje naziv simbola, koji bi trebao biti ulazna točka naše izvršne datoteke.

SECTIONS je najvažniji dio gdje definiramo oznaku izvršne datoteke. Ovo određuje kako se različiti odjeljci trebaju kombinirati i gdje će biti postavljeni.

Unutar vitičastih zagrada nakon naredbe SECTIONS, znak točke (.) - predstavlja brojač lokacije.

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

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

Pogledajte sljedeći redak .tekst: (* (. tekst))

Zvjezdica (*) je poseban znak koji će odgovarati bilo kojem nazivu datoteke. To jest, izraz * (. Text) znači sve odjeljke ulaznog .texta iz svih ulaznih datoteka.

Dakle, povezivač spaja sve tekstualne odjeljke objektnih datoteka u tekstualni dio izvršne datoteke na adresi pohranjenoj u brojaču lokacije. Odjeljak koda izvršne datoteke počinje na 0x100000.

Nakon što povezivač postavi odjeljak za izlaz teksta, brojač lokacije postavlja se na 0x1000000 + veličina odjeljka za izlaz teksta.

Isto tako, podaci i bss odjeljci su spojeni i postavljeni na vrijednosti brojača lokacija.

Grub i Multiboot

Sada su sve datoteke potrebne za izgradnju kernela spremne. Ali budući da namjeravamo pokrenuti kernel pomoću GRUB-a, potrebno je još malo.

Postoji standard za dizanje raznih x86 kernela pomoću bootloadera koji se zove Multiboot specifikacija.

GRUB će pokrenuti kernel samo ako je u skladu sa Multiboot specifikacijom.

Prema njemu, kernel mora sadržavati zaglavlje unutar svojih prvih 8 kilobajta.

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

  • Polje čarobnog broja: sadrži magični broj 0x1BADB002 za identifikaciju zaglavlja.
  • flags polje: ne trebamo ga sada, samo postavite njegovu vrijednost na nulu.
  • polje kontrolnog zbroja: kada je navedeno, treba vratiti nulu za zbroj s prva dva polja.

Dakle, kernel.asm će izgledati ovako:

;; kernel.asm; direktiva nasm - 32 bita 32 odjeljak .text; specifikacija za više pokretanja 4 dd 0x1BADB002; magični brojevi dd 0x00; dd zastavice - (0x1BADB002 + 0x00); kontrolni zbroj. mh + f + ks mora biti jednak nuli globalnog starta extern kmain; kmain je definiran u početku vanjske datoteke: cli; blokiranje prekida mov esp, stack_space; poziv pokazivača na stog kmain hlt; odjeljak zaustavljanja procesora .bss resb 8192; 8KB po stogu stack_space:

; ; zrno. asm

; nasm direktiva - 32 bita

bitovi 32

odjeljak. tekst

; multiboot spec

poravnati 4

dd 0x1BADB002; magični brojevi

dd 0x00; zastave

dd - (0x1BADB002 + 0x00); ček zbroj. mch + f + ks trebao bi biti jednak nuli

globalni početak

vanjski kmain; kmain je definiran u vanjskoj datoteci

početak:

cli; blokada prekida

mov esp, stog _ prostor; pokazivač steka

nazovi kmaina

hlt; zaustavljanje procesora

Kada počnete čitati tutoriale za promociju web stranice, uvijek počinje stvaranjem semantičke jezgre. Za početnike je ovaj prvi korak najteži. Osim što nije odmah jasno što je ta semantička jezgra, još nije jasno koju svrhu ima i kako je ispravno stvoriti.

U ovom ćemo članku govoriti o tome kako ispravno stvoriti semantičku jezgru web mjesta. Također ćete naučiti što je to i zašto je napravljeno. Zapravo, nema ništa komplicirano i teško u konceptu semantičke jezgre. Idemo to shvatiti.

Nitko još nije odgovorio na pitanje što je semantička jezgra tako jednostavnim riječima kao što ćemo sada učiniti. Dakle, semantička jezgra stranice je popis ključnih fraza kojima će se promovirati. Sve! Cijeli smisao koncepta u jednoj kratkoj, jasnoj rečenici. I ne treba ništa blatiti pametnim terminima.

Ako uđete dublje u pojam, onda je semantika znanost koja se bavi semantičkim popunjavanjem leksičkih jedinica. Jednostavno rečeno, semantika proučava značenje nečega. U SEO-u, semantička jezgra omogućuje razumijevanje značenja cijele stranice, bilo kojeg odjeljka ili jednog preuzetog članka. To postaje jasno tražilici, posjetitelju, svim programerima koji će raditi na stranici.

Semantička jezgra, bez pretjerivanja, temelj je svakog napretka.

Kako koristiti semantičku jezgru i čemu služi

Funkcije semantičke jezgre uključuju sljedeće aspekte promocije web stranice:

  • Najvažniji zadatak semantičke jezgre je razumijevanje strukture stranice i njezine punine. Gledajući to, možete zamisliti koje će odjeljke stranica imati i koji će članci biti u svakom odjeljku. Tako su svi nedostaci i neugodnosti konstrukcije odmah vidljivi i mogu se otkloniti u ranoj fazi.
  • Semantika definira vektor sadržaja. Zahvaljujući boljem razumijevanju strukture stranice, možete odabrati najrelevantnije i najučinkovitije ključne fraze.
  • Semantička jezgra je sadržajni plan stranice za dugi niz godina. Svaki put kada trebate pisati članke, možete pogledati tamo i vidjeti koji je sadržaj planiran i u kojem dijelu stranice bi trebao biti.
  • Ako planirate promovirati svoju web stranicu na plaćenoj osnovi, na primjer, kroz kontekstualno oglašavanje, tada zahvaljujući semantičkoj jezgri možete izračunati trošak promocije.

Kako napraviti semantičku jezgru

Prvo morate odlučiti gdje ćete dobiti ključne fraze za kernel. Najbolji izvor za početnike je usluga Yandex WordPStat koja pokazuje koliko je puta mjesečno određeni upit unesen u Yandex pretraživanje. WordStat ima niz korisnih značajki, kao što je filtriranje upita po regiji ili uređaju, pregled povezanih upita i još mnogo toga. I što je najvažnije, potpuno je besplatno. Više o ovome.

Možete koristiti razne plaćene programe, ali WordStat je zbog svoje jednostavnosti prikladniji za početnike. Osim toga, prikladan je ne samo za Runet, gdje prevladava Yandex. Ako promovirate web mjesto unutar CIS-a, možete ga sigurno koristiti, a statistika na Googleu bit će otprilike ista.

Glavna bit stvaranja semantičke jezgre je zbirka ključnih fraza koje se nekako uklapaju u temu stranice. Treba ih nekako formalizirati i sistematizirati. Za to su najprikladnije proračunske tablice, kao što su Excel, Google Doc proračunske tablice ili slično.

A za veću učinkovitost, dodatni grafovi mogu se dodati u semantičku jezgru tablice:

  • Naravno, trebao bi postojati grafikon s najključnijim izrazom.
  • Naravno, stupac s nazivom odjeljka web-mjesta u kojem će se koristiti ova fraza.
  • Možete dodati stupac s meta oznakama naslova i opisa i odmah napisati naslov i opis članka koristeći navedenu ključnu frazu. Prvo, odmah će biti jasno o čemu napisati članak, a kao drugo, onda neće biti potrebe da se zagoneta i izmišlja.
  • Možete napraviti stupac koji označava broj znakova u članku za zadanu ključnu frazu kako biste bolje razumjeli plan sadržaja.
  • Ako govorimo o promicanju kontekstualnog oglašavanja, potrebno je za svaki zahtjev dodati trošak oglašavanja.
  • Sve što je potrebno može se sigurno upisati u tablicu sematske jezgre. Za ovo ne postoji predložak, pa možete raditi što god želite i tamo je zgodno.

Uobičajene pogreške pri stvaranju semantičke jezgre

Sada znate kako ispravno stvoriti semantičku jezgru stranice. Pogledajmo neke od uobičajenih pogrešaka SEO-a početnika.

  • Ako jezgra predviđa podjelu stranice u kategorije, uobičajena pogreška je stvaranje dubokih razina ugniježđenja. Preporuča se druga razina i ne dalje. Odnosno, možete kreirati naslov, podnaslov i to je sve, više ga nije moguće dalje dijeliti na manje naslove.
  • Novopridošlice mogu zanemariti niskofrekventne zahtjeve, jer misle da ih je nepraktično koristiti, oni ipak neće donijeti puno prometa. Ali u stvari, istina je upravo suprotno. Za novu stranicu potrebni su upravo niskofrekventni, nekonkurentni upiti.
  • Ne možete u potpunosti vjerovati usluzi s kojom će se ključne fraze izdvojiti. A novajlije rade upravo to. Strojevi mogu pogriješiti i odabrati pogrešnu.
  • Nema potrebe za stvaranjem članka radi ključne fraze. Ako nađete izraze "hitno prodati kuću" i "brzo prodati kuću", onda nema smisla praviti dva različita članka za njih.

Ova serija članaka posvećena je programiranju niske razine, odnosno arhitekturi računala, dizajnu operacijskog sustava, programiranju na asembleru i srodnim područjima. Do sada se pisanjem bave dva habrauzera - i. Za mnoge srednjoškolce, studente i profesionalne programere ove se teme ispostavljaju vrlo teškim za učenje. Postoji mnogo literature i tečajeva o programiranju niske razine, ali je od njih teško dobiti cjelovitu i cjelovitu sliku. Teško je, nakon čitanja jedne ili dvije knjige o asembleru i operacijskim sustavima, barem općenito zamisliti kako zapravo funkcionira ovaj složeni sustav željeza, silicija i mnogih programa – računalo.

Svatko rješava problem učenja na svoj način. Netko čita puno literature, netko pokušava usput brzo prijeći na praksu i razumjeti, netko pokušava objasniti prijateljima sve što uči. I odlučili smo kombinirati ove pristupe. Dakle, u ovom tečaju članaka pokazat ćemo korak po korak kako napisati jednostavan operativni sustav. Članci će biti pregledne prirode, odnosno neće sadržavati iscrpne teorijske podatke, no uvijek ćemo nastojati dati poveznice 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žda ćemo proces razvoja namjerno odvesti u zastoj kako bismo vama i sebi omogućili da u potpunosti shvatimo sve posljedice pogrešne odluke, kao i da izbrusimo neke tehničke vještine na njoj. Stoga ne biste trebali naše odluke uzimati kao jedine ispravne i slijepo nam vjerovati. Još jednom naglašavamo da od čitatelja očekujemo da budu aktivni u raspravi o člancima, što bi trebalo snažno utjecati na cjelokupni razvoj i pisanje narednih članaka. U idealnom slučaju, željeli bismo vidjeti neke čitatelje da se s vremenom pridruže razvoju sustava.

Pretpostavit ćemo da je čitatelj već upoznat s osnovama asemblerskih i C jezika, kao i s osnovnim konceptima arhitekture računala. Odnosno, nećemo objašnjavati što je registar ili recimo memorija slučajnog pristupa. Ako nemate dovoljno znanja, uvijek se možete obratiti dodatnoj literaturi. Kratki popis referenci i poveznice na stranice s dobrim člancima nalaze se na kraju članka. Također je poželjno biti u mogućnosti koristiti Linux, jer će sve upute za kompilaciju biti dane posebno za ovaj sustav.

A sada – više do točke. U nastavku članka napisat ćemo klasični program "Hello World". Ispostavit će se da je naš Hello World malo specifičan. Neće se pokretati iz bilo kojeg operativnog sustava, već izravno, da tako kažemo, "na golom metalu". Prije nego što prijeđemo izravno na pisanje koda, shvatimo kako to točno pokušavamo učiniti. A za to morate uzeti u obzir proces pokretanja računala.

Dakle, uzmite svoje omiljeno računalo i pritisnite najveći gumb na jedinici sustava. Vidimo veseli pozdravni zaslon, jedinica sustava veselo pišti zvučnikom, a nakon nekog vremena operativni sustav se učitava. Kao što razumijete, operativni sustav je pohranjen na tvrdom disku i ovdje se postavlja pitanje: kako se operacijski sustav magično pokrenuo u RAM i počeo izvršavati?

Znajte ovo: sustav koji se nalazi na bilo kojem računalu je zaslužan za to, a njegovo ime - ne, ne Windows, pipa vaš jezik - zove se BIOS. Njegovo ime znači Basic Input-Output System, odnosno osnovni ulazno-izlazni sustav. BIOS se nalazi na malom mikro krugu na matičnoj ploči i pokreće se odmah nakon pritiska na veliku tipku ON. BIOS ima tri glavna zadatka:

  1. Otkrijte sve povezane uređaje (procesor, tipkovnicu, monitor, RAM, video karticu, glavu, ruke, krila, noge i repove...) i provjerite njihovu funkcionalnost. Za to je odgovoran POST program (Power On Self Test). Ako se vitalni hardver ne pronađe, tada nikakav softver neće moći pomoći, a u ovom trenutku zvučnik sustava će škripati nešto zlokobno i OS uopće neće doći do OS-a. Nemojmo govoriti o tužnom, pretpostavimo da imamo potpuno radno računalo, radujmo se i prijeđimo na ispitivanje druge funkcije BIOS-a:
  2. Omogućavanje operativnom sustavu osnovnog skupa funkcija za rad s hardverom. Na primjer, putem BIOS funkcija možete prikazati tekst na zaslonu ili čitati podatke s tipkovnice. Stoga se naziva osnovnim I/O sustavom. Operativni sustav obično pristupa tim funkcijama putem prekida.
  3. Pokretanje učitavača operativnog sustava. U ovom slučaju, u pravilu, čita se sektor za pokretanje - prvi sektor nositelja informacija (disketa, tvrdi disk, CD, flash pogon). Redoslijed medija za prozivanje može se postaviti u BIOS SETUP. Sektor za pokretanje sadrži program koji se ponekad naziva primarnim pokretačem. Grubo govoreći, posao bootloadera je pokretanje operativnog sustava. Proces pokretanja operacijskog sustava može biti vrlo specifičan i vrlo ovisan o njegovim značajkama. Stoga, primarni bootloader pišu izravno programeri OS-a i zapisuje se u sektor za pokretanje tijekom instalacije. U trenutku pokretanja bootloadera, procesor je u stvarnom načinu rada.
Tužna vijest: veličina bootloadera trebala bi biti samo 512 bajtova. Zašto tako malo? Da bismo to učinili, moramo se upoznati s uređajem diskete. Evo informativne slike:

Slika prikazuje površinu diskovnog pogona. Disketa ima 2 površine. Svaka površina ima prstenaste staze (trake). Svaka je staza podijeljena na male, lučne dijelove zvane sektori. Dakle, povijesno gledano, sektor diskete ima veličinu od 512 bajtova. Prvi sektor na disku, sektor za pokretanje, BIOS čita u nulti memorijski segment na pomaku 0x7C00, a zatim se kontrola prenosi na ovu adresu. Boot loader obično učitava u memoriju ne sam OS, već drugi loader program pohranjen na disku, ali iz nekog razloga (najvjerojatnije je to veličina) koji ne stane u jedan sektor. A budući da dosad ulogu našeg OS-a igra banalan Hello World, naš je glavni cilj natjerati računalo da vjeruje u postojanje našeg OS-a, pa makar samo na jednom sektoru, i pokrenite ga.

Kako radi boot sektor? Na osobnom računalu, jedini uvjet 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 što trebamo učiniti. Napišimo kod! Gornji kod je napisan za yasm asembler.

odjeljak. tekst

korištenje 16

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

početak:

mov sjekira, cs

mov ds, ax ; odaberite segment podataka



mov si, poruka

cld ; smjer za naredbe niza

mov ah, 0x0E ; Broj funkcije BIOS-a

mov bh, 0x00 ; stranica video memorije

puts_loop:

lodsb ; učitaj sljedeći znak u al

test al, al ; null znak znači kraj reda

jz puts_loop_exit

int 0x10 ; pozovite BIOS funkciju

jmp puts_loop

puts_loop_exit:

jmp $; vječni ciklus



poruka:

db "Hello World!" , 0

Završi:

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

db 0x55, 0xAA ; potpis sektora za pokretanje

Ovaj kratki program zahtijeva niz važnih objašnjenja. Redak org 0x7C00 je potreban kako bi asembler (mislim na program, a ne na jezik) ispravno izračunao adrese za oznake i varijable (puts_loop, puts_loop_exit, message). Stoga ga obavještavamo da će se program učitati u memoriju na adresi 0x7C00.
U redovima
mov sjekira, cs

mov ds, ax
segment podataka (ds) postavljen je jednak segmentu koda (cs), budući da su u našem programu i podaci i kod pohranjeni u jednom segmentu.

Zatim se u petlji prikazuje poruka “Hello World!” znak po znak. Za to se koristi funkcija 0x0E prekida 0x10. Ima sljedeće parametre:
AH = 0x0E (broj funkcije)
BH = broj video stranice (nemojte se još truditi, navedite 0)
AL = ASCII kod znakova

U retku "jmp $" program visi. I s pravom, nema potrebe da ona izvršava dodatni kod. Međutim, da bi računalo ponovno radilo, morat ćete ga ponovno pokrenuti.

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

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

Vrhunski povezani članci