Professional Documents
Culture Documents
Nguy¹n Húu ùc (Vi»n CNTT & TT) Khði ëng ch÷ìng tr¼nh ùng döng 2 / 10
Khði ëng ch÷ìng tr¼nh ùng döng tø h» i·u h nh
Ch÷ìng tr¼nh ùng döng th÷íng ÷ñc thüc hi»n tø mët shell
Shell (ti¸n tr¼nh cha) t¤o mët ti¸n tr¼nh mîi (ti¸n tr¼nh con) b¬ng líi
gåi h» thèng fork()
Ti¸n tr¼nh con câ c§u tróc gièng h»t nh÷ ti¸n tr¼nh cha, ch¿ kh¡c ð
ành danh ti¸n tr¼nh
Ti¸n tr¼nh con gåi h m execve() º thüc hi»n n¤p v thüc thi ch÷ìng
tr¼nh ùng döng
Nguy¹n Húu ùc (Vi»n CNTT & TT) Khði ëng ch÷ìng tr¼nh ùng döng 3 / 10
V½ dö mët shell ìn gi£n
while(1) {
printf("> ");
scanf("%s", str); // fgets(str, 128, stdin);
// *strchr(str, '\n') = '\0';
if((pid = fork()) == 0) {
// child
execve(str); // argv, envp
}
wait(&status);
}
Nguy¹n Húu ùc (Vi»n CNTT & TT) Khði ëng ch÷ìng tr¼nh ùng döng 4 / 10
execve()
Thüc hi»n ch÷ìng tr¼nh ùng döng fn vîi danh s¡ch tham sè argv v
c¡c bi¸n mæi tr÷íng env
fn l ÷íng d¨n tîi t»p ùng döng
argv l mët m£ng con trä tîi c¡c x¥u kþ tü t÷ìng ùng vîi c¡c tham sè
dáng l»nh (ph¦n tû cuèi còng l NULL)
env l mët m£ng con trä tîi c¡c x¥u kþ tü t÷ìng ùng vîi c¡c bi¸n mæi
tr÷íng (k¸t thóc b¬ng NULL, méi ph¦n tû câ d¤ng key=value)
Nguy¹n Húu ùc (Vi»n CNTT & TT) Khði ëng ch÷ìng tr¼nh ùng döng 5 / 10
execve()
C§p ph¡t bë nhî cho c§u tróc linux_binprm mæ t£ thæng tin v· ùng
döng thüc thi
åc dentry object, file object, inode object cõa t»p thüc thi
Thüc hi»n prepare_binprm() º i·n thæng tin cho c§u tróc
linux_binprm
L÷u t¶n t»p thüc thi, tham sè dáng l»nh, bi¸n mæi tr÷íng l¶n mët
(ho°c nhi·u) trang bë nhî
Thüc hi»n search_binary_handler() º t¼m v n¤p h m thüc thi
(load_binary) t÷ìng ùng vîi ùng döng
Nguy¹n Húu ùc (Vi»n CNTT & TT) Khði ëng ch÷ìng tr¼nh ùng döng 6 / 10
execve()
Nguy¹n Húu ùc (Vi»n CNTT & TT) Khði ëng ch÷ìng tr¼nh ùng döng 7 / 10
execve()
nh x¤ trang l÷u tham sè v mæi tr÷íng l¶n khæng gian nhî cõa ùng
döng (setup_arg_pages())
C§p ph¡t bë nhî cho c¡c trang text, data, ... cõa ch÷ìng tr¼nh ùng
döng (do_mmap())
N¤p tr¼nh thæng dàch (load_elf_interp())
Thi¸t lªp c¡c g½a trà start_code, end_code, ....
C§p ph¡t bë nhî cho vòng bss (do_brk)
Thüc hi»n ch÷ìng tr¼nh ùng döng (start_thread)
Nguy¹n Húu ùc (Vi»n CNTT & TT) Khði ëng ch÷ìng tr¼nh ùng döng 8 / 10
Thüc hi»n ch÷ìng tr¼nh ùng döng
Ch÷ìng tr¼nh ùng döng bt ¦u tø kþ hi»u _start (ành ngh¾a trong
crt1.c)
Chu©n bà º gåi main()
«ng kþ c¡c ch÷ìng tr¼nh ÷ñc gåi khi k¸t thóc ch÷ìng tr¼nh
(atexit())
Gåi _init() (ành ngh¾a trong crtbegin)
Gåi main()
Gåi exit() n¸u luçng i·u khiºn ÷ñc tr£ v· tø main()
Nguy¹n Húu ùc (Vi»n CNTT & TT) Khði ëng ch÷ìng tr¼nh ùng döng 9 / 10
Thüc hi»n main()
| |
+-----------------------+ stack frame for main()
|ebp | <- ebp
+-----------------------+========
bfbf... |return address |
+-----------------------+
f5c8 |argc |
+-----------------------+
f5cc |argv |
+-----------------------+
f5d0 |env |
+-----------------------+
| |
...
| |
+-----------------------+
f618 | argv[0] | pointer to name of the command
| ... |
f61c | 0x0 |
+-----------------------+
f620 | env[0] |
| env[1] |
| env[2] |
| ... |
f6a8 | 0x0 |
+-----------------------+
...
+-----------------------+
f724 | *argv[0] | name of the command
+-----------------------+
f751 | POSTGRES_HOME=... |
fe9a | OBJFORMAT=elf |
+-----------------------+
Nguy¹n Húu ùc (Vi»n CNTT & TT) Khði ëng ch÷ìng tr¼nh ùng döng 10 / 10