抄写Linux源码(Day11:设置内存管理机制)

根据 Day9 阅读的 Shell 程序分析

为了支持 shell 程序的执行,我们需要提供:
1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)
2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东西)
3.fork,execve, wait 这三个系统调用,也可以说是 进程调度 (否则无法 halt shell 程序并且启动另外的程序)
4.键盘驱动、VGA/console/uart 驱动、中断处理 (支持键盘输入和屏幕显示)

在 Day10,我们已经能够在内核层面,在 CPU 刚启动时打印字符串。

那么首先要实现啥呢,我们作个弊,看看闪客的文章目录

抄写Linux源码(Day11:设置内存管理机制)_第1张图片

在第十二回,看到 “管理内存”。

再看看需求3

3.fork,execve, wait 这三个系统调用,也可以说是 进程调度 (否则无法 halt shell 程序并且启动另外的程序)

哦对了!shell 在启动其它进程的时候,应该要切换内存空间,也就是切换页表!所以实际上为了支持进程调度,我们这里还应该要支持 5. 内存管理。

那就先从 第十二回 入手吧。

抄写Linux源码(Day11:设置内存管理机制)_第2张图片
(先不论到底是怎么从 MBR 进入 main 函数的) 进入 main 函数后,可以看到如上图的代码

抄写Linux源码(Day11:设置内存管理机制)_第3张图片

这里干的事情简单来说,就是给内存做个划分,举例 memory_end = 8M,那么内存划分的样子就如上图

其实就是定了三个箭头所指向的地址的三个边界变量。

抄写Linux源码(Day11:设置内存管理机制)_第4张图片
随后的 mem_init 和 buffer_init 则是用来管理和分配 主内存区 和 缓冲区 的

今天只看 mem_init 。。。

后续建议继续看闪客的文章,这里只记录重点:

1M 以下的内存这个数组干脆没有记录,这里的内存是无需管理的,或者换个说法是无权管理的,也就是没有权利申请和释放,因为这个区域是内核代码所在的地方,不能被“污染”。

1M 到 2M 这个区间是缓冲区,2M 是缓冲区的末端,缓冲区的开始在哪里之后再说,这些地方不是主内存区域,因此直接标记为 USED,产生的效果就是无法再被分配了。

2M 以上的空间是主内存区域,而主内存目前没有任何程序申请,所以初始化时统统都是零,未来等着应用程序去申请和释放这里的内存资源。

另外,内核中有了内存管理的代码,相应的,就得提供应用程序申请内存时,用来相应内存申请的代码

新增一个需求:7.应用程序申请内存的接口

Linux0.11 中,有申请内存相关的代码,位于 memory.c: get_free_page(),如下:

// 这个函数的主要功能就是选择 mem_map 中的首个空闲页面,并标记为已使用
unsigned long get_free_page(void)
{
register unsigned long __res asm("ax");

__asm__("std ; repne ; scasb\n\t"
	"jne 1f\n\t"
	"movb $1,1(%%edi)\n\t"
	"sall $12,%%ecx\n\t"
	"addl %2,%%ecx\n\t"
	"movl %%ecx,%%edx\n\t"
	"movl $1024,%%ecx\n\t"
	"leal 4092(%%edx),%%edi\n\t"
	"rep ; stosl\n\t"
	" movl %%edx,%%eax\n"
	"1: cld"
	:"=a" (__res)
	:"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES),
	"D" (mem_map+PAGING_PAGES-1)
	);
return __res;
}

可以看到代码中访问了 mem_map 数组,现在看不懂不要紧,后边再说

更新的需求列表。为了支持 shell 程序的执行,我们需要提供:
1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)
2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东西)
3.fork,execve, wait 这三个系统调用,也可以说是 进程调度 (否则无法 halt shell 程序并且启动另外的程序)
4.键盘驱动、VGA/console/uart 驱动、中断处理 (支持键盘输入和屏幕显示)
5.内存管理 (shell 启动其它进程时,不能共用内存,而是切换其它进程的页表)
6.为了写代码方便,我们需要从 MBR 进入到 main 函数,这也是从 汇编 切换到 C 语言
7.应用程序申请内存的接口

你可能感兴趣的:(抄写Linux内核源码,Linux)