Skip to content

Latest commit

Β 

History

History
76 lines (69 loc) Β· 6.56 KB

File metadata and controls

76 lines (69 loc) Β· 6.56 KB
  • mm_struct와 vm_area_struct에 λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.

    • mm_struct

      • mm_structλŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간을 ν‘œν˜„ν•˜λŠ” 정보λ₯Ό λ‹΄κ³  μžˆλŠ” ꡬ쑰체이닀.

      • ν”„λ‘œμ„ΈμŠ€μ˜ task_structꡬ쑰체의 mmν•­λͺ©μ΄ ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€μ˜ mm_structꡬ쑰체λ₯Ό 가리킀며 ν”„λ‘œμ„ΈμŠ€ μŠ€μΌ€μ€„λ§ λ°œμƒ μ‹œ ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€μ˜ μ„œμˆ μžμΈ task_struct의 mmν•­λͺ©μ΄ κ°€λ¦¬ν‚€λŠ” mm_structκ°€ λ‘œλ“œλœλ‹€.

        • 컀널 μŠ€λ ˆλ“œ μ—λŠ” ν”„λ‘œμ„ΈμŠ€ μ£Όμ†Œ 곡간이 μ—†κΈ° λ•Œλ¬Έμ— mmν•­λͺ©μ΄ κ°€λ¦¬ν‚€λŠ” mm_struct λ˜ν•œ μ—†λ‹€. ν•˜μ§€λ§Œ 컀널 μŠ€λ ˆλ“œ λŠ” 컀널 λ©”λͺ¨λ¦¬ μ˜μ—­ 에 μ ‘κ·Όν•˜κΈ° μœ„ν•œ νŽ˜μ΄μ§€ ν…Œμ΄λΈ”κ³Ό 같이 mm_structꡬ쑰체의 일뢀 정보가 ν•„μš”ν•  수 μžˆκΈ°μ— 이전 ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간을 κ·ΈλŒ€λ‘œ λ‘”λ‹€.
          • 이전 ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λŠ” 것이 μ–΄λ–»κ²Œ 컀널 μŠ€λ ˆλ“œ κ°€ ν•„μš”λ‘œ ν•˜λŠ” 정보λ₯Ό μ œκ³΅ν•  수 μžˆλŠ” 방법이 λ˜λŠ”κ°€?

            컀널 μŠ€λ ˆλ“œ κ°€ μ ‘κ·Όν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ€ 컀널 λ©”λͺ¨λ¦¬ μ˜μ—­ 인데, μ΄λŠ” λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€κ°€ νŽ˜μ΄μ§€ ν…Œμ΄λΈ” μƒμ—μ„œ κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­ 이기에 μ–΄λŠ ν”„λ‘œμ„ΈμŠ€λ“  이전에 μ‚¬μš©ν•˜λ˜ ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ©΄ 컀널 μŠ€λ ˆλ“œ κ°€ ν•„μš”λ‘œ ν•˜λŠ” 컀널 λ©”λͺ¨λ¦¬ μ˜μ—­ 에 λŒ€ν•œ 정보λ₯Ό 얻을 수 μžˆλ‹€.

      • mm_StructλŠ” λ©”λͺ¨λ¦¬ μ˜μ—­ λ“€λ‘œ 이루어져 μžˆλ‹€.

        • mm_structλ₯Ό κ΅¬μ„±ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­ 듀은 mmapκ³Ό mm_rb의 μžλ£Œκ΅¬μ‘°μ— 같은 λ‚΄μš©μ„ λ‹΄μ•„ μœ μ§€ν•œλ‹€.
          • mmap 리슀트 ν˜•νƒœλ‘œ λͺ¨λ“  λ©”λͺ¨λ¦¬ μ˜μ—­ 을 탐색할 λ•Œ μœ μš©ν•˜λ‹€. μ—°κ²° ν˜•νƒœκ°€ κ°„λ‹¨ν•˜κ³  리슀트 ν—€λ“œ μ—μ„œ μ‹œμž‘ν•˜μ—¬ 리슀트 의 λ§ˆμ§€λ§‰ λ…Έλ“œκΉŒμ§€ λΉ λ₯΄κ²Œ μˆœνšŒν•  수 있기 λ•Œλ¬Έμ΄λ‹€.
          • mm_rb λ ˆλ“œλΈ”λž™νŠΈλ¦¬ ν˜•νƒœλ‘œ νŠΉμ • λ©”λͺ¨λ¦¬ μ˜μ—­ 을 탐색할 λ•Œ μœ μš©ν•˜λ‹€. κ· μΌν•˜κ³  λΉ λ₯Έ 탐색 μ‹œκ°„(O(log n)) 이 보μž₯되기 λ•Œλ¬Έμ΄λ‹€.
    • vm_area_struct

      • vm_area_structλŠ” μ£Όμ–΄μ§„ μ£Όμ†Œ κ³΅κ°„μ—μ„œ μ—°μ†λœ ꡬ간에 ν•΄λ‹Ήν•˜λŠ” 단일 λ©”λͺ¨λ¦¬ μ˜μ—­ 을 λ‚˜νƒ€λ‚Έλ‹€.
        • 컀널은 각 λ©”λͺ¨λ¦¬ μ˜μ—­μ„ 독립적인 λ©”λͺ¨λ¦¬ 겍체둜 κ°„μ£Όν•˜κΈ°μ— 각 λ©”λͺ¨λ¦¬ μ˜μ—­ 은 μ˜μ—­λ³„λ‘œ μ ‘κ·Ό κΆŒν•œ 및 κ΄€λ ¨λœ μž‘μ—…λ“€μ„ μ„€μ •ν•  수 μžˆλ‹€.
          • 이 덕뢄에 ν”„λ‘œμ„ΈμŠ€ μ£Όμ†Œ κ³΅κ°„μ˜ μŠ€νƒ ν˜Ήμ€ 데이터 μ˜μ—­, 파일과 λ§€ν•‘λœ λ©”λͺ¨λ¦¬ μ˜μ—­ λ“± μ’…λ₯˜κ°€ λ‹€λ₯Έ λ©”λͺ¨λ¦¬ μ˜μ—­ 듀을 ν•˜λ‚˜μ˜ vm_area_struct둜 λͺ¨λ‘ ν‘œν˜„ν•  수 μžˆλ‹€.
        • vm_area_structλŠ” ν•΄λ‹Ή λ©”λͺ¨λ¦¬ μ˜μ—­ 에 λŒ€ν•œ 정보λ₯Ό λ‹΄κ³  μžˆλ‹€.
          • λ©”λͺ¨λ¦¬ μ˜μ—­ 의 μ‹œμž‘κ³Ό 끝 μ£Όμ†Œ

            [ vm_start, vm_end)

          • mm_structκ°€ μœ μ§€ν•˜λŠ” vm_area_struct의 리슀트 λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ vm_next 포인터
          • mm_structκ°€ μœ μ§€ν•˜λŠ” vm_area_struct의 λ ˆλ“œλΈ”λž™νŠΈλ¦¬ λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ vm_rb λ³€μˆ˜
          • μ ‘κ·Ό κΆŒν•œκ³Ό ν”Œλž˜κ·Έ
          • vm_area_structκ°€ μ‹€ν–‰ν•˜λŠ” ν•¨μˆ˜λ“€μ˜ 포인터듀이 μ‘΄μž¬ν•˜λŠ” ꡬ쑰체λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터 vm_ops
          • λ“±λ“±
      • mm_structλŠ” vm_area_structλ“€μ˜ 정보λ₯Ό μœ μ§€ν•˜κ³  μžˆλ‹€.
  • VMA ν”Œλž˜κ·Έμ— λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.

    • vm_flags ν•­λͺ©μ— λ©”λͺ¨λ¦¬ μ˜μ—­μ˜ λ™μž‘κ³Ό λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ λ“€μ–΄ μžˆλŠ” νŽ˜μ΄μ§€μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•œλ‹€.
      • VM_READ, VM_WRITE, VM_EXEC
      • VMA의 μ’…λ₯˜μ— 따라 μ μ ˆν•˜κ²Œ μ‘°ν•©ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€μ˜ μ ‘κ·Ό κΆŒν•œμ„ μ œμ–΄ν•˜λŠ” ν”Œλž˜κ·Έλ“€μ΄λ‹€.
        • μ½”λ“œ μ˜μ—­ 이라면 VM_READ, VM_EXEC
        • 데이터 μ˜μ—­ 이라면 VM_READ, VM_WRITE
        • COPY ON WRITE 라면 VM_READ
      • VM_SHARED
        • ν•΄λ‹Ή λ©”λͺ¨λ¦¬ μ˜μ—­ 이 μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ κ³΅μœ ν•˜λŠ” μ˜μ—­μΈμ§€ λ‚˜νƒ€λ‚΄λŠ” ν”Œλž˜κ·Έ
        • 이 ν”Œλž˜κ·Έκ°€ μ„€μ •λ˜μ–΄ 있으면 곡유 ν• λ‹Ή , μ•„λ‹ˆλ©΄ κ°œλ³„ ν• λ‹Ή 이라고 λΆ€λ₯Έλ‹€.
      • VM_IO
        • ν•΄λ‹Ή λ©”λͺ¨λ¦¬ μ˜μ—­ 이 μž₯치 μž…μΆœλ ₯ κ³΅κ°„μœΌλ‘œ ν• λ‹Ήλœ 것인지 λ‚˜νƒ€λ‚΄λŠ” ν”Œλž˜κ·Έ
        • 이 ν”Œλž˜κ·Έκ°€ μ„€μ •λ˜μ–΄ μžˆλŠ” λ©”λͺ¨λ¦¬ μ˜μ—­ 은 ν”„λ‘œμ„Έμ„œμ˜ μ½”μ–΄ 덀프 에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.
          • μ½”μ–΄ 덀프
            • ν”„λ‘œκ·Έλž¨ 였λ₯˜ 진단 ν˜Ήμ€ 디버깅에 쓰이기 μœ„ν•΄, ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ—ˆμ„ λ•Œ λ§Œλ“€μ–΄μ§€λŠ”, ν”„λ‘œμ„ΈμŠ€μ˜ νŠΉμ • μ‹œμ μ˜ λ©”λͺ¨λ¦¬ μƒνƒœλ₯Ό κΈ°λ‘ν•œ 것
  • mmap에 λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.

    • mmap
      • mmap은 μ‚¬μš©μž 곡간에 μ œκ³΅λ˜λŠ” μ‹œμŠ€ν…œ 호좜 이닀.

        #include <sys/mman.h>
        
        void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off);
        /*
        * addr: λ§€ν•‘ν•  λ©”λͺ¨λ¦¬ μ£Όμ†Œ
        * len: λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기
        * prot: 보호λͺ¨λ“œ
        * flags: λ§€ν•‘λœ λ°μ΄ν„°μ˜ 처리 방법을 μ§€μ •ν•˜λŠ” ν•¨μˆ˜
        * fildes: 파일 기술자
        * off: 파일 μ˜€ν”„μ…‹
        */
      • mmap은 λ‚΄λΆ€μ μœΌλ‘œ do_mmap을 ν˜ΈμΆœν•œλ‹€.

        • do_mmap
          • do_mmap은 컀널 이 μ—°μ†λœ μ£Όμ†Œ λ²”μœ„λ₯Ό μƒˆλ‘œ λ§Œλ“€ λ•Œ μ‚¬μš©λ˜λŠ” ν•¨μˆ˜μ΄λ‹€.
          • do_mmap은 μƒˆλ‘œ μƒμ„±ν•œ μ£Όμ†Œ λ²”μœ„μ™€ μΈμ ‘ν•œ μ£Όμ†Œ λ²”μœ„κ°€ 이미 μ‘΄μž¬ν•˜κ³ , μƒˆλ‘œ μƒμ„ ν•œ μ£Όμ†Œ λ²”μœ„μ˜ κΆŒν•œ μ„€μ •κ³Ό μΈμ ‘ν•œ μ£Όμ†Œ λ²”μœ„μ˜ 그것이 κ°™λ‹€λ©΄ 두 μ£Όμ†Œ λ²”μœ„λ₯Ό ν•˜λ‚˜λ‘œ ν•©μΉœλ‹€.

          do_mmapν•¨μˆ˜λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간에 μ£Όμ†Œ λ²”μœ„λ₯Ό μΆ”κ°€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.

  • νŽ˜μ΄μ§€ ν…Œμ΄λΈ”μ„ μ΄μš©ν•΄ 가상 μ£Όμ†Œλ₯Ό 물리 μ£Όμ†Œλ‘œ λ³€ν™˜ν•˜λŠ” 과정에 λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.

    1. MMUκ°€ TLB에 찾고자 ν•˜λŠ” page offset이 μ‘΄μž¬ν•˜λŠ”μ§€ 확인
    2. μ‘΄μž¬ν•˜λ©΄ TLBμ—μ„œ κ·Έ 정보λ₯Ό κ°€μ§€κ³  μ™€μ„œ κ³§λ°”λ‘œ 물리 μ£Όμ†Œλ‘œ λ³€ν™˜
    3. μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬μ— μ μž¬λ˜μ–΄ μžˆλŠ” νŽ˜μ΄μ§€ ν…Œμ΄λΈ”μ— μ ‘κ·Ό
      • PTBR을 μ΄μš©ν•˜μ—¬ ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€μ˜ νŽ˜μ΄μ§€ ν…Œμ΄λΈ” μœ„μΉ˜λ₯Ό μ•Œ 수 μžˆλ‹€.
    4. νŽ˜μ΄μ§€ ν…Œμ΄λΈ”μ—μ„œ page offset에 λŒ€μ‘λ˜λŠ” frame offset νšλ“
    5. 가상 μ£Όμ†Œμ˜ page offset 뢀뢄을 frame offset으둜 λ³€ν™˜ν•˜μ—¬ 물리 μ£Όμ†Œ 생성
    6. μƒμ„±ν•œ 물리 μ£Όμ†Œλ₯Ό μ΄μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬λ‘œ μ ‘κ·Ό