PINTOS - Argument Passing / Introduction

JinJinJaraยท2023๋…„ 10์›” 3์ผ
0

PINTOS

๋ชฉ๋ก ๋ณด๊ธฐ
4/10

Directory

Project 2

(cํŒŒ์ผ์€ userprog, hํŒŒ์ผ์€ include/userprog ์— ์žˆ๋‹ค)
๐Ÿ“‚ uerpog/ : user program loader์˜ ์†Œ์Šค์ฝ”๋“œ

  • process.c,ย process.h : ELF ๋ฐ”์ด๋„ˆ๋ฆฌ(=ELF ์‹คํ–‰ํŒŒ์ผ)๋“ค์„ ๋กœ๋“œํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰

  • syscall.c,ย syscall.h : part2์—์„œ ์‹œ์Šคํ…œ ์ฝœ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰

    • ์‹œ์Šคํ…œ ์ฝœ ํ•ธ๋“ค๋Ÿฌ : ์œ ์ € ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ผ๋ถ€ ์ปค๋„ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ• ๋•Œ๋งˆ๋‹ค ์‹œ์Šคํ…œ ์ฝœ์ด ํ˜ธ์ถœ
  • exception.c,ย exception.h : ์˜ˆ์™ธ์‚ฌํ•ญ ์ฒ˜๋ฆฌ (page_fault() ์ˆ˜์ • )

    • ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ํŠน๋ณ„ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ•„์š”๋กœ ํ•˜๊ฑฐ๋‚˜ ๊ธˆ์ง€๋œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ด๋Š” exception ๋˜๋Š” fault๋กœ ์ปค๋„ ๋‚ด๋กœ ํŠธ๋žฉ
  • gdt.c,ย gdt.h : x86-64๋Š” segmented ์•„ํ‚คํ…์ณ

    • Global Descriptor Table (GDT) : ์‚ฌ์šฉ์ค‘์ธ ์„ธ๊ทธ๋จผํŠธ๋“ค์„ ์•Œ๋ ค์ฃผ๋Š” ํ‘œ
  • tss.c,ย tss.h : Task-State Segment (TSS)๋Š” x86 ์•„ํ‚คํ…์ณ์˜ ๋ฌธ๋งฅ๊ตํ™˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ x86-64์—์„œ ๋ฌธ๋งฅ๊ตํ™˜(context switching = task switching)์€ ์ง€์›์ด ์ค‘๋‹จ๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ TSS๋Š” ์—ฌ์ „ํžˆ ring switching ๋™์•ˆ ์Šคํƒ ํฌ์ธํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“‚ filesys/ : ๊ธฐ๋ณธ์ ์ธ file system์˜ ์†Œ์Šค์ฝ”๋“œ

๐Ÿ“‚lib/ : ํ‘œ์ค€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€๋ถ„์ด ๊ตฌํ˜„๋˜์–ด์žˆ์Œ

  • ์ด ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ฝ”๋“œ๋“ค์€ Pintos ์ปค๋„๊ณผ ๊ทธ ์ปค๋„์—์„œ ๋™์ž‘ํ•˜๋Š” user program์œผ๋กœ ์ปดํŒŒ์ผ๋จ
    (์•ฝ๊ฐ„์˜ ์ฝ”๋“œ ์ˆ˜์ • ํ•„์š” )

๊ธฐํƒ€

๐Ÿ“‚ include/lib/kernel/ : Pintos ์ปค๋„์—๋งŒ ํฌํ•จ๋œ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€

  • bitmaps, doubly linked lists, hash tables ๊ฐ™์€ ์ž๋ฃŒํ˜•์ด ๊ตฌํ˜„
  • ์ปค๋„์—์„œ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ : #include <...> ํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉ

๐Ÿ“‚ include/lib/user/ : Pintos user programs ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€

  • user programs์—์„œ, ์ด ๋””๋ ‰ํ† ๋ฆฌ์˜ ํ—ค๋”๋“ค์€ #include <...> ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํฌํ•จ

๐Ÿ“‚ examples/ : project 2 ์—์„œ ์‚ฌ์šฉํ•  user programs ์šฉ ์˜ˆ์ œ๋“ค


Building

๐Ÿ“‚ Makefile : pinots/src/Makefile.build ์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ, kernel์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…

๐Ÿ“‚ kernel.o : ์ปค๋„ ์ „์ฒด์„ ์œ„ํ•œ Object file

  • ๊ฐ๊ฐ์˜ ์ปค๋„ ์†Œ์Šค ํŒŒ์ผ๋“ค์—์„œ ์ปดํŒŒ์ผ๋œ object ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜์˜ object ํŒŒ์ผ๋กœ ๋งํ‚นํ•œ ๊ฒฐ๊ณผ
  • ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ ์žˆ๊ณ , ์ด ์ •๋ณด๋กœ GDB๋‚˜ Backtraces ๋ฅผ ์‹คํ–‰

๐Ÿ“‚ kernel.bin : ์ปค๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ด๋ฏธ์ง€

  • Pintos ์ปค๋„์„ ๋Œ๋ฆฌ๊ธฐ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜๋Š” ์ •ํ™•ํ•œ ๋ฐ”์ดํŠธ๋“ค์˜ ์ด๋ฏธ์ง€
  • kernel.o ์—์„œ ๋””๋ฒ„๊ทธ ์ •๋ณด๊ฐ€ ๋น ์ง„ ๊ฒƒ
  • ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์—†์• ๋ฏ€๋กœ ๋งŽ์€ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•ด์„œ, ์ปค๋„ loader์˜ ์„ค๊ณ„์—์˜ํ•ด ๋ถ€๊ณผ๋œ 512kB ์‚ฌ์ด์ฆˆ ์ œํ•œ์„ ํ˜น์‹œ๋ผ๋„ ๋„˜์ง€์•Š๊ฒŒ ํ•ด์คŒ

๐Ÿ“‚ loarder.bin : kernel loader์˜ ๋ฉ”๋ชจ๋ฆฌ ์ด๋ฏธ์ง€

  • ์ปค๋„์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ disk๋กœ ์ฝ๊ณ  ์‹œ์ž‘์‹œํ‚ค๋Š” ์–ด์ƒ˜๋ธ”๋ฆฌ์–ด ์ฝ”๋“œ์˜ ์ž‘์€ chunck
  • PC BIOS์— ์˜ํ•ด ์ •ํ•ด์ง„ ์‚ฌ์ด์ฆˆ์ธ ๋”ฑ 512 bytes ๊ธธ์ด
  • build ์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋“ค์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŒ๋“  object ํŒŒ์ผ๋“ค(.o)๊ณผ dependency ํŒŒ์ผ๋“ค(.d)์„ ํฌํ•จ
  • dependency ํŒŒ์ผ๋“ค์€ ๋‹ค๋ฅธ ์†Œ์Šค๋‚˜ ํ—ค๋”ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด, make ํ•œํ…Œ ์–ด๋–ค ์†Œ์ŠคํŒŒ์ผ์ด ๋‹ค์‹œ ์ปดํŒŒ์ผ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์คŒ

Introduction

Using the File System

์ฃผ์˜์‚ฌํ•ญ

  1. file sys ์ฝ”๋“œ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๊ถŒ์žฅ
  2. ๋‚ด๋ถ€ ๋™๊ธฐํ™” ํ•˜์ง€ ๋ง๊ธฐ
  3. ํŒŒ์ผ ์‚ฌ์ด์ฆˆ๋Š” ํŒŒ์ผ ์ƒ์„ฑ๋  ๋•Œ ๊ณ ์ •
  4. ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋Š” single extent ๋กœ ํ• ๋‹น
  5. ํŒŒ์ผ ์ด๋ฆ„์€ 14์ž๋กœ ์ œํ•œ
  6. ์—ฐ์‚ฐ ์ค‘์— (๋””์Šคํฌ์— ์ฝ๊ณ  ์“ฐ๋Š” ์ค‘์—) ์‹œ์Šคํ…œ crash๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ณต๊ตฌ ๋˜์ง€ ๋ชปํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋””์Šคํฌ๋ฅผ ๋ง์ณ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. (ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ณต๊ตฌ ํˆด ์—†์Œ)

Pintos ๊ฐ€์ƒ ๋จธ์‹ ๊ณผ ํŒŒ์ผ

  1. ํŒŒ์ผ ๋„ฃ๊ธฐ
  • userprog/build ์— ์žˆ๋Š” pintos-mkdisk filesys.dsk 2 ์‹คํ–‰
    • 2MB ํฌ๊ธฐ์˜ pintos ํŒŒ์ผ ์‹œ์Šคํ…œ ํŒŒํ‹ฐ์…˜ ํ•˜๋‚˜๋ฅผ ํฌํ•จํ•˜๋Š” filesys.dsk๋ผ๋Š” ๋ชจ์˜ ๋””์Šคํฌ(simulated disk) ์ƒ์„ฑ
    • ํŒŒ์ผ ์‹œ์Šคํ…œ ํŒŒํ‹ฐ์…˜: ๋ฌผ๋ฆฌ์ ์ธ ๋””์Šคํฌ๋ฅผ ๋…ผ๋ฆฌ์ ์ธ ์ €์žฅ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๊ฒƒ
  • pintos --fs-disk filesys.dsk : ์–ด๋–ค disk ์ธ์ง€ ์ง€์ •
  • pintos SCRIPT_COMMANDS -- -f -q : ํŒŒ์ผ ์‹œ์Šคํ…œ ํŒŒํ‹ฐ์…˜ ํฌ๋งทํŒ…
  1. ํŒŒ์ผ ์ €์žฅ/๊ฐ€์ ธ์˜ค๊ธฐ
  • -p(put, ์ €์žฅ)์™€ -g(get, ๊ฐ€์ ธ์˜ค๊ธฐ) ์˜ต์…˜
  • ๋ณต์‚ฌ : ์›๋ณธ ํŒŒ์ผ ๋’ค์— :ํŒŒ์ผ๋ช… ์ถ”๊ฐ€
  1. ์˜ˆ์‹œ (ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋นŒ๋“œ ํ›„๊ณ , ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ userprog/build๋ผ๊ณ  ๊ฐ€์ • ํ•˜์— ์“ฐ์ธ ์ฝ”๋“œ)
pintos-mkdisk filesys.dsk 10 
pintos --fs-disk filesys.dsk -p tests/userprog/args-single:args-single -- -q -f run 'args-single onearg'
  • ํŒŒ์ผ ์‹œ์Šคํ…œ ํŒŒํ‹ฐ์…˜์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋””์Šคํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,
    ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ํ˜•์‹์„ ๋งŒ๋“ค๊ณ ,
    args-single ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํ”„๋กœ๊ทธ๋žจ(Project2 ์˜ 2๋ฒˆ test)๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒˆ ๋””์Šคํฌ์— ๋งŒ๋“ค๊ณ ,
    onearg ๋ผ๋Š” ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด์„œ ์‹คํ–‰ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์š”์•ฝ ์ฝ”๋“œ
    (์ธ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•ด์•ผ ์ธ์ž ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•จ)
pintos --fs-disk=10 -p tests/userprog/args-single:args-single -- -q -f run 'args-single onearg'
  • ๋งŒ์•ฝ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋””์Šคํฌ๊ฐ€ ๋‹น์žฅ ํ•„์š” ์—†๋‹ค๋ฉด, ์ด ๋„ค ๋‹จ๊ณ„๋ฅผ ํ•˜๋‚˜์˜ ์ปค๋งจ๋“œ๋กœ ํ•ฉ์น  ์ˆ˜ ์žˆ์Œ
    • --filesys-size=nย ์˜ต์…˜ : pintos ์‹คํ–‰ ๋™์•ˆ ๋Œ€๋žต nMB ์˜ ์ž„์‹œ ํŒŒ์ผ ์‹œ์Šคํ…œ ํŒŒํ‹ฐ์…˜ ์ƒ์„ฑ
      (pinto์˜ ์ž๋™ ์‹œ์Šคํ…œ suite์€ ์ด ๊ตฌ๋ฌธ์„ ์•„์ฃผ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•จ)

How User Programs Work

  • x86-64 ELF ์‹คํ–‰ํŒŒ์ผ๋“ค์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ž„์˜์˜ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋ง์ปค๋ฅผ ์‚ฌ์šฉํ•ด Pintos๋ฅผ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ (์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋ง์ปค์€ ์ œ๊ณต)

  • ๋ณต์‚ฌํ•ด์„œ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋Š” ํด๋ฆฐํ•œ ๋ ˆํผ๋Ÿฐ์Šค ํŒŒ์ผ ์‹œ์Šคํ…œ ๋””์Šคํฌ๋ฅผ ๋งŒ๋“ค์–ด๋†“๊ธฐ

    • ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋žจ์„ simulated ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋ณต์‚ฌํ•  ๋•Œ๊นŒ์ง€ pintos๊ฐ€ ์œ ์šฉํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†์Œ
    • ๊ฐ„ํ˜น ๋””๋ฒ„๊น…์„ ํ•˜๋‹ค๋ณด๋ฉด filesys.dsk๊ฐ€ ์‚ฌ์šฉ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ๋Œ€๋น„

Virtual Memory Layout

USER_STACK +----------------------------------+
           |             user stack           |
           |                 |                |
           |                 |                |
           |                 V                |
           |           grows downward         |
           |                                  |
           |                                  |
           |           grows upward           |
           |                 ^                |
           |                 | HEAP           |
           |                 |                |
           +----------------------------------+
           | uninitialized data segment (BSS) |
           +----------------------------------+
           |     initialized data segment     |
           +----------------------------------+
           |            code segment          |
 0x400000  +----------------------------------+ KERN_BASE
           |                                  |
           |                                  |
           |                                  |
           |                                  |
       0   +----------------------------------+
  • ์œ ์ € ์Šคํƒ์˜ ํฌ๊ธฐ : Project 2์—์„œ๋Š” ๊ณ ์ • (3์—์„œ ๊ฐ€๋ณ€์ )
  • ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์˜ ์‚ฌ์ด์ฆˆ : ์‹œ์Šคํ…œ ์ฝœ์— ์˜ํ•ด ์กฐ์ • (๊ตฌํ˜„X)
  • ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ : ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ 0x400000์—์„œ ์‹œ์ž‘ํ•˜๊ณ , ๋Œ€๋žต ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ๋ฐ”๋‹ฅ์—์„œ 128MB๋งŒํผ ๋–จ์–ด์ ธ ์žˆ์Œ (์˜๋ฏธ ์—†๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฐ’)

+ ํ•œ ์‹คํ–‰ํŒŒ์ผ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” -p ์˜ต์…˜๊ณผ ํ•จ๊ป˜ objdump ๋ช…๋ น์–ด ์‹คํ–‰


Accessing User Memory

  • ์ปค๋„(์‹œ์Šคํ…œ ์ฝœ)์€ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๊ณตํ•œ ํฌ์ธํ„ฐ๋“ค์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์ž์ฃผ ์ ‘๊ทผํ•จ

    • ์ฃผ๋กœ ์‹œ์Šคํ…œ ์ฝœ(System Call)์„ ํ˜ธ์ถœํ•  ๋•Œ ํฌ์ธํ„ฐ๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ
  • ์œ ์ €๊ฐ€ ์ž˜๋ชป๋œ ํฌ์ธํ„ฐ๋ฅผ ์ปค๋„์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ

    • null ํฌ์ธํ„ฐ, ๋งคํ•‘๋˜์ง€ ์•Š์€ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ,
      ์ปค๋„ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„(KERN_BASE ์œ„์— ์žˆ๋Š” ๊ณต๊ฐ„)์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
  • ์ž˜๋ชป๋œ ํฌ์ธํ„ฐ๋“ค์€ ์ปค๋„๊ณผ ๋‹ค๋ฅธ running ํ”„๋กœ์„ธ์Šค๋“ค์—๊ฒŒ ์•…์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ๊ฑฐ๋ถ€๋˜์–ด์ ธ์•ผ ํ•˜๋ฏ€๋กœ,
    ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ ์‹œํ‚ค๊ณ  ๊ทธ ํ”„๋กœ์„ธ์Šค์˜ ์ž์›๋“ค์„ ํ•ด์ œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์œ ์ €๊ฐ€ ์ „๋‹ฌํ•œ ์ž˜๋ชป๋œ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ๋Œ€์‘

    1. ์œ ์ €๊ฐ€ ์ „๋‹ฌํ•œ ํฌ์ธํ„ฐ์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌํ•œ ํ›„์— ์—ญ์ฐธ์กฐ
      • thread/mmu.c ์™€ include/threads/vaddr.h์— ์žˆ๋Š” ํ•จ์ˆ˜ ๋ณด๊ธฐ ( ์œ ์ € ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)
    2. ์œ ์ €๊ฐ€ ์ „๋‹ฌํ•œ ํฌ์ธํ„ฐ๊ฐ€ KERN_BASE๋ณด๋‹ค ์•„๋ž˜ ๋ถ€๋ถ„์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ ํ›„์— ์—ญ์ฐธ์กฐ
      - page_fault() ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ
      static int64_t
      get_user (const uint8_t *uaddr) {
         int64_t result;
         __asm __volatile (
         "movabsq $done_get, %0\n"
         "movzbq %1, %0\n"
         "done_get:\n"
         : "=&a" (result) : "m" (*uaddr));
         return result;
      }
      /* Writes BYTE to user address UDST.
        UDST must be below KERN_BASE.
        Returns true if successful, false if a segfault occurred.
      */ 
      static bool
      put_user (uint8_t *udst, uint8_t byte) {
         int64_t error_code;
         __asm __volatile (
         "movabsq $done_put, %0\n"
         "movb %b2, %1\n"
         "done_put:\n"
         : "=&a" (error_code), "=m" (*udst) : "q" (byte));
         return error_code != -1;
      }
  • ์œ ์ € ์ฃผ์†Œ๊ฐ€ KERN_BASE ์•„๋ž˜์— ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒŒ ๊ฒ€์ฆ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •

  • page_fault() ๋ฅผ ์ˆ˜์ •ํ–ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋กœ ์ปค๋„์˜ page fault๋Š” ๋‹จ์ง€ rax๋ฅผ -1๋กœ ์„ค์ •ํ•˜๊ณ , ์ด์˜ ์ด์ „ ๊ฐ’์„ %rip๋กœ ๋ณต์‚ฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •


Argument Passing

x86-64 Calling Convention

(x86-64 ์‹œ์Šคํ…œ์—์„œ์˜ ํ˜ธ์ถœ ๊ทœ์•ฝ)

" process_exec() ํ•จ์ˆ˜์— ์žˆ๋Š” โ€œ์œ ์ € ํ”„๋กœ๊ทธ๋žจโ€์„ ์œ„ํ•œ ์ธ์ž๋ฅผ ์„ธํŒ…ํ•˜๊ธฐ "

  1. ์œ ์ €-๋ ˆ๋ฒจ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ %rdi,ย %rsi,ย %rdx,ย %rcx,ย %r8,ย %r9 ์‹œํ€€์Šค๋“ค์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ •์ˆ˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉ
    (7๊ฐœ ์ด์ƒ์€ Stack์— ์Œ“์ž„)

2-1. ํ˜ธ์ถœ์ž๋Š” ๋‹ค์Œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์ฃผ์†Œ(๋ฆฌํ„ด ์–ด๋“œ๋ ˆ์Šค)๋ฅผ ์Šคํƒ์— ํ‘ธ์‹œ
2-2. ํ”ผํ˜ธ์ถœ์ž์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ์ ํ”„ ( CALL (x86-64 ์ธ์ŠคํŠธ๋Ÿญ์…˜) :๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰)

  1. ํ”ผํ˜ธ์ถœ์ž๊ฐ€ ์‹คํ–‰
  1. ๋งŒ์•ฝ ํ”ผํ˜ธ์ถœ์ž๊ฐ€ ๋ฆฌํ„ด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๋ฆฌํ„ด ๊ฐ’์€ ๋ ˆ์ง€์Šคํ„ฐ RAX์— ์ €์žฅ
  1. ํ”ผํ˜ธ์ถœ์ž๋Š” x86-64 ์ธ์ŠคํŠธ๋Ÿญ์…˜์ธ RET (๋ฆฌํ„ด)๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ์Šคํƒ์— ๋ฐ›์•˜๋˜ ๋ฆฌํ„ด ์–ด๋“œ๋ ˆ์Šค๋ฅผ popํ•˜๊ณ  ๊ทธ ์ฃผ์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์œผ๋กœ ์ ํ”„ํ•จ์œผ๋กœ์จ ๋ฆฌํ„ด

์˜ˆ์‹œ ์ฝ”๋“œ

int myFunction(int a, int b, int c) {
    // a, b, c๋ฅผ ์‚ฌ์šฉ		// 2-2. ํ”ผํ˜ธ์ถœ์ž์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ์ ํ”„ -> 3. ์‹คํ–‰
    return 0				// 4. RAX ์— return ๊ฐ’ ์ €์žฅ
}							// 5. RET(๋ฆฌํ„ด)๋ฅผ ์‚ฌ์šฉํ•ด, Stack์— ๋ฐ›์•˜๋˜ ๋ฆฌํ„ด ์–ด๋“œ๋ ˆ์Šค๋ฅผ pop
							// ๊ทธ ์ฃผ์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์œผ๋กœ ์ ํ”„ํ•จ์œผ๋กœ์จ ๋ฆฌํ„ด
int main() {
    int x = 1, y = 2, z = 3;
    myFunction(x, y, z);	// 1. x, y, z ๊ฐ’์ด %rdi, %rsi, %rdx ๋ ˆ์ง€์Šคํ„ฐ์— ์ „๋‹ฌ
    yourFunction();			// 2-1. ๋‹ค์Œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์ฃผ์†Œ๋ฅผ Stack์— push
    return 0;
}
ใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…ก
3. ํ”ผํ˜ธ์ถœ์ž๊ฐ€ ์‹คํ–‰
                             +----------------+
stack pointer --> 0x4747fe70 | return address |
                             +----------------+
RDI: 0x0000000000000001 | RSI: 0x0000000000000002 | RDX: 0x0000000000000003

Program Startup Details

void
_start (int argc, char *argv[]) {
    exit (main (argc, argv));
}
  • _start() ํ•จ์ˆ˜๋ฅผ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘ ํฌ์ธํŠธ๋กœ ์ง€์ •
  • main() ์€ ๋ฆฌํ„ด๋˜๋ฉด์„œ exit()์„ ํ˜ธ์ถœ

์ปค๋„์€ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ—ˆ๊ฐ€ํ•˜๊ธฐ ์ „์—,
๋ ˆ์ง€์Šคํ„ฐ์— ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š” ์ดˆ๊ธฐ ํ•จ์ˆ˜ ๋ฅผ ์œ„ํ•œ ์ธ์ž ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

์ธ์ž๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•

ex. /bin/ls -l foo bar ๋ช…๋ น์ด ์ฃผ์–ด์ง

int main(int argc, char *argv[])
  1. ๋ช…๋ น์„ ๋‹จ์–ด๋“ค๋กœ ์ชผ๊ฐœ๊ธฐ : /bin/ls,ย l,ย foo,ย bar
  1. ๋‹จ์–ด๋“ค์„ ์Šคํƒ์˜ ๋งจ ์ฒ˜์Œ ๋ถ€๋ถ„์— ๋†“๊ธฐ ( ํฌ์ธํ„ฐ์— ์˜ํ•ด ์ฐธ์กฐ๋  ๊ฒƒ์ด๋ฏ€๋กœ ์ˆœ์„œ ์ƒ๊ด€ X )
  1. ๊ฐ ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ + ๊ฒฝ๊ณ„์กฐ๊ฑด์„ ์œ„ํ•œ ๋„ํฌ์ธํ„ฐ ๋ฅผ Stack์— ์˜ค๋ฅธ์ชฝโ†’์™ผ์ชฝ ์ˆœ์„œ๋กœ push

    • ์ด๋“ค์€ argv์˜ ์›์†Œ๊ฐ€ ๋œ๋‹ค.
    • ๋„ํฌ์ธํ„ฐ ๊ฒฝ๊ณ„ : argv[argc] ๊ฐ€ ๋„ํฌ์ธํ„ฐ๋ผ๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•จ (C์–ธ์–ด ํ‘œ์ค€์˜ ์š”๊ตฌ์‚ฌํ•ญ)
    • argv[0]์ด ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง
    • ์„ฑ๋Šฅ์„ ์œ„ํ•ด Stack์— ์ฒซ push๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์Šคํƒํฌ์ธํ„ฐ๋ฅผ 8์˜ ๋ฐฐ์ˆ˜๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•˜๊ธฐ
      ( word ํฌ๊ธฐ์— ์ •๋ ฌ๋œ ์ ‘๊ทผ์ด ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ ‘๊ทผ๋ณด๋‹ค ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ )
  1. %rsi ๊ฐ€ argv ์ฃผ์†Œ(argv[0] ์ฃผ์†Œ)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๊ณ , %rdi ๋ฅผ argc ๋กœ ์„ค์ •
  1. ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์งœ โ€œ๋ฆฌํ„ด ์–ด๋“œ๋ ˆ์Šคโ€๋ฅผ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค : entry ํ•จ์ˆ˜๋Š” ์ ˆ๋Œ€ ๋ฆฌํ„ด๋˜์ง€ ์•Š๊ฒ ์ง€๋งŒ, ํ•ด๋‹น ์Šคํƒ ํ”„๋ ˆ์ž„์€ ๋‹ค๋ฅธ ์Šคํƒ ํ”„๋ ˆ์ž„๋“ค๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€