You are on page 1of 10

PH†N M—M H› THÈNG

KHÐI ËNG CH×ÌNG TRœNH ÙNG DÖNG


Nguy¹n Húu ùc
Vi»n Cæng ngh» thæng tin v  Truy·n thæng
Tr÷íng ¤i håc B¡ch khoa H  Nëi
Qu¡ tr¼nh khði ëng ch÷ìng tr¼nh ùng döng

H» i·u h nh n¤p ch÷ìng tr¼nh ùng döng


T¤o ti¸n tr¼nh mîi
Chu©n bà khæng gian bë nhî
Chu©n bà c¡c thæng tin mæi tr÷íng
Chuyºn ¸n iºm v o ch÷ìng tr¼nh _start
Thüc hi»n ch÷ìng tr¼nh ÷ñc n¤p
Chu©n bà mæi tr÷íng thüc hi»n crt1.o
Gåi h m _main

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()

execve(const char *fn, char *argv[], char *env[])

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()

Kiºm tra magic number cõa t»p thüc thi


åc header cõa t»p thüc thi
L¥þ ÷íng d¨n cõa tr¼nh thæng dàch ùng döng
åc dentry object, file object, inode object cõa tr¼nh thæng
dàch ùng döng
Kiºm tra quy·n thüc hi»n v  c¡c thæng sè kh¡c cõa tr¼nh thæng dàch
ùng döng
Gi£i phâng t i nguy¶n cõa ti¸n tr¼nh hi»n t¤i (flush_old_exec())

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 b­t ¦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

You might also like