5 min read

OSTEP 06 Direct Execution

Table of Contents

μ—¬λŸ¬ μž‘μ—…λ“€μ΄ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이도둝 ν•˜λŠ” 방법 -> CPU μ‹œκ°„μ„ λ‚˜λˆ„μ–΄ μ“°λ©΄ λœλ‹€. ν•œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μž μ‹œλ™μ•ˆ μ‹€ν–‰ν•˜κ³ , λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό 또 잠깐 μ‹€ν–‰ν•˜κ³  ν•˜λ©΄μ„œ 물리적인 CPUλ₯Ό κ³΅μœ ν•œλ‹€. 이런 가상화 기법을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ λͺ‡κ°€μ§€ 문제λ₯Ό ν•΄κ²°ν•΄μ•Ό ν•œλ‹€.

  1. μ„±λŠ₯ μ €ν•˜ -> μ‹œμŠ€ν…œμ— κ³Όμ€‘ν•œ μ˜€λ²„ν—€λ“œλ₯Ό μ£Όμ§€ μ•ŠμœΌλ©΄μ„œ 가상화λ₯Ό κ΅¬ν˜„ν•  수 μžˆμ„κΉŒ?
  2. μ œμ–΄ 문제 -> CPU에 λŒ€ν•œ ν†΅μ œλ₯Ό μœ μ§€ + 효율적으둜 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ -> μ œμ–΄κΆŒμ„ 일으면 ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ μ˜μ›νžˆ 싀행을 κ³„μ†ν•˜κ²Œ 될지도 λͺ¨λ¦„.

1. κΈ°λ³Έ 원리: μ œν•œμ  직접 μ‹€ν–‰(Limited Direct Execution)

직접 μ‹€ν–‰ -> ν”„λ‘œκ·Έλž¨μ„ CPU μƒμ—μ„œ κ·Έλƒ₯ μ‹€ν–‰μ‹œν‚¨λ‹€.

OSTEP 06 Direct Execution-1687714891040.jpeg

μ΄λ ‡κ²Œ ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μš΄μ˜μ²΄μ œκ°€ μ›μΉ˜μ•ŠλŠ” 일을 ν•˜κ²Œ 될 수 μžˆλ‹€. 또 μ–΄λ–»κ²Œ ν”„λ‘œκ·Έλž¨μ˜ 싀행을 μ€‘λ‹¨ν•˜κ³  λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ‘œ μ „ν™˜μ‹œν‚¬μ§€ 고민도 ν•΄μ•Ό ν•œλ‹€. -> CPU 가상화에 ν•„μš”ν•œ μ‹œλΆ„ν• (time sharing) 기법.

λ”°λΌμ„œ μ œν•œμ μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œμΌœμ•Ό ν•œλ‹€. ν”„λ‘œκ·Έλž¨ 싀행에 μ œν•œμ„ 두지 μ•ŠμœΌλ©΄ μš΄μ˜μ²΄μ œλŠ” 아무것도 μ œμ–΄ν•  수 μ—†λŠ” λ‹¨μˆœν•œ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λœλ‹€.

2. 문제점 1: μ œν•œλœ μ—°μ‚°

물리적인 CPUμ—μ„œ 직접 μ‹€ν–‰ν•˜λ©΄ λΉ λ₯΄κ²Œ μ‹€ν–‰λœλ‹€. ν•˜μ§€λ§Œ ν”„λ‘œμ„ΈμŠ€κ°€ νŠΉμˆ˜ν•œ μ’…λ₯˜μ˜ μ—°μ‚° (λ””μŠ€ν¬ μž…μΆœλ ₯ μš”μ²­ 및 CPU, λ©”λͺ¨λ¦¬ μΆ”κ°€ν• λ‹Ή μš”μ²­ λ“±)을 μˆ˜ν–‰ν•˜κΈΈ μ›ν•œλ‹€λ©΄? 예λ₯Ό λ“€μ–΄ νŒŒμΌμ— λŒ€ν•œ μ ‘κ·Ό κΆŒν•œμ„ λΆ€μ—¬ν•˜κΈ° 전에, κΆŒν•œμ„ ν™•μΈν•˜λŠ” 파일 μ‹œμŠ€ν…œμ„ λ§Œλ“ λ‹€κ³  ν•˜μž. 이 λ•Œ ν”„λ‘œμ„ΈμŠ€κ°€ λ””μŠ€ν¬μ— λŒ€ν•΄ μž…μΆœλ ₯ν•˜λŠ” 것을 μ œν•œν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œμ„ΈμŠ€λŠ” 전체 λ””μŠ€ν¬λ₯Ό 읽고 μ“Έ 수 있기 λ•Œλ¬Έμ— κ²€μ‚¬ν•˜λŠ” μ˜λ―Έκ°€ μ—†λ‹€.

이 λ•Œλ¬Έμ— μ‚¬μš©μž λͺ¨λ“œ(user mode)와 컀널 λͺ¨λ“œ (kernel mode) κ°€ λ„μž…λ˜μ—ˆλ‹€. user modeμ—μ„œλŠ” μˆ˜ν–‰ν•  수 μžˆλŠ” μž‘μ—…μ— μ œν•œμ„ 두고, μ œν•œλœ μž‘μ—…μ€ kernel modeμ—μ„œλ§Œ μˆ˜ν–‰ν•  μˆ˜μžˆλ„λ‘ ν–ˆλ‹€. 예λ₯Ό λ“€μ–΄, 파일 μž…μΆœλ ₯κ³Ό 같은 μž‘μ—…μ€ kernel modeμ—μ„œλ§Œ μˆ˜ν–‰λœλ‹€.

user mode인 ν”„λ‘œμ„ΈμŠ€κ°€ μž…μΆœλ ₯κ³Ό 같은 μž‘μ—…μ„ μ‹€ν–‰ν•˜κ³  μ‹Άλ‹€λ©΄ μ œκ³΅λ˜λŠ” μ‹œμŠ€ν…œ μ½œμ„ μ‚¬μš©ν•œλ‹€. 컀널은 μ‹œμŠ€ν…œ μ½œμ„ ν†΅ν•˜μ—¬ μžμ‹ μ˜ μ£Όμš” κΈ°λŠ₯을 μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ—κ²Œ μ œκ³΅ν•œλ‹€. μ΄λŸ¬ν•œ κΈ°λŠ₯μ—λŠ” 파일 μ‹œμŠ€ν…œ μ ‘κ·Ό, ν”„λ‘œμ„ΈμŠ€ 생성 및 제거, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€μ˜ 톡신 및 λ©”λͺ¨λ¦¬ ν• λ‹Ή 등이 ν¬ν•¨λœλ‹€.

μ‹œμŠ€ν…œ μ½œμ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ ν”„λ‘œκ·Έλž¨μ€ trapμ΄λΌλŠ” 특수 λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€. 이 λͺ…λ Ήμ–΄λŠ” 컀널 μ•ˆμœΌλ‘œ λΆ„κΈ°ν•˜λŠ” λ™μ‹œμ— kernel mode둜 ν˜„μž¬ 특ꢌ μˆ˜μ€€μ„ 상ν–₯ μ‘°μ •ν•œλ‹€. μ΄λ ‡κ²Œ kernel mode둜 μ§„μž…ν•˜λ©΄ μš΄μ˜μ²΄μ œλŠ” λͺ¨λ“  λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•  수 있고, μ™„λ£Œλ˜λ©΄ return from trap 특수 λͺ…λ Ήμ–΄λ₯Ό 톡해 λ‹€μ‹œ user mode둜 특ꢌ μˆ˜μ€€μ„ ν•˜ν–₯ν•œλ‹€.

컀널은 λΆ€νŒ… μ‹œμ— 트랩 ν…Œμ΄λΈ”(trap table) 을 λ§Œλ“€κ³  이λ₯Ό μ΄μš©ν•˜μ—¬ μ‹œμŠ€ν…œμ„ ν†΅μ œν•œλ‹€. μš΄μ˜μ²΄μ œκ°€ ν•˜λŠ” 초기 μž‘μ—… 쀑 ν•˜λ‚˜λŠ” ν•˜λ“œμ›¨μ–΄μ—κ²Œ μ˜ˆμ™Έ 사건이 일어났을 λ•Œ μ–΄λ–€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€ μ•Œλ €μ£ΌλŠ” 일이닀. 예λ₯Ό λ“€μ–΄, ν•˜λ“œ λ””μŠ€ν¬ μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•˜λ©΄, ν‚€λ³΄λ“œ μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•˜λ©΄, λ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‹œμŠ€ν…œ μ½œμ„ 호좜 ν•˜λ©΄ 무슨 μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€ μ•Œλ €μ€€λ‹€. μš΄μ˜μ²΄μ œλŠ” νŠΉμ • λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•˜λ“œμ›¨μ–΄μ—κ²Œ 트랩 ν•Έλ“€λŸ¬(trap handler)의 μœ„μΉ˜λ₯Ό μ•Œλ €μ€€λ‹€. ν•˜λ“œμ›¨μ–΄λŠ” 이 정보λ₯Ό μ „λ‹¬λ°›μœΌλ©΄ ν•΄λ‹Ή μœ„μΉ˜λ₯Ό κΈ°μ–΅ν•˜κ³  μžˆλ‹€. λ”°λΌμ„œ μ‹œμŠ€ν…œ 콜과 같은 μ˜ˆμ™Έμ μΈ 사건이 λ°œμƒν–ˆμ„ λ•Œ ν•˜λ“œμ›¨μ–΄λŠ” 무엇을 ν•΄μ•Ό ν• μ§€ (즉, μ–΄λŠ μ½”λ“œλ‘œ λΆ„κΈ°ν•˜μ—¬ μ‹€ν–‰ν• μ§€) μ•Œ 수 μžˆλ‹€.

μš΄μ˜μ²΄μ œμ—μ„œ μΈν„°λŸ½νŠΈλŠ” ν•˜λ“œμ›¨μ–΄λ‚˜ μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œ λ°œμƒν•˜λŠ” 예기치 μ•Šμ€ 이벀트λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λ²€νŠΈλŠ” ν˜„μž¬ μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ˜ 흐름을 μ€‘λ‹¨ν•˜κ³  μš΄μ˜μ²΄μ œμ—κ²Œ 처리λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€. μΈν„°λŸ½νŠΈλŠ” μ‹œμŠ€ν…œμ˜ 일뢀뢄에 λ°œμƒν•˜λŠ” 쀑단 μ‹ ν˜Έλ‘œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. μΈν„°λŸ½νŠΈλŠ” μ—¬λŸ¬ κ°€μ§€ μƒν™©μ—μ„œ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ‡ κ°€μ§€ μ£Όμš”ν•œ μΈν„°λŸ½νŠΈ μœ ν˜•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€

ν•˜λ“œμ›¨μ–΄ μΈν„°λŸ½νŠΈ: ν•˜λ“œμ›¨μ–΄ μž₯μΉ˜μ—μ„œ λ°œμƒν•˜λŠ” 이벀트둜, 예λ₯Ό λ“€μ–΄ 타이머 μΈν„°λŸ½νŠΈ, μž…μΆœλ ₯ μž₯μΉ˜μ—μ„œμ˜ μ™„λ£Œ μ‹ ν˜Έ, ν•˜λ“œμ›¨μ–΄ 였λ₯˜ 등이 μžˆμŠ΅λ‹ˆλ‹€. μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈ: ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λͺ…령에 μ˜ν•΄ λ°œμƒν•˜λŠ” 이벀트둜, 주둜 μ‹œμŠ€ν…œ μ½œμ΄λ‚˜ μ˜ˆμ™Έ 상황에 μ˜ν•΄ λ°œμƒν•©λ‹ˆλ‹€.

OSTEP 06 Direct Execution-1687803828132.jpeg

3. 문제점 2: ν”„λ‘œμ„ΈμŠ€ κ°„ μ „ν™˜

μš΄μ˜μ²΄μ œλŠ” μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€λ₯Ό 계속 μ‹€ν–‰ν•  것인지, λ©ˆμΆ”κ³  λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•  것인지 κ²°μ •ν•΄μ•Ό ν•œλ‹€. μ΄λŠ” κΉŒλ‹€λ‘œμš΄ λ¬Έμ œμ΄λ‹€.

CPUμ—μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰ μ€‘μ΄λΌλŠ” 것은 μš΄μ˜μ²΄μ œλŠ” 싀행쀑이지 μ•Šλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. μš΄μ˜μ²΄μ œκ°€ μ‹€ν–‰ν•˜κ³  μžˆμ§€ μ•Šλ‹€λ©΄ μ–΄λ–»κ²Œ 이런 일듀을 ν•  수 μžˆμ„κΉŒ?

ν˜‘μ‘° 방식: μ‹œμŠ€ν…œ 콜 기닀리기

ν˜‘μ‘° 방식은 일뢀 κ³Όκ±° μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©λœ λ°©λ²•μœΌλ‘œ, μš΄μ˜μ²΄μ œκ°€ ν”„λ‘œμ„ΈμŠ€λ“€μ΄ ν•©λ¦¬μ μœΌλ‘œ 행동할 것이라고 κ°€μ •ν•œλ‹€. ν”„λ‘œμ„ΈμŠ€λ“€μ€ 주기적으둜 CPU μ œμ–΄λ₯Ό μš΄μ˜μ²΄μ œμ—κ²Œ 양보해야 ν•œλ‹€λŠ” κ°€μ •ν•˜μ— λ™μž‘ν•œλ‹€. 주둜 μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•˜μ—¬ CPU μ œμ–΄λ₯Ό μš΄μ˜μ²΄μ œμ—κ²Œ λ„˜κ²¨μ€€λ‹€.

λΉ„ν˜‘μ‘° 방식: μš΄μ˜μ²΄μ œκ°€ μ „κΆŒμ„ 행사

ν”„λ‘œμ„ΈμŠ€κ°€ ν˜‘μ‘°ν•˜μ§€ μ•Šκ±°λ‚˜ μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•˜μ§€ μ•Šμ•„ μš΄μ˜μ²΄μ œμ—κ²Œ μ œμ–΄λ₯Ό λ„˜κΈ°μ§€ μ•Šμ„ 경우, μš΄μ˜μ²΄μ œλŠ” 좔가적인 도움 없이 μ œμ–΄λ₯Ό νšλ“ν•˜κΈ° μ–΄λ ΅λ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 타이머 μΈν„°λŸ½νŠΈ κΈ°λŠ₯을 μ‚¬μš©ν•œλ‹€. 타이머 μΈν„°λŸ½νŠΈλŠ” μ •κΈ°μ μœΌλ‘œ λ°œμƒν•˜μ—¬ μš΄μ˜μ²΄μ œμ—κ²Œ CPU μ œμ–΄λ₯Ό μ–‘λ„ν•©λ‹ˆλ‹€.

λ¬Έλ§₯ κ΅ν™˜ (Context Switching)

λ¬Έλ§₯ κ΅ν™˜μ€ ν”„λ‘œμ„ΈμŠ€ μ „ν™˜μ΄ 일어날 λ•Œ ν˜„μž¬ μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœλ₯Ό μ €μž₯ν•˜κ³  λ‹€μŒμ— 싀행될 ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœλ₯Ό λ³΅μ›ν•˜λŠ” 과정이닀. λ¬Έλ§₯ κ΅ν™˜μ€ 운영체제의 μŠ€μΌ€μ€„λŸ¬μ— μ˜ν•΄ κ²°μ •λœλ‹€. λ ˆμ§€μŠ€ν„° κ°’κ³Ό μŠ€νƒ 포인터 λ“±μ˜ μƒνƒœλ₯Ό μ €μž₯ν•˜κ³  λ³΅μ›ν•˜μ—¬ μ œμ–΄λ₯Ό μ „ν™˜λ‹€.

타이머 μΈν„°λŸ½νŠΈμ™€ λ¬Έλ§₯ κ΅ν™˜

타이머 μΈν„°λŸ½νŠΈλŠ” μ •κΈ°μ μœΌλ‘œ λ°œμƒν•˜μ—¬ μš΄μ˜μ²΄μ œμ—κ²Œ CPU μ œμ–΄λ₯Ό μ–‘λ„ν•˜λŠ” 역할을 ν•œλ‹€. 타이머 μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•˜λ©΄ ν˜„μž¬ μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ λ ˆμ§€μŠ€ν„° 값을 μ €μž₯ν•˜κ³ , λ‹€μŒμ— 싀행될 ν”„λ‘œμ„ΈμŠ€μ˜ λ ˆμ§€μŠ€ν„° 값을 λ³΅μ›ν•œλ‹€. 이λ₯Ό 톡해 μš΄μ˜μ²΄μ œλŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ‘œ μ „ν™˜ν•˜μ—¬ 싀행을 계속할 수 μžˆλ‹€.

OSTEP 06 Direct Execution-1687804532825.jpeg

OSTEP 06 Direct Execution-1687804564886.jpeg

4. Concurrency?

μΈν„°λŸ½νŠΈ 처리 쀑 λ‹€λ₯Έ μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•˜λ©΄ μ–΄λ–»κ²Œ ν•  것인지, μ‹œμŠ€ν…œ 콜 처리 쀑 timer interruptκ°€ λ°œμƒν•˜λ©΄ μ–΄λ–€ 것을 λ¨Όμ € μ²˜λ¦¬ν• μ§€?

  1. Disable Interrupt -> λ‹€λ₯Έ μΈν„°λŸ½νŠΈ 처리 쀑일 λ•Œ λ°œμƒν•˜λŠ” μΈν„°λŸ½νŠΈ λ¬΄μ‹œ
  2. Priority -> μΈν„°λŸ½νŠΈμ— μš°μ„ μˆœμœ„λ₯Ό 두어 순차적으둜 처리
  3. Locking Mechanism -> Lock 기법 μ‚¬μš©

OSTEP ꡐ재 μ°Έκ³