《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.2 规划物理内存格局,设置缓冲区、虚拟盘、主内存

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

2.2 规划物理内存格局,设置缓冲区、虚拟盘、主内存

接下来设置缓冲区、虚拟盘、主内存。主机中的运算需要CPU、内存相互配合工作才能实现,内存也是参与运算的重要部件。对内存中缓冲区、主内存的设置、规划,从根本上决定了所有进程使用内存的数量和方式,必然会影响到进程在主机中的运算速度。
具体规划如下:除内核代码和数据所占的内存空间之外,其余物理内存主要分为三部分,分别是主内存区、缓冲区和虚拟盘。主内存区是进程代码运行的空间,也包括内核管理进程的数据结构;缓冲区主要作为主机与外设进行数据交互的中转站;“虚拟盘区”是一个可选的区域,如果选择使用虚拟盘,就可以将外设上的数据先复制进虚拟盘区,然后加以使用。由于从内存中操作数据的速度远高于外设,因此这样可以提高系统执行效率。
这里,系统要对主内存中的这三种不同性质的区域,在大小、位置以及管理方式方面进行规划。
先根据内存大小对缓冲区和主内存区的位置和大小进行如图2-2所示的初步设置。

image

具体执行代码如下:

//代码路径:init/main.c:

    …
#define EXT_MEM_K (*(unsigned short *)0x90002)    //从1 MB开始的扩展内存(KB)数
    …
void main(void)
{
    …
    memory_end= (1<<20) + (EXT_MEM_K<<10); //1 MB + 扩展内存(MB)数,即内存总数
    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;    //缓冲区之后就是主内存
    …
}

其中memory_end为系统有效内存末端位置。超过这个位置的内存部分,在操作系统中不可见。main_memory_start为主内存区起始位置。buffer_memory_end为缓冲区末端位置。对于缓冲区的起始位置,我们将在2.10节中详细介绍。
小贴士
有几个常用的左移、右移的数据关系需要记住:
<<20或>>20相当于乘或除以1 MB,
<<12或>>12相当于乘或除以4 KB(联想到页),
<<10或>>10相当于乘或除以1 KB。
所以,1<<20就是1 MB,EXT_MEM_K<<10就是EXT_MEM_K(扩展内存的KB数)的字节数。

相关文章
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
1040 17
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
1161 0
Linux内存问题排查命令详解
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
2118 23
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
744 48
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
597 27
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
710 0
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
702 3
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
3904 2
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
1088 4
微服务架构实战指南:从单体应用到云原生的蜕变之路