[CaSys Lab] ์์ฌ ์ ์ ์ ์ ๋ฐ ํ๋ก์ ํธ 1์ฐจ - ํ๋ก๊ทธ๋๋ฐ ๋ฉ
- Duration : 2021-11-04 ~ 2021-11-14
- Mentor : Bokyung Cha
-
์๊ตฌ ์ฌํญ์ด์๋ ๋ชจ๋ ํํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ตฌํํ์์ต๋๋ค.
- Part 1: All-at-once loading, Demand loading, Memory access errors, Interface
- Part 2: Return to the program loader (Option 1, 2 ๋ชจ๋), Back-to-back loading, User-level threading
-
๋ชจ๋ ํํธ์ ๋ํด์ All-at-once / demand loader๋ฅผ ๋ชจ๋ ๊ตฌํํ์์ต๋๋ค. (apager.c, dpager.c)
-
๋ชจ๋ ํํธ์ ๋ํด์ makefile์ ์์ฑํ์์ต๋๋ค. (์ปดํ์ผ: $ make [apager | dpager | test], ์คํ: $ make [run_apager | run_dpager])
-
์ต๋ํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ ค ๋ ธ๋ ฅํ์๊ณ , loader์ ๊ทธ ์์์ ๋์ํ๋ ํ๋ก๊ทธ๋จ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ๊ธฐ ์ํด ํฐํธ ์คํ์ผ๋ง์ ํ์์ต๋๋ค.
-
์ฒจ๋ถ๋๋ฆด ์์ค ์ฝ๋์ ์ฃผ์ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
part-1/ (Part 1) apager.c dpager.c common.c (All-at-once, Demand loader์์ ๊ณตํต๋๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ ์ฝ๋) Makefile example/ (ํ ์คํธ ์ฝ๋ ๋๋ ํฐ๋ฆฌ) my_test.c (์ง์ ์์ฑํ ํ ์คํธ ์ฝ๋) part-2/ (Part 2) option-1/ (Option 1: return_to_loader() ๋ฐฉ์) 2-back_to_back/ (Back-to-back loader) apager.c dpager.c common.c (All-at-once, Demand loader์์ ๊ณตํต๋๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ ์ฝ๋) Makefile 3-thread/ (User-level threading) apager.c dpager.c common.c (All-at-once, Demand loader์์ ๊ณตํต๋๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ ์ฝ๋) queue.c (์ค์ผ์ค๋ง์์ ์ฐ์ด๋ Ready queue๊ฐ ๊ธฐ๋ฐํ๋ generic Queue ์๋ฃ๊ตฌ์กฐ ๊ตฌํ ์ฝ๋) Makefile interrupt.c (return_to_loader(), yield()๊ฐ ์ ์๋์ด ์๊ณ ํ ์คํธ ์ฝ๋ ๋จ์ include๋๋ ์ฝ๋) example/ (ํ ์คํธ ์ฝ๋ ๋๋ ํฐ๋ฆฌ) yield/ (User-level threading์์ yield() ํ ์คํธ ์ฝ๋) a.c (A-1 -> A-2 -> A-3 -> return) b.c (B-1 -> B-2 -> B-3 -> return) c.c (C-1 -> C-2 -> C-3 -> return) โฆ (Part 2 ํ ์คํธ์ฉ์ผ๋ก ์ฃผ์ด์ง ์ฝ๋๋ค) my_test.c (์ง์ ์์ฑํ ํ ์คํธ ์ฝ๋) option-2/ (์์ค ์ฝ๋ ์์ ์ด ์๋ ๋ฐฉ์) 2-back_to_back/ (Back-to-back loader) apager.c dpager.c common.c (All-at-once, Demand loader์์ ๊ณตํต๋๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ ์ฝ๋) Makefile example/ (ํ ์คํธ ์ฝ๋ ๋๋ ํฐ๋ฆฌ) โฆ (Part 2 ํ ์คํธ์ฉ์ผ๋ก ์ฃผ์ด์ง ์ฝ๋๋ค) my_test.c (์ง์ ์์ฑํ ํ ์คํธ ์ฝ๋)
-
Part 1์ ๋ชจ๋ ๊ตฌํ ์ฝ๋๋ ์ ๊ฐ ์ง์ ์์ฑํ ํ ์คํธ ํ์ผ(my_test.c)์ ๋ํด์ ์ ์ ์๋์ ํ์ธํ์์ต๋๋ค.
- ์ ๊ฐ ์ง์ ์์ฑํ ํ ์คํธ ํ์ผ(my_test.c)์ ๋ํด์ ์ ์ ์๋ํ์์ต๋๋ค.
- Demand loader์์, ์ง์ง๋ก segmentation fault๊ฐ ๋ฐ์ํ๋ ์ํฉ์ signal handling ํจ์์์ ์ ์ ํ ์ฒ๋ฆฌํ์ฌ ์ข ๋ฃ์ํด์ ํ์ธํ์์ต๋๋ค.
-
Part 2์ ๋ชจ๋ ๊ตฌํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ํ ์คํธ๋ฅผ ๋ชจ๋ ๊ฑฐ์ณค์ต๋๋ค.
- Part 2 ํ ์คํธ์ฉ์ผ๋ก ์ ๋ฌ๋ฐ์ ์ฝ๋๋ค(segfault.c ์ ์ธ)๊ณผ, ์ง์ ์์ฑํ ํ ์คํธ ์ฝ๋(my_test.c)๋ฅผ ๊ฐ์ด ์คํํ์์ ๋ ์ ์ ์๋ํ์์ต๋๋ค.
- ์ ๊ฐ ์ง์ ์์ฑํ ํ ์คํธ ํ์ผ(my_test.c)๋ฅผ 8๋ฒ ์ค๋ณต ์คํํ์ ๋ ์ ์ ์๋ํ์์ต๋๋ค.
- User-level threading์ ๊ฒฝ์ฐ, ์ง์ ์์ฑํ yield/a.c, yield/b.c, yield/c.c 3๊ฐ์ ์ฝ๋์์ yield()๋ฅผ ๊ต๋๋ก ์ ํธ์ถํ๋ ๊ฒ์ ํ์ธํ์์ต๋๋ค.
-
Part 2์์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ ํ์ฌ loader๋ก ๋ณต๊ทํ๋ ๋ฐฉ์์ system call๊ณผ ISR์ ์ฐฉ์ํ์ต๋๋ค. ๊ตฌํํ ISR ํจ์์ ์ฃผ์๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ๋๊ธฐ๊ณ , setjmp(), longjmp()๋ฅผ ํตํด ํ์ฌ ๋งฅ๋ฝ์ ์ ์ฅํ๊ณ ์๋ํธ์ผ๋ก jumpํ๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ฑ๊ณตํ์ต๋๋ค.
-
Part 2์ Back-to-back loader์์ ํ ์คํธ ์ฝ๋์ ์์ ์์ด loader๋ก ๋ค์ ๋ณต๊ทํ๋ ๋ฐฉ์์ loader๋ฅผ fork์ํค๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ฑ๊ณตํ์์ต๋๋ค.
-
Part 2์ Return to the program loader ์ฝ๋๋ Back-to-back loading ์ฝ๋์ ๋ถ๋ถ ์งํฉ์ด๋ผ ์๊ฐํ์ฌ, ๋ฐ๋ก ๋ถ๋ฆฌํ์ง ์๊ณ Back-to-back loading๋ถํฐ ๊ตฌํ ์ฑ๊ณตํ์์ต๋๋ค.
-
Part 2์ User-level threading์ ๊ฒฝ์ฐ, ์ต๋ 8๊ฐ์ thread๊น์ง ์คํํ ์ ์๋๋ก ํ์์ต๋๋ค. ๋จ, static linking ๊ธฐ๋ฐ์ด๋ฏ๋ก ๊ฐ thread๋ 0x1000000 ~ 0x5000000์ ๊ณต๊ฐ์ ๊ท ๋ฑํ๊ฒ ๋๋ ์์ญ์ ์ ์ ํ load๋๋๋ก ์ปดํ์ผ ์ต์ ์ ์ ์ฉ์์ผฐ์ต๋๋ค.