Tietokoneissa, jotta prosessi olisi suoritettava, se on sijoitettava muistiin. Tätä varten muistissa olevalle prosessille on määritettävä kenttä. Muistin varaaminen on tärkeä asia, joka on huomioitava, erityisesti ytimessä ja järjestelmäarkkitehtuureissa.

Katsotaanpa Linuxin muistin varausta yksityiskohtaisesti ja ymmärrämme, mitä kulissien takana tapahtuu.

Kuinka muistin varaus tehdään?

Useimmat ohjelmistosuunnittelijat eivät tiedä tämän prosessin yksityiskohtia. Mutta jos olet järjestelmäohjelmoijaehdokas, sinun pitäisi tietää siitä enemmän. Kun tarkastellaan allokointiprosessia, on tarpeen mennä hieman yksityiskohtiin Linuxista ja glibc kirjasto.

Kun sovellukset tarvitsevat muistia, niiden on pyydettävä sitä käyttöjärjestelmältä. Tämä ytimen pyyntö vaatii luonnollisesti järjestelmäkutsun. Et voi varata muistia itse käyttäjätilassa.

The malloc() funktioperhe vastaa muistin varaamisesta C-kielellä. Tässä on kysyttävä, tekeekö malloc() glibc-funktiona suoran järjestelmäkutsun.

Linux-ytimessä ei ole malloc-nimistä järjestelmäkutsua. Sovellusten muistivaatimuksille on kuitenkin kaksi järjestelmäkutsua, jotka ovat

instagram viewer
brk ja mmap.

Koska pyydät sovelluksesi muistia glibc-toimintojen kautta, saatat ihmetellä, mitä näistä järjestelmäkutsuista glibc käyttää tässä vaiheessa. Vastaus on molemmat.

Ensimmäinen järjestelmäkutsu: brk

Jokaisella prosessilla on vierekkäinen tietokenttä. brk-järjestelmäkutsulla tietokentän rajan määräävää ohjelman katkon arvoa kasvatetaan ja allokointi suoritetaan.

Vaikka muistin varaus tällä menetelmällä on erittäin nopeaa, käyttämätöntä tilaa ei aina ole mahdollista palauttaa järjestelmään.

Oletetaan esimerkiksi, että varaat viisi kenttää, kukin kooltaan 16 kt, brk-järjestelmäkutsulla malloc()-funktion kautta. Kun olet suorittanut numeron kaksi näistä kentistä, ei ole mahdollista palauttaa asianmukaista resurssia (deallokaatiota), jotta järjestelmä voi käyttää sitä. Koska jos pienennät osoitteen arvoa näyttämään kentän numero kaksi alkamispaikan, kutsumalla brk: lle, olet tehnyt kenttien numerot kolme, neljä ja viisi jakamisen.

Muistin menettämisen estämiseksi tässä skenaariossa glibc: n malloc-toteutus tarkkailee prosessitietokentässä varattuja paikkoja ja sitten määrittää palauttamaan sen järjestelmään free()-funktiolla, jotta järjestelmä voi käyttää vapaata tilaa lisämuistiin määrärahat.

Toisin sanoen viiden jälkeen varataan 16 kt alue, jos toinen alue palautetaan free()-funktiolla ja toinen 16 kt alue. pyydetään uudelleen hetken kuluttua, sen sijaan, että laajennettaisiin tietoaluetta brk-järjestelmäkutsulla, palautetaan edellinen osoite.

Jos uusi pyydetty alue on kuitenkin suurempi kuin 16 kt, data-aluetta laajennetaan varaamalla uusi alue brk-järjestelmäkutsulla, koska aluetta kaksi ei voida käyttää. Vaikka alue numero kaksi ei ole käytössä, sovellus ei voi käyttää sitä kokoeron vuoksi. Tällaisten skenaarioiden vuoksi on olemassa tilanne, jota kutsutaan sisäiseksi pirstoutuneeksi, ja itse asiassa voit harvoin käyttää kaikkia muistin osia täysillä.

Jotta ymmärrät paremmin, yritä kääntää ja suorittaa seuraava esimerkkisovellus:

#sisältää <stdio.h>
#sisältää <stdlib.h>
#sisältää <unistd.h>
intpää(int argc, hiiltyä* argv[])
{
hiiltyä *ptr[7];
int n;
printf("%s Pid: %d", argv[0], getpid());
printf("Ohjelman ensimmäinen tauko: %p", sbrk (0));
for (n = 0; n<5; n++) ptr[n] = malloc (16 * 1024);
printf("5 x 16 kt mallocin jälkeen: %p", sbrk (0));
vapaa(ptr[1]);
printf("Toisen vapaan 16 kt: n jälkeen: %p", sbrk (0));
ptr[5] = malloc (16 * 1024);
printf("Kun olet varannut 6. 16 kt: stä: %p", sbrk (0));
vapaa(ptr[5]);
printf("Viimeisen lohkon vapauttamisen jälkeen: %p", sbrk (0));
ptr[6] = malloc (18 * 1024);
printf("Kun olet varannut uuden 18 kt: %p", sbrk (0));
getchar();
palata0;
}

Kun suoritat sovelluksen, saat seuraavan tulosteen kaltaisen tuloksen:

Pid of ./a.out: 31990
Alkuperäinen ohjelma tauko: 0x55ebcadf4000
5 x 16 kt mallocin jälkeen: 0x55ebcadf4000
Toisen 16 kt: n vapaan jälkeen: 0x55ebcadf4000
Kun olet varannut kuudennen osan 16 kt: sta: 0x55ebcadf4000
Viimeisen lohkon vapauttamisen jälkeen: 0x55ebcadf4000
Kun olet jakanut a Uusi18kB: 0x55ebcadf4000

brk: n tulos stracella on seuraava:

brk(TYHJÄ) = 0x5608595b6000
brk (0x5608595d7000) = 0x5608595d7000

Kuten näet, 0x21000 on lisätty tietokentän pääteosoitteeseen. Tämän voi ymmärtää arvosta 0x5608595d7000. Siis suunnilleen 0x21000, tai 132 kt muistia varattiin.

Tässä on otettava huomioon kaksi tärkeää seikkaa. Ensimmäinen on mallikoodissa määritettyä suurempaa määrää. Toinen on se, mikä koodirivi aiheutti brk-kutsun, joka tarjosi varauksen.

Osoitetilan asettelun satunnaistaminen: ASLR

Kun suoritat yllä olevan esimerkkisovelluksen peräkkäin, näet joka kerta erilaiset osoitearvot. Osoiteavaruuden muuttaminen satunnaisesti tällä tavalla vaikeuttaa huomattavasti tietoturvahyökkäyksiä ja lisää ohjelmistoturvallisuutta.

32-bittisissä arkkitehtuureissa osoiteavaruuden satunnaistamiseen käytetään kuitenkin yleensä kahdeksaa bittiä. Bittien määrän lisääminen ei ole tarkoituksenmukaista, koska osoitettava alue jäljellä olevien bittien yli on hyvin pieni. Myöskään vain 8-bittisten yhdistelmien käyttö ei tee asioista tarpeeksi vaikeaa hyökkääjälle.

Toisaalta 64-bittisissä arkkitehtuureissa, koska ASLR: n toimintaan voidaan varata liian monta bittiä, saadaan aikaan paljon suurempi satunnaisuus ja turvallisuusaste kasvaa.

Myös Linux-ydin toimii Android-pohjaiset laitteet ja ASLR-ominaisuus on täysin aktivoitu Android 4.0.3:ssa ja uudemmissa. Jo pelkästään tästä syystä ei olisi väärin sanoa, että 64-bittinen älypuhelin tarjoaa merkittävän tietoturvaedun 32-bittisiin versioihin verrattuna.

Poistamalla ASLR-ominaisuuden väliaikaisesti käytöstä seuraavalla komennolla, näyttää siltä, ​​​​että edellinen testisovellus palauttaa samat osoitearvot joka kerta, kun se ajetaan:

kaiku0 | sudo tee /proc/sys/kernel/randomize_va_space

Sen palauttamiseksi aiempaan tilaan riittää, että kirjoitat 2 samaan tiedostoon 0:n sijaan.

Toinen järjestelmäkutsu: mmap

mmap on toinen järjestelmäkutsu, jota käytetään muistin varaamiseen Linuxissa. Mmap-kutsussa vapaa tila missä tahansa muistin alueella kartoitetaan kutsuprosessin osoiteavaruuteen.

Tällä tavalla tehdyssä muistin varauksessa, kun haluat palauttaa toisen 16 kt: n osion free()-funktiolla edellisessä brk-esimerkissä, ei ole mekanismia, joka estäisi tätä toimintoa. Asiaankuuluva muistisegmentti poistetaan prosessin osoiteavaruudesta. Se merkitään enää käyttämättömäksi ja palautetaan järjestelmään.

Koska muistin varaukset mmapilla ovat erittäin hitaita verrattuna brk: n kanssa, brk-varaus tarvitaan.

Mmapin avulla kaikki vapaat muistialueet kartoitetaan prosessin osoiteavaruuteen, joten varatun tilan sisältö nollataan ennen kuin tämä prosessi on valmis. Jos nollausta ei tehty tällä tavalla, myös seuraava asiaankuulumaton prosessi voi päästä käsiksi siihen prosessiin kuuluviin tietoihin, jotka aiemmin käyttivät asianmukaista muistialuetta. Tämä tekisi mahdottomaksi puhua järjestelmien turvallisuudesta.

Muistin varauksen merkitys Linuxissa

Muistin allokointi on erittäin tärkeää erityisesti optimointi- ja tietoturvakysymyksissä. Kuten yllä olevista esimerkeistä näkyy, tämän ongelman ymmärtämättä jättäminen voi tarkoittaa järjestelmän suojauksen tuhoamista.

Jopa push- ja pop-käsitteet, jotka ovat olemassa monissa ohjelmointikielissä, perustuvat muistin varaustoimintoihin. Osaa käyttää ja hallita järjestelmämuistia hyvin on elintärkeää sekä sulautettujen järjestelmien ohjelmoinnissa että turvallisen ja optimoidun järjestelmäarkkitehtuurin kehittämisessä.

Jos haluat myös upottaa varpaitasi Linux-ytimen kehittämiseen, harkitse ensin C-ohjelmointikielen hallintaa.

Lyhyt johdatus C-ohjelmointikieleen

Lue Seuraava

JaaTweetJaaSähköposti

Liittyvät aiheet

  • Linux
  • Tietokoneen muisti
  • Linux-ydin

Kirjailijasta

Fatih Küçükkarakurt (7 artikkelia julkaistu)

Insinööri ja ohjelmistokehittäjä, joka on matematiikan ja tekniikan fani. Hän on aina pitänyt tietokoneista, matematiikasta ja fysiikasta. Hän on kehittänyt pelimoottoriprojekteja sekä koneoppimista, keinotekoisia hermoverkkoja ja lineaarisia algebrakirjastoja. Lisäksi työskentelee edelleen koneoppimisen ja lineaaristen matriisien parissa.

Lisää Fatih Küçükkarakurtilta

tilaa uutiskirjeemme

Liity uutiskirjeemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia ​​e-kirjoja ja eksklusiivisia tarjouksia!

Klikkaa tästä tilataksesi