Я пишу очень простой загрузчик процессов для Linux. Исполняемые файлы, которые я загружаю, уже скомпилированы, и я знаю, где каждый из них ожидает найти в памяти. Первый подход, который я пробовал, заключался в использовании mmap()
для ручного размещения каждого кода или раздела данных в правильном месте, например
mmap(addr, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0)
который segfaults, если я не удалю флаг MAP_FIXED, потому что, кажется, адрес одного блока конфликтует с чем-то уже в памяти, возможно, даже с самим загрузчиком; адрес 0x401000
кажется проблемным.
Я даже не знаю, с чего начать. Друг предложил виртуализировать операции доступа к памяти; Я не уверен, какие удары по производительности я бы взял для этого, и я понятия не имею, как это делается, но это может быть вариантом. Что бы я действительно хотел сделать, так это создать «пустой» процесс, который, насколько это возможно, имел бы полный доступ к памяти, поэтому ничего не загружалось бы в пользовательское пространство, пока я этого не захочу. Вся концепция «пустого» процесса может быть бессмысленной, но это лучший способ описать то, что я хочу. Я очень отчаянно нуждаюсь в некоторых ссылках или примерах, которые могли бы мне помочь.
exec
? - person Mark B   schedule 30.07.2012exec
просто запускал бы исполняемый файл, который не был бы загрузчиком процесса. - person emprice   schedule 30.07.2012:DOSWin:M::MZ::/usr/bin/my_app:
, если бы использовал это. - person emprice   schedule 30.07.2012mmap()
вызывает ошибку сегментации или вы забыли проверить возвращаемое значение иerrno
? - person Michał Górny   schedule 31.07.2012mmap()
на самом деле segfaults. Когда я прошел код вgdb
, он вылетел на строке сmmap()
. Я никогда не пытался использовать адрес, который он возвращал. - person emprice   schedule 31.07.2012mov eax, 4; add eax, 5; ret
скомпилирован сfasm
. Я хотел бы в конечном итоге добраться до точки, где я мог бы загружать как динамически, так и статически связанные приложения, но я еще не достиг этого. - person emprice   schedule 31.07.2012