Skip to content

12 内存划分:如何借助边界值划分内存?

你好,我是闪客。

书接上回,上一讲,我们回顾了一下 main.c 函数之前我们做的全部工作,给进入 main 函数做了充分的准备。

这一讲,我们将看到一个初步的内存管理方案,并通过一个巧妙的数据结构将全部内存井井有条地管理起来。

为什么要给内存划分边界

让我们从 main 函数的第一行代码开始读。

// init/main.c
void main(void) {
    ROOT_DEV = ORIG_ROOT_DEV;
    drive_info = DRIVE_INFO;
    ...
}

首先,ROOT_DEV 为系统的根文件设备号,drive_info 为之前 setup.s 程序获取并存储在内存 0x90000 处的设备信息,我们先不管这俩变量,等之后用到了再说。

我们看后面这一“坨”很影响整体画风的代码。

// init/main.c
void main(void) {
    ...
    memory_end = (1<<20) + (EXT_MEM_K<<10);
    memory_end &= 0xfffff000;
    if (memory_end > 16*1024*1024)
        memory_end = 16*1024*1024;
    if (memory_end > 12*1024*1024) 
        buffer_memory_end = 4*1024*1024;
    else if (memory_end > 6*1024*1024)
        buffer_memory_end = 2*1024*1024;
    else
        buffer_memory_end = 1*1024*1024;
    main_memory_start = buffer_memory_end;
    ...
}