Защо стекът трябва да бъде подравнен по страниците?

В Linux се опитах (само за забавление) да модифицирам източника на ядрото в process.c, за да създам адрес на стека, който има повече ентропия, т.е. по-специално реда:

sp -= get_random_int() % 8192;

Когато променя това твърде много, ядрото спира или получавам някакво привидно недефинирано поведение. Предполагам, че това кара PAGE_ALIGN() да се провали по някакъв начин? Не съм толкова заинтересован защо PAGE_ALIGN() в частност се проваля или точно коя част от кода в ядрото се проваля (въпреки че и това би било хубаво да се знае); Повече ме интересува защо стекът изобщо трябва да се намира в определен регион. Каква е архитектурната причина и мотивация зад това? Това има ли нещо общо с това как GDT/LDT работи в защитен режим?

Само за да стане ясно какво питам:

Защо стекът трябва да има формата 0xbfXXXXXX (на 32-битов)? Защо стекът не може да бъде напр. 0xaaXXXXXX или друга стойност?


person csstudent2233    schedule 14.08.2012    source източник


Отговори (1)


Има ограничение в do_page_fault() за това колко далеч извън стека vma можете да бъдете, преди да го сметне за лош достъп, може би удряте това?

person mpe    schedule 15.08.2012
comment
На x86 8K е размерът по подразбиране на стека на ядрото. Кодът, който OP споменава, засяга user стека, чийто размер не е фиксиран. - person Paweł Dziepak; 07.10.2012