λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
운영체제

OSκ°€ κ΄€λ¦¬ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­

by μ„œμ•„λž‘πŸ˜ 2023. 8. 27.

 

 

 

ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ 곡간

μš΄μ˜μ²΄μ œκ°€ κ΄€λ¦¬ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ€ μ»΄ν“¨ν„° μ‹œμŠ€ν…œμ—μ„œ ν”„λ‘œμ„ΈμŠ€λ“€μ΄ μ‹€ν–‰λ˜κ³  λ°μ΄ν„°λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„을 μ˜λ―Έν•©λ‹ˆλ‹€. μ΄ λ©”λͺ¨λ¦¬ μ˜μ—­μ€ κ°κ°μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ μ•ˆμ „ν•˜κ²Œ μ‹€ν–‰λ˜κ³  λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ κ²©λ¦¬λ˜λ„둝 κ΄€λ¦¬λ©λ‹ˆλ‹€. λ‹€μ–‘ν•œ λ©”λͺ¨λ¦¬ μ˜μ—­μ€ ν”„λ‘œμ„ΈμŠ€μ˜ μ‹€ν–‰ λ‹¨κ³„와 μ—­ν• μ— λ”°λΌ λΆ„λ₯˜λ©λ‹ˆλ‹€. μΌλ°˜μ μœΌλ‘œλŠ” λ‹€μŒκ³Ό κ°™μ€ λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ μžˆμŠ΅λ‹ˆλ‹€.

1. μ½”λ“œ(Code) μ˜μ—­:
   - μ‹€ν–‰ κ°€λŠ₯ν•œ ν”„λ‘œκ·Έλž¨ μ½”λ“œκ°€ μ €μž₯λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€.
   - ν”„λ‘œμ„ΈμŠ€μ˜ λͺ…령어듀이 μ €μž₯λ˜μ–΄ CPU에 μ˜ν•΄ μ‹€ν–‰λ©λ‹ˆλ‹€.
   - μ½κΈ° μ „μš©μœΌλ‘œ μ„€μ •λ˜μ–΄ μžˆμ–΄ ν”„λ‘œκ·Έλž¨ μ½”λ“œλ₯Ό μˆ˜μ •ν•  μˆ˜ μ—†μŠ΅λ‹ˆλ‹€.

2. λ°μ΄ν„°(Data) μ˜μ—­:
   - μ „μ—­ λ³€μˆ˜μ™€ μ •μ (static) λ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€.
   - ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘κ³Ό ν•¨κ»˜ ν• λ‹Ήλ˜λ©° μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λ©λ‹ˆλ‹€.
   - μ΄ˆκΈ°ν™”λœ λ°μ΄ν„°μ™€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ λ°μ΄ν„° μ˜μ—­μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

3. μŠ€νƒ(Stack) μ˜μ—­:
   - ν•¨μˆ˜ ν˜ΈμΆœκ³Ό κ΄€λ ¨λœ μ •λ³΄κ°€ μ €μž₯λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€.
   - μ§€μ—­ λ³€μˆ˜, λ§€κ°œ λ³€μˆ˜, ν•¨μˆ˜μ˜ λ°˜ν™˜ μ£Όμ†Œ λ“±μ΄ μ €μž₯λ©λ‹ˆλ‹€.
   - ν›„μž…μ„ μΆœ(LIFO) λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λ©° ν•¨μˆ˜ ν˜ΈμΆœκ³Ό ν•¨κ»˜ μƒμ„±λ˜κ³  λ°˜ν™˜λ©λ‹ˆλ‹€.

4. νž™(Heap) μ˜μ—­:
   - λŸ°νƒ€μž„에 λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ°μ΄ν„°κ°€ μ €μž₯λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€.
   - ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ§μ ‘ κ΄€λ¦¬ν•΄μ•Ό ν•˜λ©°, ν•„μš”μ— λ”°λΌ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  ν•΄μ œν•©λ‹ˆλ‹€.
   - λ™μ μœΌλ‘œ ν• λ‹Ήλœ λ°μ΄ν„°λŠ” νž™ μ˜μ—­μ— μ €μž₯되며, μ΄λ₯Ό ν†΅ν•΄ λ™μ  λ°μ΄ν„° κ΅¬μ‘°λ₯Ό μƒμ„±ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

μš΄μ˜μ²΄μ œλŠ” μ΄λŸ¬ν•œ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ κ΄€λ¦¬ν•˜λ©΄μ„œ λ‹€μ€‘ ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ μΆ©λŒμ΄λ‚˜ λ°μ΄ν„° μΉ¨λ²”을 λ°©μ§€ν•˜κ³ , κ° ν”„λ‘œμ„ΈμŠ€κ°€ μ μ ˆν•œ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ‚¬μš©ν•˜λ„둝 μ‘°μ •ν•©λ‹ˆλ‹€. μ΄λ₯Ό ν†΅ν•΄ μ•ˆμ •μ μ΄κ³  νš¨μœ¨μ μΈ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ λ° λ©”λͺ¨λ¦¬ κ΄€λ¦¬κ°€ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

 

 

 

 

μ»΄νŒŒμΌλŸ¬μ™€ λ©”λͺ¨λ¦¬ ν• λ‹Ή

μ½”λ“œ μ‹€ν–‰ λ‹¨κ³„μ—μ„œμ˜ λ©”λͺ¨λ¦¬ μ˜μ—­ ꡬ쑰

 

code(text), data, stack μ˜μ—­μ€ μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ λ©”λͺ¨λ¦¬μ˜μ—­μ„ κ²°μ •ν•©λ‹ˆλ‹€. 즉 컴파일 ν•  λ•Œ dataμ˜μ—­κ³Ό stackμ˜μ—­μ˜ 크기λ₯Ό κ³„μ‚°ν•΄μ„œ ν•„μš”ν•œ λ©”λͺ¨λ¦¬ 곡간을 κ°€μ§‘λ‹ˆλ‹€.  heap μ˜μ—­μ€ κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ½”λ“œμ— μ˜ν•΄ ν”„λ‘œκ·Έλž¨ λ™μž‘μ‹œ κ²°μ •λ©λ‹ˆλ‹€.

code, data, heap μ˜μ—­μ€ ν•˜μœ„ λ©”λͺ¨λ¦¬λΆ€ν„° ν• λ‹Ήλ˜κ³ , stack μ˜μ—­μ€ μƒμœ„ λ©”λͺ¨λ¦¬λΆ€ν„° ν• λ‹Ήλ©λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ 할당은 ν• λ‹Ή μ‹œμ μ— 따라 μ•„λž˜μ™€ 같이 λ‚˜λ‰©λ‹ˆλ‹€.

1. SMA (Static Memory Allocation) : 정적 λ©”λͺ¨λ¦¬, λ©”λͺ¨λ¦¬μ˜ data μ˜μ—­, stack μ˜μ—­μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

- Data μ˜μ—­ : ν”„λ‘œκ·Έλž¨ μ‹œμž‘κ³Ό λ™μ‹œμ— ν• λ‹Ήλœ μ˜μ—­μ΄ 작히고 λλ‚˜λ©΄ OS 에 λ°˜ν™˜ν•©λ‹ˆλ‹€.

- Stack μ˜μ—­ : ν•¨μˆ˜ μ‹œμž‘κ³Ό λ™μ‹œμ— ν• λ‹Ήλœ μ˜μ—­μ΄ 작히고 λλ‚˜λ©΄ OS에 λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

2) DMA (Dynamic Memory Allocation) : 동적 λ©”λͺ¨λ¦¬, λ©”λͺ¨λ¦¬μ˜ heap μ˜μ—­μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

- Heap μ˜μ—­ : stackμ—μ„œ pointer λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜κ³ , κ·Έ pointerκ°€ κ°€λ¦¬ν‚€λŠ” heap μ˜μ—­μ˜ μž„μ˜μ˜ 곡간뢀터 μ›ν•˜λŠ”

크기 만큼 ν• λ‹Ήν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

 

HEAP overflowλŠ” heap이 μœ„μ—μ„œλΆ€ν„° μ£Όμ†Œκ°’μ„ μ±„μ›Œμ Έ λ‚΄λ €μ˜€λ‹€κ°€ stackμ˜μ—­μ„ μΉ¨λ²”ν•˜λŠ” 경우이고 Stack overflowλŠ” stackμ˜μ—­μ΄ heap μ˜μ—­μ„ μΉ¨λ²”ν•œ κ²½μš°μž…λ‹ˆλ‹€.

 

 

 

BSSμ˜μ—­

BSS(Block Started by Symbol) μ˜μ—­μ€ ν”„λ‘œκ·Έλž¨μ˜ λ°μ΄ν„° μ„Ήμ…˜ μ€‘ ν•˜λ‚˜λ‘œ, μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μ „μ—­ λ³€μˆ˜μ™€ μ •μ (static) λ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 이 μ˜μ—­μ€ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜κΈ° 전에 μš΄μ˜μ²΄μ œμ— μ˜ν•΄ 0으둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€. BSSμ˜μ—­μ€ 데이터 μ˜μ—­ μ˜†μ— μœ„μΉ˜ν•©λ‹ˆλ‹€.(BSSμ˜μ—­μ„ 데이터 μ˜μ—­μ— ν¬ν•¨ν•΄μ„œ 보기도 ν•©λ‹ˆλ‹€)

BSS μ˜μ—­μ— μ €μž₯λ˜λŠ” λ³€μˆ˜λ“€μ€ μ΄ˆκΈ°κ°’을 κ°€μ§€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, λͺ…μ‹œμ μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜μ§€ μ•ŠμœΌλ©΄ 0으둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€. λ”°λΌμ„œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ•„λ¬΄λŸ° κ°’을 ν• λ‹Ήν•˜μ§€ μ•Šμ•„도 λ³€μˆ˜λŠ” 0으둜 μ΄ˆκΈ°ν™”λ˜μ–΄ μ‹œμž‘ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ λ³€μˆ˜λ“€μ€ μ‹€ν–‰ μ‹œκ°„에 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜λ©°, μ΄λŸ¬ν•œ λ³€μˆ˜λ“€μ€ ν”„λ‘œκ·Έλž¨μ˜ ν¬κΈ°μ— μ˜ν–₯을 λ―ΈμΉ˜μ§€λ§Œ μ‹€ν–‰ μ‹œμ— μ‹€μ œλ‘œ ν•„μš”ν•œ λ©”λͺ¨λ¦¬ μ–‘은 0으둜 μ΄ˆκΈ°ν™”λœ κ°’λ§ŒνΌλ§Œ μ‚¬μš©λ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό κ°™μ€ C ν”„λ‘œκ·Έλž¨ μ½”λ“œλ₯Ό μƒκ°ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

#include <stdio.h>

int global_var; // μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μ „μ—­ λ³€μˆ˜

int main() {
    static int static_var; // μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ 정적 λ³€μˆ˜
    return 0;
}



μœ„μ˜ μ½”λ“œμ—μ„œ global_var와 static_varλŠ” μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜μ§€λ§Œ, μ‹€ν–‰ μ‹œμ— BSS μ˜μ—­μ— ν• λ‹Ήλ˜κ³  0으둜 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.

μš”μ•½ν•˜λ©΄, BSS μ˜μ—­μ€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ μ „μ—­ λ³€μˆ˜μ™€ μ •μ  λ³€μˆ˜κ°€ ν• λ‹Ήλ˜λŠ” μ˜μ—­μœΌλ‘œ, μ΄ λ³€μˆ˜λ“€μ€ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ „에 0으둜 μ΄ˆκΈ°ν™”λ˜μ–΄ μ‹œμž‘ν•©λ‹ˆλ‹€.



 

 

 

 

 

 

λŒ“κΈ€