Этот фрагмент не является программой, которую я пишу. Это показывает, почему мне приходится хранить в памяти все имена файлов одновременно:
Код: Выделить всё
DIR *dir = opendir(".");
for (struct dirent *entry; (entry = readdir(dir);)
unlink(entry->d_name); // DANGER DO NOT RUN ME
Почти вся память программы должна состоять из одного буфер, содержащий все имена файлов в каталоге, поэтому я подумываю объявить структуру памяти, которая выглядит следующим образом (ASLR включен, поэтому 0 на самом деле не является 0):
Код: Выделить всё
000000000 ELF header
000000118 Program code
000001000 work buffers
000002000 begin stretchy array
400002000 no man's land (mapped with 0 access so anything hitting it faults)
400003000 top of stack
400005000 bottom of stack
Что нужно обсудить, так это большой эластичный массив. Управление несмежным массивом является раздутым, и у нас есть MMU, поэтому ему не обязательно быть непрерывным в физической памяти. Я видел этот трюк когда-то давно, в системе, которой было все равно, потому что она была однопользовательской. Я понятия не имею, вызовет ли это проблемы в многопользовательском компьютере.
Поведение, которое я хочу, должно быть очевидным. Память не выделяется, пока к ней не прикоснутся. А пока это ничего. Итак, насколько плохо говорить, что у меня есть сегмент BSS объемом 16 ГБ и я использую только то, что мне действительно нужно? Поскольку он такой большой, мне нужно быть абсолютно уверенным, что стек его не встретит, поэтому динамическое выделение адресного пространства с помощью mmap() — это не запуск.
Альтернативная гипотеза: теоретически, если есть способ выразить это в формате PE, я мог бы просто зарезервировать память при запуске и зафиксировать ее по мере необходимости. Согласно справочной странице, невозможно указать зарезервировать 16 ГБ адресного пространства в mmap и пока не выделять его.
Я записал заголовки ELF с пустыми программа (
Код: Выделить всё
mov al, 60 ; syscall
Подробнее здесь: https://stackoverflow.com/questions/790 ... ss-segment