os/fs/proc/generators/
meminfo.rs

1use alloc::{format, vec::Vec};
2
3use crate::{
4    config::PAGE_SIZE,
5    fs::proc::ContentGenerator,
6    mm::frame_allocator::{get_free_frames, get_total_frames},
7    vfs::FsError,
8};
9
10pub struct MeminfoGenerator;
11
12impl ContentGenerator for MeminfoGenerator {
13    fn generate(&self) -> Result<Vec<u8>, FsError> {
14        // 从内存管理器获取真实数据
15        let total_frames = get_total_frames();
16        let free_frames = get_free_frames();
17
18        // 转换为 kB(1024 字节)
19        let total_kb = (total_frames * PAGE_SIZE) / 1024;
20        let free_kb = (free_frames * PAGE_SIZE) / 1024;
21        let available_kb = free_kb; // 简化实现:可用内存 = 空闲内存
22
23        // 注意:格式严格遵循 Linux ABI
24        let content = format!(
25            "MemTotal:       {:>8} kB
26MemFree:        {:>8} kB
27MemAvailable:   {:>8} kB
28Buffers:        {:>8} kB
29Cached:         {:>8} kB
30SwapCached:     {:>8} kB
31Active:         {:>8} kB
32Inactive:       {:>8} kB
33Active(anon):   {:>8} kB
34Inactive(anon): {:>8} kB
35Active(file):   {:>8} kB
36Inactive(file): {:>8} kB
37Unevictable:    {:>8} kB
38Mlocked:        {:>8} kB
39SwapTotal:      {:>8} kB
40SwapFree:       {:>8} kB
41Dirty:          {:>8} kB
42Writeback:      {:>8} kB
43AnonPages:      {:>8} kB
44Mapped:         {:>8} kB
45Shmem:          {:>8} kB
46",
47            total_kb, free_kb, available_kb, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
48        );
49
50        Ok(content.into_bytes())
51    }
52}