프로세스 주소 공간에는 스택과 힙이 있습니다. 함수가 호출되거나 지역 변수가 선언될 때 커널은 물리적 주소를 할당하고 가상 주소와 물리적 주소의 매핑을 생성해야 하므로 여기에는 시스템 호출이 필요합니다. 무슨 일이야?
첫 번째 대답은 다음과 같습니다. "(strace에 따라) 시스템 호출 없이 스택이 커지는 것을 발견했습니다. 따라서 이는 커널이 자동으로 스택을 커진다는 의미입니다(위의 "암시적"이 의미하는 것입니다). 즉, 프로세스에서 명시적인 mmap /mremap 없이 스택이 커집니다. " 스택을 "성장"하는 것이 커널의 작업이라면 왜 시스템 호출이 포함되지 않습니까?
힙에 대한 첫 번째 대답은 다음과 같습니다. "재사용으로 malloc 호출을 충족할 수 있는 경우, malloc 호출이 반드시 sbrk 또는 mmap 호출로 이어지지는 않습니다(Libc가 동적 메모리 할당을 구현하는 방법에 따라 다름). map" 이전에 해제된 메모리 영역입니다. "이것이 free list의 개념인 것 같습니다. 스택 할당도 동일한 개념을 사용합니까?
두 가지 할당에 대한 나의 기본적인 장점은 물리적 메모리를 할당해야 하고 VMA에서 물리적 메모리로의 매핑을 생성하여 시스템 호출이 발생해야 한다는 것입니다. 첫 번째 질문에 대한 답변에 링크된 Mel Gorman의 책을 읽어 보았지만 내 질문에 대한 의미 있는 답변을 찾을 수 없었습니다.
답변1
프로세스가 스택 맨 아래에 데이터를 쓰려고 시도하면 커널은 페이지 오류가 발생하는 것에 대한 응답으로 스택을 증가시킵니다. 이는 시스템 호출로 나타나지 않습니다.
시스템 호출은 커널이 관련된 유일한 방법이 아닙니다. 시스템 호출은 오류와 인터럽트도 처리합니다.
답변2
당신이 언급한 거의 모든 것은 가상 메모리와 관련이 없습니다. 가상 메모리는 동시에 독립적으로 발생합니다. 스택을 늘리는 것 외에도.
스택이 오버플로되면 커널이 스택을 늘릴 수 있습니다. 이는 스택 외부의 커널 설정 페이지가 존재하지 않도록 하여 수행할 수 있습니다. 프로세스가 인벤토리의 끝을 넘어 액세스를 시도하면 존재하지 않는 페이지를 읽거나 쓰므로 페이지 오류가 발생합니다. 그런 다음 커널은 해당 페이지(및 가능하면 더 많은 페이지)에 더 많은 메모리를 할당하고 매핑하고 새 끝 너머에 존재하지 않는 새 페이지를 배치합니다.
페이지 오류 처리와 시스템 호출 처리는 거의 동일하며 비용도 동일합니다. 사용자 모드 프로세스를 제외하고는 특별한 지침이 필요하지 않습니다. 대부분의 경우 페이지 폴트가 없기 때문에 속도가 더 빨라집니다.
시스템 호출은 trap
명령어(정확한 명령어는 프로세서 명령어 세트에 따라 다름) 명령어를 사용합니다. trap
명령어, 0으로 나누기, 인터럽트, 페이지 폴트 및 기타 몇 가지 사항은 동일한 방식으로 처리됩니다.