32๋นํธ์ 64๋นํธ์ ์ฐจ์ด๋ โํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ ์ ๋ณด๋โ๊ณผ
โ๋ค๋ฃฐ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐโ์ ์ฐจ์ด์ด๋ฉฐ,
ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ๊ณผ ๋ฒ์๋ฅผ ๊ฒฐ์ ์ง๋ ์์ฃผ ์ค์ํ ์์์ด๋ค.
์ปดํจํฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ซ์๋ก ์ฒ๋ฆฌํ๋ฉฐ,
์ด ์ซ์๋ฅผ ๊ณ์ฐํ๊ฑฐ๋ ์ ์ฅํ ๋ ์ฐ๋ ๊ณต๊ฐ์ด ๋ ์ง์คํฐ(Register)์ด๋ค.
32๋นํธ ์์คํ
์ ํ ๋ฒ์ 32์๋ฆฌ ์ซ์๋ฅผ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ,
64๋นํธ ์์คํ
์ 64์๋ฆฌ ์ซ์๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ค.
๐ฆ ์ฝ๊ฒ ๋งํด ๊ณ์ฐ๊ธฐ์ ํ๋ฉด ํฌ๊ธฐ๊ฐ ๋ ๋ฐฐ๊ฐ ๋ ์ ์ด๋ค.
| ํญ๋ชฉ | 32๋นํธ | 64๋นํธ |
|---|---|---|
| ์ต๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ | ์ฝ 4GB | ์ฝ 18์์ฌ๋ฐ์ดํธ(EB) |
| ํฌ์ธํฐ ํฌ๊ธฐ | 4๋ฐ์ดํธ | 8๋ฐ์ดํธ |
ํฌ์ธํฐ(pointer)๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ก,
์ด ํฌ๊ธฐ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ด ๋ค๋ฃฐ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๊ฐ ๊ฒฐ์ ๋๋ค.
๐ 32๋นํธ๋ ์ฑ ์ฅ ํ๋๋ผ๋ฉด, 64๋นํธ๋ ๋์๊ด ์ ์ฒด๋ผ๊ณ ๋ณผ ์ ์๋ค.
32๋นํธ ์์คํ
์์๋ ํจ์๋ฅผ ํธ์ถํ ๋,
์ ๋ฌํ ๊ฐ๋ค์ ์คํ(stack)์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์ ์ฅํ ๋ค ํธ์ถํ๋ค.
push arg2
push arg1
call function
์ด ๋ฐฉ์์ ๋น๊ต์ ๋จ์ํ์ง๋ง, ์ฐ์ฐ๋ง๋ค ์คํ์ ์ ๊ทผํด์ผ ํ๋ฏ๋ก ๋๋ฆด ์ ์๋ค.
64๋นํธ ์์คํ ์์๋ ์ธ์๋ฅผ ์คํ์ด ์๋๋ผ CPU ๋ด๋ถ ๋ ์ง์คํฐ์ ์ง์ ๋ฃ์ด ํธ์ถํ๋ค.
mov rdi, arg1
mov rsi, arg2
call function
์ด ๋ฐฉ์์ ์ฒ๋ฆฌ ์๋๊ฐ ํจ์ฌ ๋น ๋ฅด๊ณ , CPU์ ์ฑ๋ฅ์ ๋ ํจ์จ์ ์ผ๋ก ๋์ด๋ผ ์ ์๋ ๊ตฌ์กฐ์ด๋ค.
์์คํ
์ฝ(system call)์ด๋, ํ๋ก๊ทธ๋จ์ด ์ด์์ฒด์ ์๊ฒ ์ด๋ค ๊ธฐ๋ฅ์ ์์ฒญํ ๋ ์ฌ์ฉํ๋ ๋ช
๋ น์ด๋ค.
์๋ฅผ ๋ค์ด ํ์ผ์ ์ด๊ฑฐ๋ ์ถ๋ ฅํ๋ ์์
์ ์์คํ
์ฝ์ ํตํด ์์ฒญํ๋ค.
| ํญ๋ชฉ | 32๋นํธ | 64๋นํธ |
|---|---|---|
| ๋ฐฉ์ | int 0x80 | syscall |
| ํน์ง | ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์์ผ ์ฒ๋ฆฌํ๋ค | ์ ์ฉ ๋ช ๋ น์ด๋ก ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ค |
64๋นํธ ์์คํ ์ ๋ ํ๋์ ์ธ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์๋๊ฐ ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ค.
์ด์์ฒด์ ๋ ์คํ ๊ฐ๋ฅํ ํ์ผ์ ์คํํ ๋ ELF(Executable and Linkable Format)์ด๋ผ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅธ๋ค.
| ํญ๋ชฉ | ELF32 | ELF64 |
|---|---|---|
| ํฌ์ธํฐ ํฌ๊ธฐ | 4๋ฐ์ดํธ | 8๋ฐ์ดํธ |
| ์ฃผ์ ํํ ๋ฒ์ | ์๋ค | ํฌ๋ค |
| ํค๋ ํฌ๊ธฐ | 52๋ฐ์ดํธ | 64๋ฐ์ดํธ |
๐ ๋ค์๊ณผ ๊ฐ์ด ํฐ๋ฏธ๋์์ ELF ํ์ผ ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์๋ค:
file a.out
# ELF 64-bit LSB executable, x86-64
PintOS๋ ๊ต์ก์ฉ ์ด์์ฒด์ ํ๋ก์ ํธ๋ก,
x86 32๋นํธ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์ด ์๋ค.
์ปค๋๊ณผ ์ ์ ํ๋ก๊ทธ๋จ์ 4GB ์์์ ์ฃผ์๋ฅผ ๋๋ ์ฐ๋ฉฐ,
๋ชจ๋ ๋ ์ง์คํฐ์ ์ฃผ์๋ 32๋นํธ(4๋ฐ์ดํธ) ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค.
ํ๋์ ์ปดํจํฐ๋ ๋๋ถ๋ถ 64๋นํธ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๊ณ ์์ผ๋ฉฐ,
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ฆฌ๋
์ค ์์คํ
๊ณผ ๋๋ฒ๊น
ํด(GDB)๋ 64๋นํธ ํ๊ฒฝ์์ ๋์ํ๋ค.
๋ฐ๋ผ์ PintOS๋ฅผ ์ค์ตํ ๋๋ rax, rsp, ELF64 ๊ฐ์ ๊ฐ๋
์ ๋ง์ฃผํ๊ฒ ๋๋ค.
์ด๋ฅผ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ฉด ์ค์ต ๊ณผ์ ์์ ํผ๋์ด ์๊ธธ ์ ์๋ค.
| ํญ๋ชฉ | 32๋นํธ | 64๋นํธ |
|---|---|---|
| ์ฃผ์ ํฌ๊ธฐ | 4๋ฐ์ดํธ | 8๋ฐ์ดํธ |
| ์ต๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ | 4GB | ์ด๋ก ์ 18EB |
| ๋ ์ง์คํฐ ์ด๋ฆ | eax, esp ๋ฑ | rax, rsp, r8~r15 ๋ฑ |
| ํจ์ ์ธ์ ์ ๋ฌ | ์คํ ์ฌ์ฉ | ๋ ์ง์คํฐ ์ฌ์ฉ |
| ์์คํ ์ฝ | int 0x80 | syscall |
| ์คํ ํ์ผ ํ์ | ELF32 | ELF64 |
| PintOS ๊ตฌ์กฐ | 32๋นํธ ๊ณ ์ | GDB ํ๊ฒฝ์์๋ 64๋นํธ ์ดํด ํ์ |
| ๊ตฌ๋ถ | ์ค๋ช |
|---|---|
| ํธ์คํธ ํ๊ฒฝ (Linux) | 64๋นํธ ๋ฆฌ๋ ์ค (x86_64)์์ ๋น๋ํ๊ณ ์คํ |
| QEMU ๊ฐ์ ๋จธ์ | 32๋นํธ x86 ํ๋์จ์ด๋ก ์๋ฎฌ๋ ์ด์ |
| PintOS ๋ด๋ถ ์ปค๋ | 32๋นํธ ์ํคํ ์ฒ(x86, IA-32) ๊ธฐ๋ฐ ์ฝ๋ |
eax, ebx, esp, ebp ๋ฑ ๊ธฐ๋ณธ 8๊ฐ์ ๋ ์ง์คํฐ๋ง ์ฌ์ฉKAIST PintOS์์๋ ์์คํ ์ฝ์ ์ฌ์ ํ ์ธํฐ๋ฝํธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
// syscall.c
void syscall_init(void) {
intr_register_int(0x30, 3, INTR_ON, syscall_handler, "syscall");
}
int 0x30 ๋ช
๋ น์ผ๋ก ์ปค๋๋ก ์ง์
ํ๋ค.struct intr_frame ๊ตฌ์กฐ์ฒด๋ฅผ ํตํด ์ ์ ์คํ โ ์ปค๋ ์ ํ ์ ๋ ์ง์คํฐ ์ํ๋ฅผ ์ ์ฅํ๋ค.f->eax์ ๋ค์ด ์๊ณ , ๊ฒฐ๊ณผ๊ฐ๋ f->eax์ ๋ฃ์ด ๋ค์ ์ ์ ๋ชจ๋๋ก ๋ณต๊ทํ๋ค.| ์ํฉ | ์ด์ |
|---|---|
GDB์์ eax, esp ๊ฐ์ 32๋นํธ ๋ ์ง์คํฐ๋ง ๋ณด์ | PintOS ์ปค๋์ด 32๋นํธ๋ก ์ปดํ์ผ๋๊ธฐ ๋๋ฌธ |
์ ์ ํ๋ก๊ทธ๋จ์ด syscall ํ ๋ int 0x30 ์ฌ์ฉ | syscall์ด ์ธํฐ๋ฝํธ ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ |
| ํฌ์ธํฐ ํฌ๊ธฐ๊ฐ 4๋ฐ์ดํธ๋ก ์ ํ๋จ | 32๋นํธ ์ํคํ ์ฒ์ด๊ธฐ ๋๋ฌธ |
int 0x30์ ์ฌ์ฉํ๋ ์ธํฐ๋ฝํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ์ด๊ณ ,64๋นํธ ๊ฒ์์ผ๋ก ๋ฐ๋๋ฉด์ ๊ธฐ์กด์ 32๋นํธ ๋งคํฌ๋ก ํ๋ก๊ทธ๋จ์ด ๋ ์ด์ ๊ฒ์ ํ๋ก์ธ์ค์ ์ ๊ทผํ์ง ๋ชปํ๊ฑฐ๋, ์ผ๋ถ ๊ธฐ๋ฅ๋ง ๋๋ ์ด์ ๋ โ๋นํธ ํธํ์ฑโ๊ณผ โ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ ๊ทผ ๋ฐฉ์์ ์ฐจ์ดโ ๋๋ฌธ์ด๋ค.
| ๊ตฌ๋ถ | ์ค๋ช |
|---|---|
| โ ๋๋ ๋งคํฌ๋ก | ๊ฒ์๊ณผ ๊ฐ์ ์ ์ผ๋ก ์ํธ์์ฉํ๊ฑฐ๋, ๋ณ๋ ์ธ๋ถ ์ ๋ ฅ๋ง ์ฐ๋ ๋ฐฉ์ (ex. ๋ง์ฐ์ค ํด๋ฆญ, ํค ์ ๋ ฅ ๋ฑ) |
| โ ์ ๋๋ ๋งคํฌ๋ก | ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋ด๋ถ๋ฅผ ์ฝ๊ฑฐ๋ ์กฐ์ํ๋ ๋ฐฉ์ (ex. ์ฃผ์ ์ฐพ์์ ์ง์ ๊ฐ ๋ฐ๊พธ๊ธฐ, ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ๋งคํฌ๋ก) |
SendInput(), keybd_event(), mouse_event() ๊ฐ์ ํจ์๋ ๋นํธ ์ฐจ์ด์ ๋ฌด๊ดํ๊ฒ ์๋ํจ.โ 32๋นํธ ๋งคํฌ๋ก๋ ๋ ์ด์ ์ฌ๋ฐ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ์ง ๋ชปํ๊ฑฐ๋, ์๋ชป๋ ํฌ๊ธฐ๋ก ์ฝ์
32๋นํธ ํ๋ก๊ทธ๋จ์ 64๋นํธ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ์
OpenProcess(),ReadProcessMemory()๊ฐ์ API๋ก ์ ๊ทผํ ์ ์๋๋ก ์ ํ๋์ด ์๋ค.
| ๋งคํฌ๋ก ๊ธฐ๋ฅ | 32๋นํธ ๊ฒ์ | 64๋นํธ ๊ฒ์ |
|---|---|---|
| ํค๋ณด๋ ์ ๋ ฅ ์๋ํ | ๊ฐ๋ฅ | ๊ฐ๋ฅ |
| ๋ง์ฐ์ค ํด๋ฆญ ์๋ํ | ๊ฐ๋ฅ | ๊ฐ๋ฅ |
| ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ณ ์์ | ๊ฐ๋ฅ | โ (๊ตฌ์กฐ ๋ฌ๋ผ์ง + ์ ๊ทผ ์ฐจ๋จ) |
| ํน์ ์ขํ๋ ์ฒด๋ ฅ ์ ๋ณด ์ฝ๊ธฐ | ๊ฐ๋ฅ | โ (์ฃผ์ ํด์ ์คํจ) |
| DLL ์ธ์ ์ ๋ฐฉ์ | ๊ฐ๋ฅ | โ (๋นํธ ๋ค๋ฅด๋ฉด ์ธ์ ์ ๋ถ๊ฐ) |
๋งคํฌ๋ก๋ฅผ 64๋นํธ๋ก ๋ค์ ์ปดํ์ผํด์ผ ํจ
โ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ง๊ฒ ์ฃผ์ ํฌ๊ธฐ, ๊ตฌ์กฐ์ฒด ์ ๋ ฌ ๋ฑ์ ๊ณ ์ณ์ผ ํจ
64๋นํธ ๊ฒ์์ ๋ง๋ ๋งคํฌ๋ก ์๋ก ์ ์
โ ํนํ ๋ฉ๋ชจ๋ฆฌ ์ค์บ์ด๋ ๊ฒ์ ๊ตฌ์กฐ ๋ถ์์ ๋ค์ ํด์ผ ํจ
๋๋, ๊ฒ์ ์ ์์๊ฐ ์์ ๋งคํฌ๋ก๋ฅผ ๋ง์ ๊ฒฝ์ฐ๋ ์์
โ ๊ทธ๋ด ๋ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ๋์ํ์ง ์๊ฒ ๋งํ ์์ ์ ์์
ใฑใ