ПредишенСледващото

В много операции разпределението пространство в паметта на потребителя, по-специално на някои от разгледаните по-горе примери, може да се осъществява чрез използване на стека, защото априори известен размер на разпределените района памет. В потребителското пространство на разположение за лукса на една много голяма и динамично развиваща се купчина задачи, но в режим на ядрото не е лукс - стека на ядрото е малък и фиксиран размер. Когато процесът е дадена малка и фиксиран стека размер, разходи за съхранение са намалени и ядрото не е необходимо да извърши допълнителни функции за управление на паметта.

Размерът на стека зависи от хардуерната платформа и на параметрите на конфигурацията, които са били определени по време на компилация. Исторически ядрото стека размер е равен на две страници памет за всеки процес. Това съответства на

8K 32-битови хардуерни платформи и 16 KB за 64-битови хардуерни платформи.

Първите версии на серия от ядра е 2.6, възможността за конфигурацията, за които размерът на ядрото стак, равно на една страница памет. Когато инсталирате такава конфигурация, процесът получава размер на стека, равна на една страница памет само 4 килобайта на 32-битова хардуерни платформи и 8K - 64-битов. Това се прави по две причини. Първо, тя намалява разходите памет на страница за всеки процес. На второ място, и най-важното, увеличаване система непрекъсната работа (непрекъсната работа) е все по-трудно да се търсят две физически съседни страници на паметта. Физическа памет става все по-разпокъсан и натоварването на виртуална система за управление на памет за създаване на нови процеси става все по-значима.

Има и друг проблем (остане с нас и ще научите всичко за стека на ядрото). Цялата последователност от вложени извиквания на функции в режим на ядрото трябва да сложите в стека. Исторически погледнато, прекъсват манипулатори използват стека на процеса, за изпълнението на които те се счупи. Това означава, че в най-лошия случай

8К стека да се използва съвместно от всички вложени функция разговори и дори чифт куки. Всичко това е ефективен и прост, но тя налага повече ограничения върху използването на стека на ядрото. Когато размерът на стека е намален до една страница на паметта, прекъсвам, работещи вече няма годни там.

За да се реши този проблем е реализирана още една възможност - купища прекъсват манипулатори. Купища прекъсват представляват един стек за всеки процесор, който се използва за обработка на прекъсванията. С тази конфигурация, прекъсват манипулатори които вече не използвате тези процеси стекове ядрото, че тези процесори са прекъснати. Вместо това, те използват собствените си стакове. Тя изисква само една страница от паметта към процесора.

За да обобщим. Kernel стека отнема една или две страници на паметта, в зависимост от конфигурацията, която се извършва преди изграждането на ядрото. Следователно, размерът на стека на ядрото може да варира от 4 до 16 Kbytes. Исторически прекъсне товарачи споделят една купчина от прекъснатия процес. Когато размерът на стека на ядрото на една страница, работещи с прекъсвания памет са били възложени на собствените си стакове. Във всеки случай, неограничен използването на рекурсия и функции като alloca () очевидно не е приемлив.

Честна игра с топчето

Във всеки функция е необходимо да се намали използването на стека до минимум. Въпреки че не съществуват строги правила, все пак трябва да се запази максималната обща сума на всички локални променливи (известни също като автоматични променливи или променливи са разпределени в стека) е не повече от няколкостотин байта. Опасност статично разпределят големи обекти на стека, като например големи масиви от структури. В противен случай, разпределението на стека памет ще се извършва по същия начин, както в потребителското пространство. Stack Overflow е прозрачна и обикновено води до проблеми. Тъй като ядрото не извършва никакъв контрол комин, данните на стека е просто презапишете каквото е извън стека. Главно засегнати thread_info структура. който се намира в самия край на частта за процес (не забравяйте, глава 3). Извън основната стека всички данни могат да бъдат загубени. В най-добрия случай, препълване на стека ще настъпи повреда на машината. В най-тежките случаи може да се появи повреда на данните.

Във връзка с това, за да се изолират големи количества памет трябва да използват един от динамични схеми за разпределение на паметта, които се считат за по-рано в тази глава.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!