260917(목)

Jinhoon Yoon·2026년 9월 17일
================================================================================
                   1. THE TWO WORLDS: USER SPACE vs. KERNEL
================================================================================

 [ USER SPACE (Your Program) ]                   [ KERNEL SPACE (OS & Hardware) ]
 ─────────────────────────────                   ────────────────────────────────
 
  Stack Frame (tail_file)                         Kernel RAM (Open File Table)
  ┌─────────────────────────┐                     ┌─────────────────────────────┐
  │ file: File              │                     │ struct file {               │
  │   └── fd: 3 ────────────┼─── (System Call) ──►│   f_pos: 10000 (cursor)     │
  │                         │                     │   inode: -> disk metadata   │
  │ total_len: 10000        │                     │ };                          │
  │ remaining: 10000        │                     └──────────────┬──────────────┘
  │                         │                                    │
  │ buffer: [0u8; 8192]     │                                    │
  │  [   8 KB in RAM   ]    │◄────── (Loads Data via DMA) ───────┤
  └─────────────────────────┘                                    ▼
                                                          [ PHYSICAL SSD / DISK ]
                                                          [0 . . . . . . . 10000]

================================================================================
           2. STEPPING BACKWARD: FROM DISK OFFSETS TO RAM BUFFER
================================================================================

 Suppose total file length = 10,000 bytes, Chunk Size = 8,192 bytes (8 KB)

 [ THE FILE ON DISK ]
 Byte 0                                 Byte 1808                     Byte 10000 (EOF)
   ├────────────────────────────────────────┼────────────────────────────────┤
   │          Remaining (1,808 B)           │    Target Chunk to Read (8 KB) │
   │          (Saved for Round 2)           │       [ chunk_to_read = 8192 ] │
   └────────────────────────────────────────┴────────────────────────────────┘
                                            ▲
                                            │
                                      read_offset
                                  (10000 - 8192 = 1808)


 ACTION A: file.seek(SeekFrom::Start(1808))
   The OS moves its internal cursor (`f_pos`) to byte 1808.
   No text or data is copied into your program yet.


 ACTION B: file.read_exact(&mut buffer[..8192])
   The OS reads forward from 1808 to 10000 and fills your stack buffer in RAM.

                 ┌─────────────────── DISK (1808..10000) ──────────────────┐
                 │ "log line 98\n log line 99\n log line 100\n"            │
                 └────────────────────────────┬────────────────────────────┘
                                              │
                                     (Loaded into RAM)
                                              │
                                              ▼
 [ YOUR BUFFER IN RAM ]
 Index 0                                                           Index 8191
   ┌────────────────────────────────────────────────────────────────────────┐
   │ [0] │ [1] │ [2] │  . . . . . . . . . . . . . . . . . . . . . .  │[8191]│
   └────────────────────────────────────────────────────────────────────────┘
   ◄──────────────────────── ITERATE BACKWARD (.rev()) ─────────────────────
               Scan in RAM for newline characters ('\n')

0개의 댓글