自制操作系统(九) 内存管理

2016.07.04  2016.07.05

操作系统本质是一个程序,一个大型软件工程(商业化os的情况)。而程序的本质---一方面是所谓的“数据结构+算法”,另一方面则是 封装+抽象。操作系统作为一个出现,一方面是控制硬件启动开机,并且作为第一个在计算机上运行的软件,另一方面,操作系统负责管理计算机的资源(内存管理,文件管理,I\O),协助用户要运行的程序在计算机上运行,甚至是多个程序同步运行(进程管理)。所以你可看到,操作系统本质上和那些b\s模式的企业管理网站本质没有任何区别,都是管理。只不过操作系统要管理的是计算机资源(在对计算机底层抽象的基础上),和程序,作为一个boss级别的程序管理程序(这里你要理解程序运行所需的那些基础,内存、寄存器、cpu等等……了解了这些基础才能知道操作系统作为一个boss程序怎么管理应用程序)。

所以你可以看到,计算机的目的就是要运行程序。而操作系统是一个在计算机上运行的程序,目的是帮助计算机在人类的操作下更好的运行程序。

这一章的内存管理便是操作系统作为boss程序的一种体现。操作系统管理内存是因为,计算机要运行程序需要内存,所以操作系统作为程序的大boss,来负责管理并给应用程序(小弟们)分配、回收内存。

首先,内存管理要涉及缓存的概念。在我们做内存检查时要将缓存设为OFF。

unsigned int memtest(unsigned int start, unsigned int end)
{
    char flg486 = 0;
    unsigned int eflg, cr0, i;

    /* 确认CPU是386还是486以上的 */
    eflg = io_load_eflags();
    eflg |= EFLAGS_AC_BIT; /* AC-bit = 1 */
    io_store_eflags(eflg);
    eflg = io_load_eflags();
    if ((eflg & EFLAGS_AC_BIT) != 0) { /* 如果是386、即使设定AC=1,AC的值还是会回到0 */
        flg486 = 1;
    }
    eflg &= ~EFLAGS_AC_BIT; /* AC-bit = 0 */
    io_store_eflags(eflg);

    if (flg486 != 0) {
        cr0 = load_cr0();
        cr0 |= CR0_CACHE_DISABLE; /* 禁止缓存 */
        store_cr0(cr0);
    }

    i = memtest_sub(start, end);

    if (flg486 != 0) {
        cr0 = load_cr0();
        cr0 &= ~CR0_CACHE_DISABLE; /* 允许缓存 */
        store_cr0(cr0);
    }

    return i;
}

(未完待续)

时间: 2024-11-10 07:13:45

自制操作系统(九) 内存管理的相关文章

Linux System Programming 学习笔记(九) 内存管理

1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系结构决定了内存页大小,32位系统通常是 4KB, 64位系统通常是 8KB 内存页分为 valid or invalid: A valid page is associated with an actual page of data,例如RAM或者磁盘上的文件 An invalid page is

操作系统之内存管理

1.内存中都存储什么? 操作系统和进程,特别是多道程序设计时,要将主存继续细分: 2.内存管理需要做那些事情? 重定位:实现重定位进程就不需要记录以前自己在主存中的位置,以此实现进程换入/换出(进程的页或段换入主存时可以定位到在主存中的物理位置),也就是在进程运行时计算逻辑地址对应的物理位置. 保护:保护进程不受其他进程无意或有意的干涉.比如进程A和进程B,如果A没有授予B权限,那B就不能访问A,其次,每次执行进程时要确定访问的是该进程的东西. 共享:进程不能单打独斗,有时候需要和其他进程一起完

操作系统之内存管理(一)

物理内存与虚拟内存 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念. 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在Linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(SwapSpace). 作为物理内存的扩展,Linux会在物理内存不足时,使用交换分区的

操作系统之内存管理(一)

1 操作系统想要管理内存,首先得利用内存.那么如何利用内存呢,在我们程序要执行的时候,我们需要将程序装载到内存中,pc指向开始地址,并且让cpu取址执行,于是我们就利用上了内存. 2那么我们首先考虑一下如何将程序装载到内存中,操作系统会找寻一段空闲的区域,让我们的程序装载进去,而在我们编写的程序中,如call 40,40是一个相对地址,相对于这个程序的偏移量,但是装载到空闲内存的时候,我们又是如何得知,这个40变为多少了呢?这就引出了重定向的概念.如下图,我们希望到内存的时候,call 40变为

操作系统之内存管理1

1. 2.内存管理需要达到的目的? 1)地址保护:多道程序之间互不干扰,一个进程不能随便访问另外一个进程的地址空间. 2)地址独立:程序发出的地址与具体机器的物理主存地址是独立的. 3.为什么提出了虚拟内存? 在计算机中,一个程序要运行,必须加载到物理主存中,但是物理主存的容量是非常有限的,因此我们要把一个程序全部加载到主存,我们的每一个程序大小就要限制.另外,即使我们编写的每一个程序的大小都小于物理主存的容量,但主存能够存放的程序数量也是有限的.这将大大限制多道编程的发展,所以我们发明了虚拟内

操作系统:内存管理(概念)

对于计算机系统而言,操作系统充当着基石的作用,它是连接计算机底层硬件与上层应用软件的桥梁,控制其他程序的运行,并且管理系统相关资源,同时提供配套的系统软件支持.对于专业的程序员而言,掌握一定的操作系统知识比不可少,因为不管面对的是底层嵌入式开发,还是上层的云计算开发,都需要使用到一定的操作系统相关知识. 内存管理有哪几种方式 分段和分页的区别是什么 什么是虚拟内存 什么是内存碎片什么是内碎片什么是外碎片 虚拟地址逻辑地址线性地址物理地址有什么区别 Cache替换算法有哪些 内存管理有哪几种方式

操作系统之内存管理2

1.常见的内存管理办法,固定加载地址的内存管理,固定分区的内存管理,非固定分区的内存管理和交换内存管理.第一种只适合单道编程,后三种适合多道编程,这3种适合多道编程的内存管理方式均使用同一种实现机制:基址和极限,并且以交换内存管理最为灵活和先进,但是交换内存管理存在的问题是空间浪费和程序大小受限. 2.什么是外部碎片? 随着程序在内存和磁盘间的交换,内存将变得越来越碎片化,即内存将被不同的程序分割成尺寸大小不一的无法使用的小片空间,从进程的角度看,这些碎片处于进程空间的外面,这种碎片化过程也称为

操作系统之内存管理(二)

1 前面已经有了分段的概念,那么为什么 有分页的出现呢? 这是为了提高内存分区导致的内存效率问题,在程序转载到内存的时候,我们知道程序是分段载入的,通过内存分区来装载不同的段.那么如果有下面问题,我现在需要请求的空间为160k,而我的总空闲空间是大于160k的,但是没有一个空闲分区大于160k,那么按照分区的管理,就无法利用这总共的内存区域,而内存中的空闲区域也就变成了内存碎片,为了解决这个问题,引出了分页机制!其实就是将内存分成更小的块来进行管理,每块为4k 2 有了分页机制之后,我们的内存分

模拟操作系统动态内存管理(c实现)

操作系统对内存申请与释放(对连续的区域合并)的模拟 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 10 //预设的内碎片的最小值 4 #define M_set 1024//预设的内存大小 5 6 struct mem_block 7 { 8 int num; 9 int addr; 10 int length; 11 mem_block *next; 12 }; 13 typedef mem_block* point

操作系统:内存管理

http://blog.csdn.net/zephyr_be_brave/article/details/8944967 http://www.cnblogs.com/yunsicai/p/3326105.html http://www.cppblog.com/prayer/archive/2009/08/17/93597.html http://www.jianshu.com/p/41ad81a5d504