กลไกที่แน่นอนจะได้รับที่นี่บน Linux ในการจัดการความผิดหน้าในแมปที่ไม่ระบุชื่อคุณตรวจสอบเพื่อดูว่าจะเป็น "โตไม่จัดสรร"ที่คุณควรขยายเช่นสแต็ค ถ้าเรคคอร์ดพื้นที่ VM บอกว่าคุณควรเลือกปรับที่อยู่เริ่มต้นเพื่อขยายสแต็ก
เมื่อเกิดความผิดพลาดของหน้าขึ้นอยู่กับที่อยู่นั้นอาจมีการให้บริการ (และความผิดพลาดที่ถูกกำหนดไว้) ผ่านการขยายสแต็ก พฤติกรรม "การเพิ่มขึ้นของความผิดพลาด" นี้สำหรับหน่วยความจำเสมือนสามารถร้องขอได้โดยโปรแกรมผู้ใช้เองโดยมีการMAP_GROWSDOWN
ตั้งค่าสถานะผ่านไปยังmmap
syscall
คุณสามารถยุ่งกับกลไกนี้ในโปรแกรมผู้ใช้เช่นกัน:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
int main() {
long page_size = sysconf(_SC_PAGE_SIZE);
void *mem = mmap(NULL, page_size, PROT_READ|PROT_WRITE, MAP_GROWSDOWN|MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
if (MAP_FAILED == mem) {
perror("failed to create growsdown mapping");
return EXIT_FAILURE;
}
volatile char *tos = (char *) mem + page_size;
int i;
for (i = 1; i < 10 * page_size; ++i)
tos[-i] = 42;
fprintf(stderr, "inspect mappping for originally page-sized %p in /proc... press any key to continue...\n", mem);
(void) getchar();
if (munmap(mem, page_size))
perror("failed munmap");
return EXIT_SUCCESS;
}
เมื่อระบบแจ้งให้คุณค้นหา pid ของโปรแกรม (ผ่านps
) และดู/proc/$THAT_PID/maps
เพื่อดูว่าพื้นที่ดั้งเดิมเติบโตขึ้นอย่างไร
ulimit -s
)