как же так?

Jun 03, 2019 09:31


СЯО (Сегодня я осознал) что что-то не консистентно в моём понимании мироустройства.

Смотрите:

1. ядро может выкидывать страницы кода из памяти, потому что может подгрузить его в любой момент обратно. Удаление файла (насколько я понимаю) не проблема, потому что файл открыт. Предполагается, что содержимое text не меняется, потому что это бинарь, а ( Read more... )

linux

Leave a comment

Comments 17

tzirechnoy June 3 2019, 07:59:18 UTC
Так все ссылки на внешние символы собираются в особые таблицы, которые мапятся по фиксированным адресам относительно кода, и потом код получает эти ссылки через косвенную адресацыю ( ... )

Reply

amarao_san June 3 2019, 09:40:08 UTC
Погоди, ещё раз: у меня простой бинарник. Забыли про разделяемые библиотеки. Весь бинарник пронизан ссылками на функции и jmp, которые (очевидно) фиксятся процессингом relocation table. Что-то из этого может быть выкинуто из памяти (без свопа) и загружено обратно в память из исполняемого файла?

Reply

tzirechnoy June 3 2019, 09:45:43 UTC
У бинарника без разделяемых библиотек все размеры и относительные адреса станут известны при сборке и прописаны тогда жэ.

Reply

amarao_san June 3 2019, 09:49:12 UTC
Ты говоришь про относительные адреса. Насколько я знаю, во время загрузки ELF'а (так же как и MZ/PE) куча адресов является абсолютными, т.е. заполняются loader'ом в соответствии с relocation table. В оригинальном файле нули, а потом в них пишутся адреса с поправкой на то, по какому адресу был загружен .text. Он разный, каждый раз, благодаря ASLR (https://en.wikipedia.org/wiki/Address_space_layout_randomization).

Вопрос: а есть ли в .text страницы, которые не затрагиваются процессом релокации?

Reply


qehgt June 3 2019, 20:52:46 UTC
2. Kernel мало знает про ELF, так как он сложный. Для загрузки ELF есть elf-interpreter / dynamic linker, который и отвечает за remapping адресов (ld-linux-bla-bla.so). Соответственно, если page выгрузили (либо не ещё не загрузили), её всегда можно считать снова и опять подправить адреса.

Reply

amarao_san June 4 2019, 10:00:42 UTC
1. Твой ответ противоречит соседнему ответу.
2. Я не верю, что ядро будет вызывать userspace-процесс для page-in.

Reply

tzirechnoy June 4 2019, 12:33:16 UTC
На самом деле ядро довольно много знает про ELF. Про динамические библиотеки и ссылки на них в ELF - да, ничего, потому вместо динамического бинарника грузится указанный у него в заголовке статический /lib/ld-linux.so.XX , а в остальном - разбирает заголовки, мапит разные секцыи, находит entry point - немало в общем.

Reply


Leave a comment

Up