Witam.
Usiłowałem dowiedzieć się jak wygląda kwestia zarządzania stosem w Linuxie ale nie znalazłem odpowiedzi więc szukam pomocy tutaj. Moje pytanie brzmi - na jakiej podstawie Linux rozstrzyga czy odwołanie do adresu z zakresu dno stosu - RLIMIT_STACK jest odwołaniem poza przestrzeń adresową prcesu?
Poniżej przedstawiam listingi dwóch prościutkich programików w C oraz odpowiadający im kod w asemblerze. Wykonanie prog2 przebiega bez zakłóceń, podczas dy wykonanie prog1 zawsze powoduje "segmentation fault". Nie rozumiem dlaczego gdyż kody w asemblerze są niemalże identyczne.
Prog1.c:
[code]
int main()
{
char a;
char* b = &a;
b = b - 999999;
*b = '\0';
}
[/code]
Prog1.s:
[code]
.file "prog1.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
leal -5(%ebp), %eax
movl %eax, -4(%ebp)
subl $999999, -4(%ebp)
movl -4(%ebp), %eax
movb $0, (%eax)
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.3"
.section .note.GNU-stack,"",@progbits
[/code]
Prog2.c:
[code]
int main()
{
char a[1000000];
char* b = &a[0];
*b = '\0';
}
[/code]
Prog2.s:
[code]
.file "prog2.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $1000016, %esp
leal -1000004(%ebp), %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
movb $0, (%eax)
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.3"
.section .note.GNU-stack,"",@progbits
[/code]