πŸ’Ώ KAIST:PINTOS | Concept | rax register

μ΄μˆœκ°„Β·2025λ…„ 5μ›” 15일

KAIST:PINTOS

λͺ©λ‘ 보기
9/23

🧠 raxλž€?

raxλŠ” x86_64 μ•„ν‚€ν…μ²˜μ—μ„œ
"Return value Accumulator Register"의 μ•½μžλ‘œ,
μ‚°μˆ  μ—°μ‚° κ²°κ³Ό 및 ν•¨μˆ˜ λ°˜ν™˜κ°’μ„ μ €μž₯ν•˜λŠ” 역할을 κ°€μ§„ 쀑심 λ ˆμ§€μŠ€ν„°μ΄λ‹€.

  • eax (32λΉ„νŠΈ), ax (16λΉ„νŠΈ), al (8λΉ„νŠΈ)와 같은 μ΄λ¦„μœΌλ‘œλ„ ν•˜μœ„ ν˜Έν™˜λ¨
  • mov, add, mul, syscall λ“± μˆ˜λ§Žμ€ λͺ…λ Ήμ–΄μ—μ„œ ν•„μˆ˜λ‘œ μ‚¬μš©λ¨

❗ μ™œ λ§Žμ€ λ ˆμ§€μŠ€ν„° 쀑 rax만 λ”°λ‘œ μ€‘μš”ν•˜κ²Œ λ‹€λ£¨λŠ”κ°€?

1. ν•¨μˆ˜ 호좜의 ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€

  • C/C++ ν•¨μˆ˜μ—μ„œ return ν‚€μ›Œλ“œλ‘œ λ°˜ν™˜λ˜λŠ” 값은 항상 raxλ₯Ό 톡해 전달됨
  • 즉, λͺ¨λ“  ν•¨μˆ˜ 호좜의 λ°˜ν™˜κ°’μ΄ ν†΅κ³Όν•˜λŠ” 관문이기 λ•Œλ¬Έμ— μ½”λ“œ 흐름 좔적에 ν•„μˆ˜λ‹€

2. μ‹œμŠ€ν…œ 콜의 번호 및 κ²°κ³Ό 톡신에 μ‚¬μš©

  • μœ μ € ν”„λ‘œκ·Έλž¨μ΄ 컀널에 μš”μ²­ν•  λ•Œ syscall λ²ˆν˜ΈλŠ” rax에 λ„£κ³ ,
  • 컀널은 처리 κ²°κ³Όλ₯Ό λ‹€μ‹œ rax에 λ‹΄μ•„ μœ μ € ν”„λ‘œκ·Έλž¨μ— λ°˜ν™˜ν•œλ‹€
  • 즉, μœ μ €μ™€ 컀널 κ°„ ν†΅μ‹ μ˜ 쀑심 ν†΅λ‘œ 역할을 ν•œλ‹€

3. μ‚°μˆ /논리 μ—°μ‚°μ˜ κΈ°λ³Έ λˆ„μ‚°κΈ° μ—­ν• 

  • κ³ μ „ x86λΆ€ν„° μ§€κΈˆμ˜ x86_64κΉŒμ§€, raxλŠ” κΈ°λ³Έ μ‚°μˆ  μ—°μ‚° κ²°κ³Ό μ €μž₯μ†Œλ‘œ 쓰인닀
  • 특히 κ³±μ…ˆ, λ‚˜λˆ—μ…ˆ 같은 λͺ…λ Ήμ–΄λŠ” λ°˜λ“œμ‹œ raxλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€

✨ κ²°κ΅­ raxλŠ” λ‹¨μˆœν•œ μž„μ‹œ μ €μž₯μ†Œκ°€ μ•„λ‹Œ,
ν•¨μˆ˜, μ—°μ‚°, μ‹œμŠ€ν…œ 호좜 λ“± λͺ¨λ“  νλ¦„μ˜ 좜ꡬ이자 쀑심 좕이닀.


πŸ› οΈ μ–Έμ œ μ“°μ΄λŠ”κ°€?

1. μ—°μ‚° κ²°κ³Ό μ €μž₯

mov rax, 3
add rax, 5    ; rax = 8

2. ν•¨μˆ˜ λ°˜ν™˜κ°’ μ €μž₯

Cμ–Έμ–΄ ν•¨μˆ˜μ—μ„œ return 값은 rax에 담겨 ν˜ΈμΆœμžμ—κ²Œ μ „λ‹¬λœλ‹€.

int f() { return 42; }

μœ„ ν•¨μˆ˜λŠ” λ‚΄λΆ€μ μœΌλ‘œ:

mov eax, 42
ret

β†’ ν˜ΈμΆœμžλŠ” raxμ—μ„œ λ°˜ν™˜κ°’μ„ κΊΌλ‚Έλ‹€.


3. μ‹œμŠ€ν…œ 콜 번호 전달 (syscall)

  • λ¦¬λˆ…μŠ€μ™€ PintOS λͺ¨λ‘μ—μ„œ, μ‹œμŠ€ν…œ 콜 호좜 μ‹œ rax에 μ‹œμŠ€ν…œ 콜 번호λ₯Ό λ‹΄λŠ”λ‹€.
  • μœ μ € λͺ¨λ“œμ—μ„œ 컀널 λͺ¨λ“œλ‘œ μ „ν™˜λ˜λ©΄, 컀널은 rax 값을 ν•΄μ„ν•˜μ—¬ μ–΄λ–€ κΈ°λŠ₯을 ν˜ΈμΆœν• μ§€ κ²°μ •ν•œλ‹€.
mov rax, 1     ; write μ‹œμŠ€ν…œ 콜
mov rdi, 1     ; fd
mov rsi, msg   ; buf
mov rdx, len   ; size
syscall

πŸ” PintOSμ—μ„œλ„ μœ μ € ν”„λ‘œκ·Έλž¨μ΄ syscall을 μ‹€ν–‰ν•  λ•Œ raxλ₯Ό 톡해 μ–΄λ–€ κΈ°λŠ₯을 μš”μ²­ν•˜λŠ”μ§€ κ΅¬λΆ„ν•œλ‹€.


πŸ“Œ rax의 ꡬ쑰와 계측

이름크기섀λͺ…
rax64λΉ„νŠΈμ „μ²΄ 64λΉ„νŠΈ
eaxν•˜μœ„ 32λΉ„νŠΈrax의 ν•˜μœ„ 절반
axν•˜μœ„ 16λΉ„νŠΈeax의 ν•˜μœ„ 절반
alν•˜μœ„ 8λΉ„νŠΈax의 ν•˜μœ„ 절반

μ˜ˆμ‹œ: rax = 0x00000000000000FF이면, al = 0xFF, ax = 0x00FF, eax = 0x000000FF


🧬 PintOSμ—μ„œ raxλŠ” μ–΄λ–»κ²Œ μ“°μΌκΉŒ?

1. System Call 처리

  • μœ μ € ν”„λ‘œκ·Έλž¨μ—μ„œ μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•˜λ©΄, μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•˜κ³  μ»€λ„λ‘œ μ§„μž…ν•œλ‹€.
  • μ΄λ•Œ μœ μ € μŠ€νƒμ—μ„œ rax 값을 κΊΌλ‚΄, μ–΄λ–€ syscall을 μš”μ²­ν–ˆλŠ”μ§€ ν™•μΈν•œλ‹€.
  • 이후 κ²°κ³ΌλŠ” λ‹€μ‹œ rax에 λ‹΄μ•„ μœ μ € ν”„λ‘œκ·Έλž¨μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.
// μ˜ˆμ‹œ: syscall.c λ‚΄λΆ€
switch (f->R.rax) {
  case SYS_WRITE:
    ...
    f->R.rax = write(fd, buf, size);
    break;
}

β†’ fλŠ” struct intr_frame*, 즉 μœ μ € ν”„λ‘œκ·Έλž¨μ˜ μΈν„°λŸ½νŠΈ λ‹Ήμ‹œ λ ˆμ§€μŠ€ν„° μƒνƒœλ₯Ό λ³΄κ΄€ν•œ ꡬ쑰체닀.


πŸ“˜ 마무리 μš”μ•½

  • raxλŠ” x86_64μ—μ„œ μ—°μ‚° κ²°κ³Ό, ν•¨μˆ˜ λ°˜ν™˜κ°’, μ‹œμŠ€ν…œ 콜 번호 및 결과값을 μ €μž₯ν•˜λŠ” λ ˆμ§€μŠ€ν„°μ΄λ‹€.
  • ν•¨μˆ˜ 호좜 κ·œμ•½(ABI, Application Binary Interface)μ—μ„œλ„ λ°˜ν™˜κ°’μ€ 항상 raxλ₯Ό 톡해 μ „λ‹¬λœλ‹€.
  • PintOSμ—μ„œ μ‹œμŠ€ν…œ μ½œμ„ μ²˜λ¦¬ν•  λ•Œλ„ raxλ₯Ό 톡해 syscall λ²ˆν˜Έμ™€ λ°˜ν™˜κ°’μ„ μ£Όκ³ λ°›λŠ”λ‹€.
  • μˆ˜λ§Žμ€ λ ˆμ§€μŠ€ν„° μ€‘μ—μ„œλ„ raxλŠ” μ—°μ‚°/톡신/μ œμ–΄μ˜ μ€‘μ‹¬μ΄λ―€λ‘œ, 별도 ν‚€μ›Œλ“œλ‘œ ν•™μŠ΅ν•  λ§Œν•œ κ°€μž₯ μ€‘μš”ν•œ λ ˆμ§€μŠ€ν„°λ‹€.
profile
μ„œνˆ΄μ§€μ–Έμ • 늘 행동이 먼저이기λ₯Ό

0개의 λŒ“κΈ€