๐Ÿ–ฅ๏ธ Computer Science/System

[System] ์ปดํ“จํ„ฐ ๊ตฌ์กฐ, ํฐ ๋…ธ์ด๋งŒ ๊ตฌ์กฐ, x86-64, ๋ ˆ์ง€์Šคํ„ฐ

Rosieblue 2023. 3. 17. 18:50
728x90

์ถœ์ฒ˜ : ๋“œ๋ฆผํ•ต ์‹œ์Šคํ…œํ•ดํ‚น ๋กœ๋“œ๋งต stage 2 https://dreamhack.io/ ์ •๋ฆฌ
 

๋“ค์–ด๊ฐ€๋ฉฐ

์˜ค๋Š˜์€ ์ปดํ“จํ„ฐ ๊ตฌ์กฐ์™€ ISA(๋ช…๋ น์–ด ์ง‘ํ•ฉ ๊ตฌ์กฐ), x86-84์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.
 

 

์ปดํ“จํ„ฐ ๊ตฌ์กฐ

๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์ž. ์ปดํ“จํ„ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ, ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์™€์„œ ์—ฐ์‚ฐํ•˜๋Š” CPU, ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๋‹ค๋ฃจ๋Š” LAN ์นด๋“œ, ์†Œ๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๋Š” ์‚ฌ์šด๋“œ ์นด๋“œ ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ธฐ๋Šฅ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉด์„œ ์ปดํ“จํ„ฐ๋ผ๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋ ‡๊ฒŒ ์ปดํ“จํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์„œ ํ•˜๋‚˜์˜ ๊ธฐ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š๋ƒ? ์—์„œ ๊ทธ '์„ค๊ณ„'๋ฅผ ์šฐ๋ฆฌ๋Š” '์ปดํ“จํ„ฐ ๊ตฌ์กฐ(์•„ํ‚คํ…์ณ)'๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
 
- ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„ค๊ณ„: ์–ด๋–ป๊ฒŒ ์—ฐ์‚ฐ์„ ํšจ์œจ์ ์œผ๋กœ ํ•  ๊ฒƒ์ธ๊ฐ€? ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋– ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ํ•„์š”ํ•œ๊ฐ€?
ex) ํฐ ๋…ธ์ด๋งŒ ๊ตฌ์กฐ, (์ˆ˜์ •๋œ) ํ•˜๋ฒ„๋“œ ๊ตฌ์กฐ
 
- ๋ช…๋ น์–ด ์ง‘ํ•ฉ ๊ตฌ์กฐ(ISA) : CPU๊ฐ€ ํ•ด์„ํ•˜๋Š” ๋ช…๋ น์–ด์˜ ์ง‘ํ•ฉ
-> ๋ช…๋ น์–ด๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋˜์–ด์žˆ๋Š”์ง€? -> CPU ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์„ค๊ณ„
 
- ๋งˆ์ดํฌ๋กœ ์•„ํ‚คํ…์ฒ˜(Micro Architecture)
-> CPU์˜ ํ•˜๋“œ์›จ์–ด์  ์„ค๊ณ„ -> CPU ํšŒ๋กœ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ
 
 

ํฐ ๋…ธ์ด๋งŒ ๊ตฌ์กฐ

RAM์—์„œ ๋ฐ์ดํ„ฐ ๊บผ๋‚ด์™€์„œ CPU๊ฐ€ ์—ฐ์‚ฐ ์ง„ํ–‰

ํฐ ๋…ธ์ด๋งŒ ๊ตฌ์กฐ๋Š” ์ปดํ“จํ„ฐ์—์„œ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๊ธฐ๋Šฅ ๊ตฌ์กฐ!! ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๊ธฐ๋Šฅ ๊ตฌ์กฐ๊ฐ€ ์ด๋Ÿฐ๊ฑฐ๋‹ค. ์–ด๋–ป๊ฒŒ ์—ฐ์‚ฐ์„ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๊ณ„!!
 

CPU(Centeral Processing Unit), ์ค‘์•™ ์ฒ˜๋ฆฌ ์žฅ์น˜

  • ์ปดํ“จํ„ฐ์˜ ๋‘๋‡Œ! ์ฆ‰ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ์•  (๊ทธ๋Ÿผ ์—ฐ์‚ฐ์€ ์–ด๋–ป๊ฒŒ~? ๋ช…๋ น์–ด๋กœ!! ์ด๊ฑด ์ž์„ธํžˆ ๊ณต๋ถ€ ํ•„์š”ํ• ๋“ฏ)
  • ์—ฐ์‚ฐ์€ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ, '๋ ˆ์ง€์Šคํ„ฐ'๋ผ๋Š” ์ž„์‹œ๋ณด๊ด€ํ•จ์— ๋„ฃ์–ด๋‘ฌ์„œ ํ•จ
  • ALU(Arithmatic Logic Unit) : ์‚ฐ์ˆ , ๋…ผ๋ฆฌ ์—ฐ์‚ฐ
  • CU(Control Unit) : CPU ์ œ์–ด
  • Register/ Cache :๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ธ๊ผฌ์˜จ ๋ฐ์ดํ„ฐ๋“ค์„ ๋†”๋‘๋Š” ๊ณณ

 

Memory, ๊ธฐ์–ต์žฅ์น˜ : ๊ทธ๋ƒฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ

  • ๋ง๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์ด๋‹ค
  • ์ฃผ๊ธฐ์–ต์žฅ์น˜(์ž„์‹œ ๊ธฐ์–ต์žฅ์น˜!! ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์ด ์ €์žฅ๋œ๋‹ค!! ์ž„์‹œ๋กœ~) ๋Œ€ํ‘œ์ ์œผ๋กœ RAM(Random Access Memory)
  • ๋ณด์กฐ ๊ธฐ์–ต์žฅ์น˜ - ์ฐ ๊ธฐ์–ต ์žฅ์น˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•จ. ์˜ค๋ž˜๋™์•ˆ ์ €์žฅํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์—ฌ๊ธฐ๋‹ค ์ €์žฅํ•จ ex) HDD(Hard Disk Drive), SSD(Solid State Drive)

 

Bus - ์ „์†ก ๋‹ด๋‹นํ•˜๋Š” ์• 

  • ์ปดํ“จํ„ฐ ๋ถ€ํ’ˆ๊ณผ ๋ถ€ํ’ˆ ์‚ฌ์ด ๋˜๋Š” ์ปดํ“จํ„ฐ์™€ ์ปดํ“จํ„ฐ ์‚ฌ์ด์— ์‹ ํ˜ธ๋ฅผ ์ „์†กํ•˜๋Š” ํ†ต๋กœ
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฒ„์Šค(Data Bus)
  • ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ์ฃผ์†Œ ๋ฒ„์Šค(Address Bus)
  • ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ์ œ์–ด ๋ฒ„์Šค(Control Bus)
  • ์ด ์™ธ์—๋„ ๋žœ์„ ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ „์†ก ์†Œํ”„ํŠธ์›จ์–ด, ํ”„๋กœํ† ์ฝœ ๋“ฑ๋„ ๋ฒ„์Šค๋ผ๊ณ  ๋ถˆ๋ฆผ

 

๋ ˆ์ง€์Šคํ„ฐ์™€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋Š” ์ด์œ ? -> CPU์˜ ์†๋„๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์†๋„๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ„. ๊ทธ๋ž˜์„œ ๋ ˆ์ง€์Šคํ„ฐ ์—†์ด ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒฝ์šฐ CPU๋Š” ๋น ๋ฅธ ์†๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋…ธ๋Š” ์‹œ๊ฐ„์ด ๋งŽ์•„์ง. ๊ทธ๋ž˜์„œ ๋”ฐ๋กœ ๋ ˆ์ง€์Šคํ„ฐ๋ผ๊ณ  ์ž„์‹œ ๊ธฐ์–ต์žฅ์น˜๋ฅผ ๋‘ฌ์„œ ๊ฑ”๋„ค๊ฐ€์ง€๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ

 

x86-64 ๊ตฌ์กฐ

ISA ์•„ํ‚คํ…์ณ(๋ช…๋ น์–ด ์ง‘ํ•ฉ ๊ตฌ์กฐ/๊ทœ์น™) ์˜ ํ•˜๋‚˜๋กœ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ๊ฒƒ!!
 
n ๋น„ํŠธ ์•„ํ‚คํ…์ฒ˜๋ž€?

  • WORD : CPU๊ฐ€ ‘ํ•œ๋ฒˆ์—’ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํฌ๊ธฐ (์ฆ‰ CPU๊ฐ€ ํ•œ๋ฐฉ์— ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋‹จ์œ„๋ผ๊ณ  ๋ณด๋ฉด๋จ!!) → ์ด๊ฒŒ ํฌ๋ฉด ์„ฑ๋Šฅ์ด ์ข‹์€ ๊ฑฐ๊ฒ ์ง€? ์™œ๋ƒ๋ฉด ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์–‘์ด ๋‹ค๋ฅธ๊ฑฐ๋‹ˆ๊นŒ!  ex) 64bit, 32bit ์—์„œ 64,32๊ฐ€ ๊ฐ๊ฐ WORD์ž„. 64bit ์•„ํ‚คํ…์ณ๋Š” CPU๊ฐ€ ํ•œ๋ฒˆ์— 64bit์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ!
  • ์š”์ฆ˜ pc๋Š” ๋Œ€๋ถ€๋ถ„ 64bit
  • ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ?  -> cpu๊ฐ€ ‘ํ”„๋กœ์„ธ์Šค’์— ์ œ๊ณตํ•˜๋Š” ๊ฐ€์ƒ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ (32bit ๋ณด๋‹ค 64bit๊ฐ€ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ํ›จ์”ฌ ํผ(16์—‘์‚ฌ ๋ฐ”์ดํŠธ vs 4๊ธฐ๊ฐ€ ๋ฐ”์ดํŠธ) ๋”ฐ๋ผ์„œ 64bit๊ฐ€ ๋” ์กฐ์Œ
  • 32bit๋ฉด ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ž‘์•„์„œ ๊ณ ์‚ฌ์–‘ ๊ฒŒ์ž„ ๊ฐ™์€ ๊ฑด ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ์Œ

 

๋ ˆ์ง€์Šคํ„ฐ

CPU๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ '๋น ๋ฅด๊ฒŒ' ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ  ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” CPU์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ๋ณด๊ด€์†Œ๋ผ๊ณ  ๋ณด๋ฉด๋œ๋‹ค. (RAM์ด๋ž‘ ๋‚˜๋ˆ ์ ธ ์žˆ๋Š” ์ด์œ ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ–ˆ์Œ)
์‚ฐ์ˆ  ์—ฐ์‚ฐ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ์ฃผ์†Œ, ์ฐธ์กฐ ๋“ฑ์— ์‚ฌ์šฉ๋จ
ex) x64์— ์žˆ๋Š” ๋ ˆ์ง€์Šคํ„ฐ ์ข…๋ฅ˜: ๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ, ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ, ๋ช…๋ น์–ด ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ, ํ”Œ๋ž˜๊ทธ ๋ ˆ์ง€์Šคํ„ฐ ๋“ฑ
 

๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ ๐Ÿงบ

  • 8๋ฐ”์ดํŠธ ์ €์žฅ (64bit) (0~2^64-1)
  • ์ฃผ์šฉ๋„๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋Š” ๊ฒƒ๋„ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์šฉ๋„๋“ค๋กœ๋„ ์“ฐ์ž„
  • ์•„๋ž˜์™€ ๊ฐ™์€ ์• ๋“ค์ด ์žˆ๋‹ค!!
์ด๋ฆ„ ์ฃผ์šฉ๋„
rax ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’
rbx x64์—์„œ๋Š” ์ฃผ๋œ ์šฉ๋„ x
rcx ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋ฐ˜๋ณตํšŸ์ˆ˜(counter), ์—ฐ์‚ฐ ์‹œํ–‰ ํšŸ์ˆ˜ ๋“ฑ
rdx x64์—์„œ๋Š” ์ฃผ๋œ ์šฉ๋„ x
rsi(source index) ๋ฐ์ดํ„ฐ ์˜ฎ๊ธธ ๋•Œ ์›๋ณธ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
rdi(desination index) ๋ฐ์ดํ„ฐ ์˜ฎ๊ธธ ๋•Œ ๋ชฉ์ ์ง€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
rsp(stack pointer) ์Šคํƒ ์œ„์น˜ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
rbp(stack base pointer) ์Šคํƒ ๋ฐ”๋‹ฅ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ

 

์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ ๐Ÿ—‚๏ธ

  • cs,ss,ds,es,fs,gs ์ด 6๊ฐ€์ง€ ์กด์žฌ
  • ํฌ๊ธฐ : 16bits (2 bytes)

 

๋ช…๋ น์–ด ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ ๐Ÿ‘‡

  • ํ”„๋กœ๊ทธ๋žจ์€ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, CPU๊ฐ€ ์–ด๋Š ๋ถ€๋ถ„์˜ ์ฝ”๋“œ ์‚ฌ์šฉํ• ์ง€ ๊ฑฐ๊ธฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๊ฒŒ ๋ช…๋ น์–ด ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ!!
  • rip๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ณ  8byte์ž„

 

ํ”Œ๋ž˜๊ทธ ๋ ˆ์ง€์Šคํ„ฐ ๐Ÿด

  • ํ”„๋กœ์„ธ์Šค์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋ ˆ์ง€์Šคํ„ฐ!
  • 64bit์ด์ง€๋งŒ ํ•˜๋‹จ 20๊ฐœ ์ •๋„๋งŒ ์‚ฌ์šฉ
  • ํ˜„์žฌ ์ƒํƒœ? ex) ์—ฐ์‚ฐ๊ฒฐ๊ณผ ์Œ์ˆ˜?(SF) 0? ๋น„ํŠธ๋ฒ”์œ„ ๋„˜์„ ๊ฒฝ์šฐ?(CF-๋ถ€ํ˜ธ ์—†๋Š” ์ˆ˜/OF-๋ถ€ํ˜ธ ์žˆ๋Š” )

 

๋ ˆ์ง€์Šคํ„ฐ ํ˜ธํ™˜

R?X๋Š” 64bit ๊ทธ ํ•˜์œ„ ์ ˆ๋ฐ˜์ด E?X, ๋˜ ๊ทธ ์ ˆ๋ฐ˜์ด AX....

rax=0xabcdefff12345678์ด๋ฉด ?

eax =0x12345678

ax = 0x5678

ah = 0x56 al=0x78

 
 

ํ€ด์ฆˆ

0x0123456789abcdef๋ฅผ ๋ณด๋ฉด ํ•˜๋‚˜์˜ ๋ฌธ์ž (0,1,2,..)๋Š” ๊ฐ๊ฐ 16์ง„์ˆ˜(4bit) ์ˆซ์ž์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‘๋ฌธ์ž๋ฅผ ํ•ฉ์น˜๋ฉด ํ•œ ๋ฐ”์ดํŠธ๊ฐ€ ๋˜๋ฏ€๋กœ, 0x0123456789abcdef๋Š” 8byte(64bit) ์ˆซ์ž์ด๋‹ค.
al๋Š” ํ•˜์œ„ 1byte์ด๋ฏ€๋กœ 0xef์ด๋‹ค.
 

  ax๋Š” ํ•˜์œ„ 2byte์ด๋ฏ€๋กœ 0xcdef์ด๋‹ค
 

ZF(Zero Flag)๋Š” ํ”Œ๋ž˜๊ทธ ๋ ˆ์ง€์Šคํ„ฐ(ํ”„๋กœ์„ธ์Šค ์ƒํƒœ ๋‚˜ํƒ€๋ƒ„)์˜ ํ”Œ๋ž˜๊ทธ๋กœ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ 0์ผ๋•Œ ์„ค์ •๋œ๋‹ค.
๋”ฐ๋ผ์„œ ๋‹ต์€ C!
 

rax์˜ ์•„๋ž˜์ชฝ๋ฐ˜๋ต์ด eax ์ด๋ฏ€๋กœ eax=0x89abcdef์ด๋‹ค
 

0xcdef๊ฐ€ ax์ด๊ณ  ์—ฌ๊ธฐ ์ƒ์œ„ 1byte๊ฐ€ ah์ด๋ฏ€๋กœ ah๋Š” 0xcd์ด๋‹ค.