[Pintos] Project2_User Programs | ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๋ฐฉํ–ฅ ๋ฐ ์ˆœ์„œ

๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ

  • PintOS์—์„œ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์ž์‹ ๋“ค์ด ์ปดํ“จํ„ฐ ์ „์ฒด๋ฅผ ์†Œ์œ ํ•œ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ์“ฐ์ธ๋‹ค.
  • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ์„ธ์Šค๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ, ์Šค์ผ€์ค„๋ง ๊ทธ ์™ธ ๋‹ค๋ฅธ ์ƒํƒœ๋“ค์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง„ ์ดํ™˜์ƒ์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์œ ์ € ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ์šด์˜์ฒด์ œ๋ฅผ ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  • ์œ ์ € ํ”„๋กœ๊ทธ๋žจ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ด ๋ฌธ์„œ์— ์ ํžŒ ๊ทœ์น™์„ ๋งŒ์กฑ์‹œํ‚ค๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด ๊ทœ์น™๋งŒ ์ง€ํ‚จ๋‹ค๋ฉด ์ปค๋„ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ๊ฑด ๋‹ค์‹œ ์งœ๋„ ๋œ๋‹ค.

Argument Passing (์ธ์ž ์ „๋‹ฌ)

  • ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ์ปค๋งจ๋“œ ๋ผ์ธ ์ธ์ž๋“ค์„ ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •
  • PintOS ๋Š” ์ปค๋งจ๋“œ ๋ผ์ธ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๋•Œ ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•  ์ปค๋งจ๋“œ ๋ผ์ธ ์ธ์ž๋“ค์€ process_exec() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋˜์–ด์•ผํ•œ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ธ์ž๋“ค์„ ์Šคํƒ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ €์žฅํ•˜๊ณ ,  ํ”„๋กœ๊ทธ๋žจ์ด min(int argc, char *argv[]) ํ˜•ํƒœ๋กœ ํ•ด๋‹น ์ธ์ž๋“ค์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.
  • ๊ฒฐ๋ก ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ธ์ž๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ณผ์ • ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค .
/* ...usrprog/prcoess.c */

/* ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ f_name์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
* ์‹คํŒจ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. */
int
process_exec (void *f_name) {
	char *file_name = f_name;
	bool success;

	/* We cannot use the intr_frame in the thread structure.
	 * This is because when current thread rescheduled,
	 * it stores the execution information to the member. */
	struct intr_frame _if;
	_if.ds = _if.es = _if.ss = SEL_UDSEG;
	_if.cs = SEL_UCSEG;
	_if.eflags = FLAG_IF | FLAG_MBS;

	/* We first kill the current context */
	process_cleanup ();

	/* And then load the binary */
	success = load (file_name, &_if);

	/* If load failed, quit. */
	palloc_free_page (file_name);
	if (!success)
		return -1;

	/* Start switched process. */
	do_iret (&_if);
	NOT_REACHED ();
}

์ฃผ์š” ๋‹จ๊ณ„

  • ์ปค๋งจ๋“œ ๋ผ์ธ ํŒŒ์‹ฑ
    • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ์‹œ ์ž…๋ ฅ๋œ ๋ช…๋ น์–ด ๋ฌธ์ž์—ด ์„ ๊ฐœ๋ณ„ ์ธ์ž๋กœ ๋‚˜๋ˆ ์•ผํ•œ๋‹ค. (๋ฌธ์ž์—ด ์˜ˆ : echo Hello World)
    • ๊ฐ ์ธ์ž๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„(echo)์™€ ์ธ์ž (Hello World)๋กœ ๊ตฌ๋ถ„๋œ๋‹ค .
  • ์Šคํƒ์— ์ธ์ž์ €์žฅ
    • ๊ฐ ์ธ์ž ๋ฌธ์ž์—ด์„ ์Šคํƒ์— ์ €์žฅํ•˜๊ณ , ๊ฐ ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ ๋ฐฐ์—ด(argv)๋ฅผ ์Šคํƒ์— ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค.
    • argv ๋ฐฐ์—ด์˜ ๋์—๋Š” NULL ํฌ์ธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด argv[argc]๊ฐ€ NULL์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค .
  • ๋ ˆ์ง€์Šคํ„ฐ ์„ค์ •
    • argc(์ธ์ž ๊ฐœ์ˆ˜) ๋ฅผ %rdi ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•˜๊ณ , argv์˜ ์ฃผ์†Œ๋ฅผ %rsi ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•œ๋‹ค. ์ด๋Š” x86-64 ํ˜ธ์ถœ ๊ทœ์•ฝ์— ๋งž๊ฒŒ main() ํ•จ์ˆ˜๊ฐ€ ์ธ์ž๋“ค์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • ์Šคํƒ ์ •๋ ฌ
    • ์Šคํƒ์ด 8๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ •๋ ฌ๋˜๋„๋ก ํ•ด์•ผํ•˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด (ํ•„์š”ํ•œ ๊ฒฝ์šฐ) ํŒจ๋”ฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค .

๊ตฌํ˜„ ๊ณผ์ œ

  • ๊ธฐ์กด process_exec() ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ํŒŒ์ผ ์ด๋ฆ„๋งŒ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ํ™•์žฅํ•˜์—ฌ ์ปค๋งจ๋“œ ๋ผ์ธ ์ „์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค .
    • ์ž…๋ ฅ ๋ฌธ์ž์—ด์„ ๊ณต๋ฐฑ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ณ„ ์ธ์ž๋กœ ํŒŒ์‹ฑ.
    • ๊ฐ ์ธ์ž๋ฅผ ์Šคํƒ์— ์ €์žฅํ•˜๊ณ , argv ๋ฐฐ์—ด๊ณผ argc ๊ฐ’์„ ์ ์ ˆํžˆ ์„ค์ •.
    • ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฒฝ๊ณ„๋‚˜ ์Šคํƒ ์ •๋ ฌ์„ ์œ ์ง€ํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰ ๋  ์žˆ๋„๋ก ๊ด€๋ฆฌ.

User Memory Access

  • ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ ์—‘์„ธ์Šค ๊ตฌํ˜„.
    • sysCall ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฒ•์„ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค . ๊ทธ๋ž˜์„œ System Calls ๊ณผ์ •๋ณด๋‹ค ๋จผ์ € ์ง„ํ–‰ํ•˜๋Š”๊ฒƒ๊ฐ™๋‹ค.
  • ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ง‰์•„์•ผ ํ•œ๋‹ค .

OS๊ฐ€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์ž์‹ ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

์ด ๊ณผ์ •์—์„œ ์šด์˜์ฒด์ œ๋Š” ์ปค๋„์ด ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์— ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ๊ณตํ•˜๊ณ , ์ด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ

์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค .

PintOS ๋Š” ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์ปค๋„์ด ์ œ์–ดํ•ด์•ผํ•œ๋‹ค.

 

์ฃผ์š” ๊ฐœ๋…

  • ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ์™€ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ
    • PintOS ๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ปค๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ตฌ๋ถ„ํ•˜์—ฌ, ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์ง์ ‘์ ์œผ๋กœ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค
    • ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ ์ž์‹ ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋‚ด์—์„œ๋งŒ ์‹คํ–‰ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ปค๋„์€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ
    • ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ ์ปค๋„ ์˜์—ญ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋งŒ์•ฝ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ ํŽ˜์ด์ง€ ํดํŠธ (Page Fault) ๋ฅผ ๋ฐœ์ƒ ์‹œ์ผœ์•ผ ํ•œ๋‹ค.
    • ์ปค๋„์€ ์ด๋Ÿฌํ•œ ํŽ˜์ด์ง€ ํดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ ์ ˆํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ๋“ฑ์˜ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜์žˆ๋‹ค .
  • ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€ ๊ด€๋ฆฌ
    • PintOS ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ 4KB ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ๊ฐํŽ˜์ด์ง€๋Š” ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ณ ์œ ํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค.
    • ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ๋•Œ ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ์œ ํšจํ•œ์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋ฉฐ, ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด ํŽ˜์ด์ง€ ํดํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

์ฃผ์š” ๋‹จ๊ณ„

  • ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์‹œ๋„
    • ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์‚ฌ์šฉ์ž ์˜์—ญ ๋‚ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
    • ๋งŒ์•ฝ ์œ ํšจํ•œ ์‚ฌ์šฉ์ž ์˜์—ญ ๋‚ด์˜ ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ํŽ˜์ด์ง€ ํดํŠธ (Page Fault)๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ปค๋„์€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ํŽ˜์ด์ง€ ํดํŠธ (Page Fault) ์ฒ˜๋ฆฌ
    • ํŽ˜์ด์ง€ ํดํŠธ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ž์‹ ์—๊ฒŒ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์™ธ๋ถ€๋ฅผ ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.
    • ํŽ˜์ด์ง€ ํดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜์ธ page_fault()์—์„œ, ํ•ด๋‹น ์ฃผ์†Œ๊ฐ€ ์ปค๋„ ์˜์—ญ์— ์†ํ•˜๋Š”์ง€, ํ˜น์€ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ์ž ์˜์—ญ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์ด๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ด ์˜ฌ๋ฐ”๋ฅด๋ฉด ์ปค๋„์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ
    • ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค .
    • ์ปค๋„์€ ๊ฐ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ๊ด€๋ฆฌํ•˜๊ณ , ์ดํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์ œ์–ดํ•œ๋‹ค .
  • ์Šคํƒ ํ™•์žฅ
    • ํ”„๋กœ๊ทธ๋žจ์ด ์Šคํƒ์„ ์‚ฌ์šฉ ํ•  ๋–„ ์Šคํƒ์ด ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
    • ์Šคํƒ์ด ํ™•์žฅ๋  ๋Œ€๋งˆ๋‹ค, ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค . (์œ ํšจํ•œ ์ฃผ์†Œ๋กœ๋งŒ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค . )

๊ตฌํ˜„๋‚ด์šฉ

[๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ํŽ˜์ด์ง€ ํดํŠธ ์ฒ˜๋ฆฌ , ์Šคํƒ ๊ด€๋ฆฌ , ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ]

์ด๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๊ณ  , ์ปค๋„์ด ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์ฒ˜๋ฆฌ ํ•ด์•ผํ•œ๋‹ค…


System Calls

  • System Calls ์ด๋ž€?
    • PintOS์—์„œ System Call๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ ์ด ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ด๋‹ค.
  • ์šฐ๋ฆฌ๋Š” userprog/syscall.c ์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.
  • ๊ฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฒˆํ˜ธ๋Š” include/lib/syscall-nr.h ์— ์ •์˜ ๋˜์–ด์žˆ๋‹ค.
  • ์˜ค๋Š˜๋‚  syscall ๋ช…๋ น์–ด๋Š” x86-64์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ˆ˜๋‹จ์ด๋‹ค.
  • Pintos ์—์„œ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์€ syscall์„ ํ˜ธ์ถœํ•˜์—ฌ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•œ๋‹ค.
  • ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฒˆํ˜ธ์™€ ์ถ”๊ฐ€ ์ธ์ˆ˜ syscall ๋ช…๋ น์–ด๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์ผ๋ฐ˜ ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ ˆ์ง€์Šคํ„ฐ์— ์„ค์ •๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์€ ์˜ˆ์™ธ ์ด๋‹ค.
    • %rax ๋Š” system call ๋ฒˆํ˜ธ ์ด๋‹ค.
    • ๋„ค๋ฒˆ์งธ ์ธ์ž๋Š” %rcx๊ฐ€ ์•„๋‹ˆ๋ผ %r10์ด๋‹ค.

syscall_handler() ๊ฐ€ ์ œ์–ด๊ถŒ์„ ์–ป์œผ๋ฉด ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฒˆํ˜ธ๋Š” rax์— ์žˆ๊ณ  ์ธ์ˆ˜๋Š” %rdi, %rsi, %rdx, %r10, %r8, %r9 ์ˆœ์„œ๋กœ ์ „๋‹ฌ๋œ๋‹ค. ํ˜ธ์ถœ์ž์˜ ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์ „๋‹ฌ๋œ  struct intr_frame์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ด๊ฑด ์ปค๋„์Šคํƒ์— ์žˆ์Œ.. ) ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•œ x86-64 ๊ทœ์น™์€ RAX ๋ ˆ์ง€์Šคํ„ฐ์— ๊ฐ’์„ ๋ฐฐ์น˜ํ•˜๋Š”๊ฒƒ์ด๋‹ค . ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ struct intr_frame ์˜ rax ๋ฉค๋ฒ„๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. ์‹œ์Šคํ…œ ์ฝœ ๋ฒˆํ˜ธ ๋งคํ•‘ (syscall_table ๋“ฑ)

2. ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ๊ตฌํ˜„ (๊ฐ ์‹œ์Šคํ…œ ์ฝœ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ ์ž‘์„ฑ)

3. ์‹œ์Šคํ…œ ์ฝœ ์ธ์ž ์ถ”์ถœ ๋ฐ ์ฒ˜๋ฆฌ (์˜ˆ: exit(), exec() ๋“ฑ)

4. ํ”„๋กœ์„ธ์Šค ๊ด€๋ จ ์‹œ์Šคํ…œ ์ฝœ (exit(), exec(), wait())

5. ํŒŒ์ผ I/O ์‹œ์Šคํ…œ ์ฝœ (open(), read(), write(), close())

6. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

7. ์‚ฌ์šฉ์ž-์ปค๋„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ (์•ˆ์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๊ด€๋ฆฌ)

 


Process Termination Message

์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋ฅผ ํ˜ธ์ถœ ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ธํ•ด ์ข…๋ฃŒ ๋ ๋•Œ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค์˜ ์ด๋ฆ„๊ณผ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•œ๋‹ค.

printf(“%s: exit(%d)\\n”, …);

๊ธฐ์กด ๊ตฌํ˜„๋˜์–ด ์žˆ๋˜ process_exit(void) ํ•จ์ˆ˜์— ์œ ์ € ์Šค๋ ˆ๋“œ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ถ„๊ธฐ์ฒ˜๋ฆฌ , ์ถœ๋ ฅ ์ฒ˜๋ฆฌ ํ•ด์•ผํ•œ๋‹ค .


Deny Write On Executables

์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ๋””์Šคํฌ์—์„œ ์ˆ˜์ •๋˜๊ณ  ์žˆ๋Š” ๋„์ค‘์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ทธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ OS๋Š” ์ด๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

์ด๋Š” ํ”„๋กœ์ ํŠธ 3์—์„œ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ตฌํ˜„๋œ ์ดํ›„์— ํŠนํžˆ ์ค‘์š”ํ•ด์ง€๋Š” ๋ถ€๋ถ„์ด๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ์šด์˜์ฒด์ œ์˜ ๋ณด์•ˆ๊ณผ ์•ˆ์ •์„ฑ์„ ๋†’์ด๋Š”๋ฐ ํ•„์ˆ˜์ ์ด๋‹ค.

๋งŒ์•ฝ ์‹คํ–‰ ์ค‘์ธ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜์•  ์ˆ˜์ • ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์•…์„ฑ ์ฝ”๋“œ๋‚˜ ๋น„์ •์ƒ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ  ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์œ ๋ฐœํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ์šด์˜์ฒด์ œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ ํŒŒ์ผ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ์ œํ•œํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•œ๋‹ค.

  • ํŒŒ์ผ ์—ด๊ธฐ ์‹œ ์“ฐ๊ธฐ ์ œํ•œ ์„ค์ •:
    • filesys_open() ํ•จ์ˆ˜๋‚˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ด€๋ จ ํ•จ์ˆ˜์—์„œ ํŒŒ์ผ์ด ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๊ณ , ์‹คํ–‰์ค‘์ด๋ผ๋ฉด ์“ฐ๊ธฐ ์ ‘๊ทผ์„ ์ œํ•œํ•ด์•ผํ•œ๋‹ค.
    • ํŒŒ์ผ์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ ํ•ด๋‹น ํŒŒ์ผ์„ writeable ์†์„ฑ์„ false ๋กœ ์„ค์ •ํ•˜์—ฌ ์“ฐ๊ธฐ ์ž‘์—…์„ ์ œํ•œํ•œ๋‹ค.
  • ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ๋•Œ ์„ค์ •:
    • process_execute() ํ•จ์ˆ˜๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ํŒŒ์ผ์„ ๋กœ๋“œํ•  ๋•Œ, ํ•ด๋‹น ํŒŒ์ผ์˜ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ์ œํ•œํ•œ๋‹ค .
    • ์‹คํ–‰ ์ค‘์ธ ํŒŒ์ผ ๊ฐ์ฒด์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ํŒŒ์ผ์„ ์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์—ด ์ˆ˜ ์—†๋„๋ก ํ•œ๋‹ค.
  • ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ์‹œ ๊ถŒํ•œ ํ•ด์ œ:
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ ๋  ๋•Œ, ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ์‹คํ–‰ ํŒŒ์ผ์˜ ์“ฐ๊ธฐ ์ œํ•œ์„ ํ•ด์ œ ํ•ด ์ค€๋‹ค.
    • process_exit() ํ•จ์ˆ˜์—์„œ ๊ด€๋ จ ํŒŒ์ผ ๊ฐ์ฒด์˜ ์“ฐ๊ธฐ ์ œํ•œ์„ ํ•ด์ œ ํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค์‹œ ์“ฐ๊ธฐ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค .

๊ตฌํ˜„๋‚ด์šฉ

  • Sturct file ์—์„œ deny_write ํ”Œ๋ž˜๊ทธ ์ถ”๊ฐ€ (true or false ? )
  • ํŒŒ์ผ์ด ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ด๊ณ  deny_write ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ํŒŒ์ผ์„ ์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์—ด์ˆ˜ ์—†๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •
  • file_deny_write() ํ•จ์ˆ˜: ํŒŒ์ผ ๊ฐ์ฒด์— ์“ฐ๊ธฐ ์ œํ•œ์„ ์„ค์ •ํ•˜๋Š” ํ•จ์ˆ˜. ์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ํŒŒ์ผ์— ๋Œ€ํ•ด ํ˜ธ์ถœ๋œ๋‹คํ•œ๋‹ค.
  • file_allow_write() ํ•จ์ˆ˜: ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ํŒŒ์ผ ๊ฐ์ฒด์— ์“ฐ๊ธฐ ์ œํ•œ์„ ํ•ด์ œํ•˜๋Š” ํ•จ์ˆ˜๋‹ค .

๋™์‹œ์„ฑ ๋ฌธ์ œ

  • ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์— ์ ‘๊ทผํ•  ๋•Œ, ์“ฐ๊ธฐ ์ œํ•œ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜๊ณ  ํ•ด์ œ๋˜๋Š”์ง€ ํ™•์ธํ• ๊ฒƒ
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ lock์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•ด์•ผํ• ์ˆ˜๋„ ์žˆ์Œ

ํŒŒ์ผ ๋‹ซ๊ธฐ ์‹œ ์ฒ˜๋ฆฌ

  • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜  ํŒŒ์ผ์ด ๋‹ซํ˜”์„ ๋•Œ ์“ฐ๊ธฐ ์ œํ•œ์ด ํ•ด์ œ ๋˜๋„๋ก ์ž˜ ์ฒ˜๋ฆฌํ•ด์•ผํ• ๋“ฏ.

Extend File Descriptor

ํ•€ํ† ์Šค๊ฐ€ ๋ฆฌ๋ˆ…์Šค์˜ stdin, stdout๋ฅผ ๋‹ซ๋Š” ๊ธฐ๋Šฅ๊ณผ dup2 ์‹œ์Šคํ…œ ์ฝœ์„ ์ง€์›ํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค.

Open, close, read, write ์‹œ์Šคํ…œ ์ฝœ์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ†ตํ•ด ๊ณผ์ผ๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ํ…Œ์ด๋ธ”์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ํŒŒ์ผ๊ณผ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  • Open: ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์—ด์–ด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ…Œ์ด๋ธ”์— ๋“ฑ๋กํ•œ๋‹ค.
  • Close: ํŠน์ • ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‹ซ๊ณ  ํ…Œ์ด๋ธ”์—์„œ ์ œ๊ฑฐํ•˜๋ฉฐ, ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•œ๋‹ค.
  • Read / write: ํŠน์ • ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ด๋‹ค.

๊ตฌํ˜„๋‚ด์šฉ

  • Open, close, read, write ์‹œ์Šคํ…œ ์ฝœ์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ตฌํ˜„