일부 Unix 교과서를 살펴봤지만 프로세스의 스택 영역이 무엇인지 명확하게 알 수 없습니다. 누구든지 이것을 설명하거나 몇 가지 참고 자료를 알려줄 수 있습니까?
답변1
ld.so
커널이 스택을 동적 링커에 전달할 때만 스택을 명확하게 볼 수 있습니다. 당신은 하나를 찾을 수 있습니다기본 이미지는 여기. 이것은 C 프로그램의 전통적인 3가지 매개변수를 보여 줍니다 argc
.argv
envp
int main(int argc, char **argv, char **envp)
이 견해는 다소 단순하다. 하나ELF 보조 벡터가 스택에 존재합니다., 또한 많은 정보를 전달했습니다.ld.so
을 실행한 후 ld.so
libc 런타임이 개입하여 상황을 복잡하게 만듭니다. C++ 생성자가 실행될 수 있으며 모든 종류의 이상한 것들이 스택에 쌓일 수 있습니다. 이는 프로그램이 어떻게 컴파일되었는지에 따라 다릅니다. 간단한 C 프로그램이라도 다음을 기반으로 다양한 작업을 수행할 수 있습니다.어떤 도서관그들을다음으로 컴파일.
답변2
이것위키피디아 기사매우 간결합니다. Google에서 "스택 대 힙"을 검색하면 일반적으로 서로 관련하여 설명되는 내용을 많이 찾을 수 있습니다.
프로그래밍을 하지 않는다면 이것을 이해하는 것이 특별히 유용하거나 중요하지 않습니다. 그렇다면 대부분의 사람들이 스택의 의미를 가장 먼저 접하는 곳 중 하나는 WRT입니다.재귀적수신 전화, 이와 관련된 자세한 Wikipedia 기사호출 스택. 호출 스택은 "프로세스의 스택 영역"을 차지하며 중첩 또는 재귀 함수 호출에 대한 데이터는 서로 "스택"되어 함수 호출에 대한 로컬 데이터를 보유합니다.후입선출 정렬.
직접 메모리 주소 지정을 허용하는 언어(예: C/C++)로 프로그래밍을 수행한 적이 없다면 메모리가 맵 메모리 영역을 주소 지정하는 방법을 이해하는 것이 중요하며 교과서에서 이에 대해 다루었기를 바랍니다.
답변3
프로그램은 일반적으로 함수 매개변수를 스택에 푸시한 다음 asm CALL 명령을 사용하여 함수를 호출합니다. 이 명령은 반환 주소를 스택에 푸시하므로 RET 명령이 나중에 이를 팝하고 반환할 위치를 알 수 있습니다. 또한 함수는 일반적으로 지역 변수를 스택에 배치합니다. 호출 함수는 또한 사용 중인 모든 레지스터를 호출 전에 스택에 푸시할 수 있으므로 호출된 함수가 해당 레지스터를 다른 용도로 사용한 후에 해당 레지스터를 팝할 수 있습니다.
함수 A가 함수 B를 호출하는 스택의 단어를 시각적으로 표현하면 다음과 같습니다.
local1
arg1
functionA+12
local1
local2
여기서 functionA에는 지역 변수가 있고 매개변수를 functionB에 전달하고 반환 주소(functionA 시작 후 12바이트)를 저장합니다. 그런 다음 functionB는 자체 로컬 변수 두 개를 스택에 넣습니다. functionB가 functionC를 호출하면 스택은 계속해서 커졌다가 함수가 반환될 때 다시 줄어듭니다.