《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.4 内存管理结构mem_map初始化

简介: 本节书摘来自华章计算机《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》一书中的第2章,第2.4节,作者:新设计团队著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 内存管理结构mem_map初始化

对主内存区起始位置的重新确定,标志着主内存区和缓冲区的位置和大小已经全都确定了,于是系统开始调用mem_init()函数。先对主内存区的管理结构进行设置,该过程如图2-5所示。

image

具体执行代码如下:

//代码路径:init/main.c:
void main(void)
{
    …
    mem_init(main_memory_start,memory_end);
    …
}
//代码路径:mm/memory.c:
    …
    #define LOW_MEM 0x100000                //1 MB
    #define PAGING_MEMORY (15*1024*1024)
    #define PAGING_PAGES (PAGING_MEMORY>>12)        //15 MB的页数
    #define MAP_NR(addr) (((addr)-LOW_MEM)>>12)
    #define USED 100
    …
    static long HIGH_MEMORY= 0;
    …
    static unsigned char mem_map [PAGING_PAGES]= {0,};
    …
void mem_init(long start_mem, long end_mem)
{
    int i;

    HIGH_MEMORY= end_mem;
    for (i=0;i<PAGING_PAGES;i++)
         mem_map[i]= USED;
    i= MAP_NR(start_mem);                //start_mem为6 MB(虚拟盘之后)
    end_mem -= start_mem;
    end_mem >>= 12;                    //16 MB的页数
    while (end_mem-->0)
         mem_map[i++]=0; 
}

系统通过mem_map[]对1 MB以上的内存分页进行管理,记录一个页面的使用次数。
mem_init()函数先将所有的内存页面使用计数均设置成USED (100,即被使用),然后再将主内存中的所有页面使用计数全部清零,系统以后只把使用计数为0的页面视为空闲页面。
那么为什么系统对1 MB以内的内存空间不用这种分页方法管理呢?这是因为,操作系统的设计者对内核和用户进程采用了两套不同的分页管理方法。内核采用分页管理方法,线性地址和物理地址是完全一样的,是一一映射的,等价于内核可以直接获得物理地址。用户进程则不然,线性地址和物理地址差异很大,之间没有可递推的逻辑关系。操作系统设计者的目的就是让用户进程无法通过线性地址推算出具体的物理地址,让内核能够访问用户进程,用户进程不能访问其他的用户进程,更不能访问内核。1 MB以内是内核代码和只有由内核管控的大部分数据所在内存空间,是绝对不允许用户进程访问的。1 MB以上,特别是主内存区主要是用户进程的代码、数据所在内存空间,所以采用专门用来管理用户进程的分页管理方法,这套方法当然不能用在内核上。详细内容请看第6章中的内存管理,深层次原因的分析请看第9章。

相关文章
|
10天前
|
算法 程序员
深入理解操作系统内存管理:分页系统的优势与挑战
【4月更文挑战第7天】 在现代操作系统中,内存管理是一项至关重要的任务,它确保了计算机能够高效、安全地运行各种程序。分页系统作为内存管理的一种技术,通过将物理内存分割成固定大小的单元——页面,为每个运行的程序提供了一种独立且连续的内存地址空间。该技术不仅简化了内存分配,还允许更高效的内存使用和保护。本文探讨了分页系统的核心原理,优势以及面临的挑战,旨在为读者揭示其在操作系统设计中的重要性。
|
26天前
|
安全 Shell Linux
【Shell 命令集合 系统设置 】Linux 初始化系统设置setup命令 使用指南
【Shell 命令集合 系统设置 】Linux 初始化系统设置setup命令 使用指南
32 0
|
21天前
|
存储 算法 Linux
【Linux 应用开发 共享内存】深入理解和实践 ftruncate:共享内存的有效管理
【Linux 应用开发 共享内存】深入理解和实践 ftruncate:共享内存的有效管理
52 5
|
26天前
|
Shell Linux C语言
【Shell 命令集合 磁盘维护 】Linux 创建一个初始化内存盘 mkinitrd命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建一个初始化内存盘 mkinitrd命令使用教程
33 0
|
22天前
|
存储 算法 Linux
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构
36 0
|
2天前
|
算法
深入理解操作系统的内存管理机制
【4月更文挑战第15天】 本文将探讨操作系统中至关重要的一环——内存管理。不同于通常对内存管理概念的浅尝辄止,我们将深入研究其核心原理与实现策略,并剖析其对系统性能和稳定性的影响。文章将详细阐述分页系统、分段技术以及它们在现代操作系统中的应用,同时比较它们的效率与复杂性。通过本文,读者将获得对操作系统内存管理深层次工作机制的洞见,以及对设计高效、稳定内存管理系统的理解。
|
9天前
|
存储 算法
深入理解操作系统内存管理:原理与实践
【4月更文挑战第8天】 在现代计算机系统中,操作系统扮演着关键角色,特别是在内存资源的管理上。本文将深入探讨操作系统中的内存管理机制,包括虚拟内存、物理内存的分配与回收,以及页面置换算法等关键技术。通过分析不同内存管理策略的优势与局限性,本文旨在为读者提供一套系统的内存管理知识框架,帮助理解操作系统如何高效、安全地管理有限的内存资源以满足多任务处理的需求。
|
10天前
|
Prometheus 监控 Cloud Native
【Linux】查看系统内存命令(详细讲解)
【Linux】查看系统内存命令(详细讲解)
|
12天前
|
缓存 监控 算法
深入理解操作系统的内存管理机制
【4月更文挑战第5天】 随着现代计算机系统的发展,操作系统的内存管理已成为确保系统高效稳定运行的关键因素。本文旨在探讨操作系统中内存管理的基本原理、关键技术及其在实际应用中的优化策略。通过分析内存分配、虚拟内存技术以及内存保护和分页机制等方面,揭示内存管理对提升系统性能的重要性,并提供了一系列优化内存使用效率的方法。
|
12天前
|
算法 安全
探索现代操作系统中的虚拟内存管理
【4月更文挑战第5天】 在本文中,我们深入剖析了现代操作系统中的一个关键组件——虚拟内存管理。我们将探讨其设计原理、实现机制以及它如何提升了多任务处理的效率和系统的稳定性。通过对比分析不同的内存管理策略,本文旨在为读者提供一个全面而深刻的视角,以理解虚拟内存对现代计算技术发展的重要性。