================================================================================
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')