Инициализация приложения в Linux - PullRequest
1 голос
/ 02 февраля 2010

Я отчаянно ищу более или менее подробное описание того, как приложение загружается в память и затем выполняется в Linux. В основном, я хотел бы знать, какая информация читается из файла ELF, какие системные вызовы выполняются, например, exec () пока эта информация не будет сохранена в дескрипторе процесса.

Кто-нибудь знает хорошее описание? Доктор Гугл пока не очень помог

Спасибо

Ответы [ 3 ]

2 голосов
/ 02 февраля 2010

strace поможет вам с системными вызовами, и вот что вы получаете за запуск strace на себе:

[root@sting httpd]# strace strace
execve("/usr/bin/strace", ["strace"], [/* 27 vars */]) = 0
brk(0)                                  = 0x9aa3000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7873000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=90632, ...}) = 0
mmap2(NULL, 90632, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb785c000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20-\\\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=2403884, ...}) = 0
mmap2(0x5ac000, 1526120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x5ac000
mmap2(0x71b000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16e) = 0x71b000
mmap2(0x71e000, 10600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x71e000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb785b000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb785b6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0x71b000, 8192, PROT_READ)     = 0
mprotect(0x5a8000, 4096, PROT_READ)     = 0
munmap(0xb785c000, 90632)               = 0
brk(0)                                  = 0x9aa3000
brk(0x9ac4000)                          = 0x9ac4000
write(2, "usage: strace [-dffhiqrtttTvVxx]"..., 1655usage: strace [-dffhiqrtttTvVxx] [-a column] [-e expr] ... [-o file]

0 голосов
/ 05 февраля 2010

Не так практично, как в первом посте, но я нашел следующие статьи хорошими, когда мне нужно было получить большую картину:

http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html

http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory

http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory

Блог Густаво Дуарте, человека, написавшего последние две статьи, также полон большой общей информации об операционных системах. Я настоятельно рекомендую прочитать это.

0 голосов
/ 03 февраля 2010

Вы можете начать с дерева исходных текстов ядра в файле fs / binfmt_elf.c и работать (предположительно вверх) оттуда. Содержит загрузчик SVR4 ELF.

Если вам нужен другой загрузчик, я думаю, он должен быть в той же области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...