linux内核内存笔记

news2024/11/23 7:15:36

一、linux用户态内核态内存结构
对于32位的linux操作系统,系统为每个进程分配0~4G的内存空间,而64位系统则更大:

 linux内存空间地址范围

可见Linux的内存分配规则:

二、总体分配规则

1、用户态在低地址,内核态在高地址。

2、 64位的系统,目前一般使用了48位。用户态高16位都是0, 内核态高16位一直是FFFF。 都用剩下的48位来表示128T。1T==1024*1024*1024*1024。 剩下的8位直接上也只用了7位, 第48位来表示是内核空间还是用户空间。加一起 48位表示的就是128T。

     其中,0x0000000000000000~0x00007fffffffffff 表示用户空间, 0xFFFF800000000000~ 0xFFFFFFFFFFFFFFFF 表示内核空间,共提供 256TB(2^48) 的寻址空间。
     这两个区间的特点是,第 47 位与 48~63 位相同,若这些位为 0 表示用户空间,否则表示内核空间。所以上面那个话64位的内存分布图有点问题。用户态128T的最高地址不对。

三、用户空间分配规则

1、用户空间堆申请空间往上涨,栈申请空间往下涨,栈的地址肯定比堆的地址高。 然后栈和堆中间还有一段区域用来共享:文件映射, mmap使用。

文件映射,用于映射共享库等程序运行必须的文件,同时该区域可用于申请较大的内存

2、用户空间运行时动态申请内存

malloc的分配内存有两个系统调用,一个brk,一个mmap,brk是将.data的最高地址指针_edata往高地址走,mmap则是在进程的虚拟地址空间(在堆和栈之间的内存映射区域)找一块空间。这两种都是没有实际分配物理内存,只有当真正使用的时候才发生缺页中断,分配物理内存。

一般情况下,使用malloc,如果小于128k,则使用brk分配,如果大于128k,则使用mmap在堆和栈之间找一个空闲空间分配。

3、用户空间虚拟地址中各段内容

 A.正文段。这是由cpu执行的机器指令部分。通常,正文段是可共享的,所以即使是经常执行的程序(如文本编辑程序、C编译程序、shell等)在存储器中也只需要有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改器自身的指令。

B.初始化数据段。通常将此段称为数据段,它包含了程序中需赋初值的变量。例如,C程序中任何函数之外的说明:
int maxcount = 99;(全局变量)

C.非初始化数据段。通常将此段称为bss段,这一名称来源于早期汇编程序的一个操作,意思是"block started by symbol",在程序开始执行之前,内核将此段初始化为0。函数外的说明:
long  sum[1000];
使此变量存放在非初始化数据段中。 注意这个地方初始化和非初始化的区别。
 

D.栈。自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次函数调用时,其返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。然后,新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,C函数可以递归调用。

E.堆。通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段顶和栈底之间。

四、内核空间分配规则

1、内核空间结构

内核空间分为几大区域

直接映射区:分配的虚拟地址映射到连续的物理地址上

动态映射区:分配的虚拟地址映射到物理地址是不连续的

永久内存映射区:

固定映射区:虚拟地址是固定的,而被映射的物理地址并不固定。采用固定虚拟地址的好处是它相当于一个指针常量(常量的值在编译时确定),指向物理地址,如果虚拟地址不固定,则相当于一个指针变量。指针常量相比指针变量的好处是可以减少一次内存访问,因为指针变量需要通过内存访问才可以获得指针本身的值。

2、直接映射区

在3GB~(3GB+896MB)这段直接映射区,包含了内核初始化页表swapper_pg_dir,内核镜像等。内核也是由一个elf文件(比如vmlinux)加载启动的,加载后也有text段,data段,bss段等。可通过cat /proc/iomem命令查看kernel的text段,data段和bss段的内存分布。

normal memory区也属于直接映射区,用于kmalloc()的内存分配,kmalloc()返回的是虚拟地址,但分到的内存在物理地址上是连续的。

2、动态映射区

动态映射区即上图vmalloc area区,对应下图VMALLOC_START和VMALLOC_END之间的区域,动态内存映射区和直接映射区(直接映射的物理内存)之间有8MB的间隔。这部分间隔不作任何地址映射,相当于一个空洞,主要用做安全保护,防止不正确的越界内存访问,因为此处没有进行任何形式的映射,如果进入到空洞地带,将会触发处理器产生一个异常。

动态映射区主要供vmalloc()分配内存,同kmalloc()相比,vmalloc()分配的内存只能保证在虚拟地址上连续,不能保证在物理地址上连续。在物理地址上连续有什么好处呢?

  • 可以更好的根据空间局部性原理利用cache,增加数据访问的速度。
  • 由于kmalloc()基于的是直接映射,其虚拟地址和物理地址之间是一个固定的偏移,因此可以利用既有的内核页表,而不需要为新的地址增加新的page table entries,因此其分配速度也比vmalloc()更快。
  • 因为物理地址不连续,通过vmalloc()获得的每个page需要单独映射,而TLB资源很有限,因此这将比直接映射造成更严重的TLB thrashing问题。

用户空间的进程通过malloc()分配内存时,获得的只是虚拟地址的使用权,要等到真正往这块内存写数据了,才会获得对应的物理页面,而且是用多少给多少,而不是要多少给多少。内核空间的vmalloc()不一样,申请的物理内存立刻满足。

五、真实物理内存

网上有ZONE_DMA、ZONE_NORMAL、ZONE_HIGMEM的说法,主要针对真实物理内存的分区

 

参考:

linux 内存空间(三) 内存地址范围和例子

linux中的内核地址空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进击中的 Zebec 生态,Web2 与 Web3 世界的连接器

虽然从意识形态上看,Web2世界与Web3世界存在着不同的逻辑,但我们同样看到,随着加密资产领域的发展,其正在作为优质投资品,被以Paypal、高盛等主流机构重视与接受。当然,除了作为投资者品外,近年…

C++学习笔记-环境设置

C 是一种通用编程语言,如今已广泛用于竞争性编程。它具有命令式,面向对象和通用编程功能。 C 在Windows,Linux,Unix,Mac等许多平台上运行。在开始使用C 进行编程之前。我们将需要在本地计算机上设置一个环境&#xff0…

用PHP实现CSPRepor报告预警信息存储和动态显示。

一、了解CSP内容安全策略 CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。 作用就是:大大增强了网页的安全性。…

透明和半透明效果

Alpha通道 透明度可以通过base map的alpha通道来控制。Alpha值低的话,mesh就变得更加透明,alpha值高的话,mesh的透明度会变低,变得能更加轻松地被看到。当alpha为0时,mesh就完全不可见了,alpha值在中间时&a…

kubernetes(k8s) 知识总结(第2期)

1. “控制器”思想 kube-controller-manager 是一系列控制器的集合,这些控制器被放在 Kubernetes 项目的 pkg/controller 目录,这些控制器都以独有的方式负责某种编排功能。它们都遵循一个通用的编排模式——控制循环。 以 Deployment 为例介绍它对控…

最最普通程序员,如何利用工资攒够彩礼,成为人生赢家

今天我们不讲如何提升你的专业技能去涨工资,不讲面试技巧如何跳槽涨工资,不讲如何干兼职赚人生第一桶金,就讲一个最最普通的程序员,如何在工作几年后,可以攒够彩礼钱,婚礼酒席钱,在自己人生大事…

什么是网络流量分析(NTA),有什么好用的NTA软件

分析网络的稳定性首先要监控其性能、设备功能、网络速度以及许多网络管理员忽略的另一个方面:网络流量。网络流量分析 (NTA) 通常是考虑最少的方面,但它会影响许多问题,例如性能下降和用户速度缓慢。忽视它可能会让位于…

SQL语句实现找到一行中数据最大值(greatest)/最小值(least);mysql行转列

今日我在刷题时遇到这样一个题,它提到了以下需求: 有一场节目表演,五名裁判会对节目提供1-10分的打分,节目最终得分为去掉一个最高分和一个最低分后的平均分。 存在以下一张表performence_detail,包含字段有performa…

Docker安装RocketMQ 4.8

1拉取4.8镜像 docker pull foxiswho/rocketmq:4.8.0拉取控制台镜像 docker pull styletang/rocketmq-console-ng2创建rocketmq使用的共有网络,便于相互访问 docker network create rocketmq_network3启动rmqnamesrv docker run -d --name rmqnamesrv --network …

电脑录屏怎样不录到外界声音?调整这一个开关,即可实现

​有很多小伙伴希望自己电脑录屏的时候,不要录制自己的声音,而是通过后期配音的方式完成视频创作。电脑录屏怎样不录到外界声音?其实只需要调整这一个开关,就能实现不录外界声音,一起来看看吧。 不录外界声音1&#xf…

什么是 Java 泛型?

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注! 作者| 慕课网精英讲师 ColorfulC 通过本篇文章你将了解到什么是泛型,为什么需要泛型,如何使用泛型,如何自定义泛型&…

记一次以小勃大,紧张刺激的渗透测试(2017年老文)

零、前言 有技术交流或渗透测试培训需求的朋友欢迎联系QQ/VX-547006660,需要代码审计、渗透测试、红蓝对抗网络安全相关业务可以看置顶博文 2000人网络安全交流群,欢迎大佬们来玩 群号820783253 一、起因 emmm,炎炎夏日到来,这…

libxlsxwriter数据验证

今天要分享的这个问题其实也属于excel的高级用法。我们想通过libxlsxwriter来实现一个能对用户的输入进行数据验证的表格功能。 内心os:小白最近是不是有点走火入魔了……我们真的会遇上这样的场景吗:需要通过代码生成一个表格,这个表格中还有…

智慧机场,或将成为航空领域数字孪生技术得完美应用

在《智慧民航建设路线图》文件中,民航局明确指出,智慧机场是实现智慧民航的四个核心抓手之一。这一战略性举措旨在推进数字化技术与航空产业的深度融合,为旅客提供更加智能化、便捷化、安全化的出行服务,进一步提升我国民航发展的…

IO流进阶

🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录IO流进阶缓冲流缓冲流概述字节缓冲流(…

【LeetCode】剑指 Offer(1)

目录 写在前面: 题目1:剑指 Offer 03. 数组中重复的数字 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目2:剑指 Offer 06. 从…

JavaEE初阶---TCP/IP协议

一:概述 本文是网络编程的理论基础,也是网络部分的重点和难点,在笔试,面试中,这部分内容也多有考察.二:详解 TCP/IP五层协议 应用层传输层网络层数据链路层物理层 2.1应用层 我们自己编写的代码,就是在应用层,这也是在实际开发中接触最多的层.应用层里有许多现成的协议 , 而在…

springboot(5)静态资源访问前缀+欢迎页+REST风格的传递参数

Springboot的访问规则是 先访问controller的请求,如果没有的话,我们在访问静态资源。 但是静态资源过多的情况下这样不好处理,所以我们可以加一个前缀,这样可以拦截掉非静态资源的请求,每次都可以准确快速无风险的访…

镀镍废水处理,企业污水处理,离子交换树脂在镀镍废水中的应用

传统沉淀法不能满足日益提的环保要求(如电镀表三镍含量要求0.1mg/l以下)。针对特定重金属离子的特点,利用螯合树脂的特种功能基团与重金属离子形成络合物的特性,实现重金属离子的回收利用及深度去除。 CH-90Na对除铜镍铅锌钴锰等具有特定的选择性&#x…

API的应用

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节 应用程序接口 想…