浅析Linux 内存布局

news2024/12/23 23:33:20

【推荐文章】

路由选择协议——RIP协议

纯干货,linux内存管理-内存管理架构(建议收藏)

轻松学会linux下查看内存频率,内核函数,cpu频率

X86体系结构

在X86体系结构下,物理内存地址一般从0x0000_0000开始,而Linux内核主要按照在物理地址0x0010_0000开始的地方,即物理地址1M以上的空间。那最开始的1M空间是用来干什么的呢?

考虑到通用的IBM-PC体系结构,最开始的1M空间由BIOS例程和映射ISA图形卡的内存,这块区域为了所有IBM兼容PC从640K到1M的物理地址,始终存在,但无法被操作系统使用。

主要内存布局如上图所示:

mmap映射区向下扩展,堆向上扩展,两者相对扩展,直到耗尽虚拟地址空间中的剩余区域。

BSS段用来存放程序中未初始化的全局变量,该段内容只记录数据所需空间大小,并不分配真实空间。

DATA段用来存放程序中已初始化的全局变量,为数据分配空间,数据具体值保持在目标文件中。

CODE段用来存放程序中执行代码的内存区域,通常为大小确定的只读段,包括只读常量、只读代码等。

ARM体系结构

以S3C2410为例子,假设物理内存为64M,映射到ARM的起始物理地址为【0x3000_0000~0x3200_0000】,这个由硬件接线决定。我们可以通过查看内核编译输出的System.map文件来了解内核虚拟地址空间布局,结果类似如下:

可以看出内核镜像大小为3.7M,虚拟地址空间起始地址为0xc000_0000(这是开启MMU之后的虚拟地址空间),在内核head.S文件中,有内核线性地址和物理地址的描述,见下图:

PAGE_OFFSET为0xC000_0000,为内核虚拟地址相对偏移(相对于0地址的偏移),PHYS_OFFSET为内核载入实际物理地址相对偏移,不同的硬件板子,ARM访问的内存物理地址不一样,这里以0x3000_0000(这由硬件接线决定)为假设。TEXT_OFFSET为0x0000_8000,为编译时指定的代码段偏移,所以,uboot最后启动内核的地址为内核代码指定的KERNEL_RAM_PADDR(0x3000_8000),这样才能正常运行,而内核的入口地址和载入地址,最好设置成一样。而uboot加载kernel的实际地址设置为0x3000_7fc0,比KERNEL_RAM_PADDR少64个字节,这可以避免拷贝内核,64个字节为uImage内核镜像针对uboot添加的特定头部信息。

从上面的检查宏可以看出,内核开始的物理地址,必须开始在0xXXXX_8000的地址空间。

swapper_pg_dir 为内核全局页表的起始地址,stext为内核的入口虚拟地址,因此,可以看出,全局页表占据16K的空间。

head.S文件的功能,主要获取处理器类型和机器类型信息,创建临时页表,然后开启MMU,并进入第一个C语言函数start_kernel。

内核提供的内存访问接口

内核提供的所有接口都是以页为单位分配内存的,其中,最核心的函数为alloc_pages,其原型如下:

struct page * alloc_pages(unsigned int gfp_mask,unsigned int order)

该函数分配2^order个连续的物理页,并返回指向第一个页的指针。如果分配出错,返回NULL。其他的一些页分配接口。

1. kmalloc/kfree: 基于slab分配器的内存分配函数,支持分配大小32byte-128KB,分配的为物理地址连续的一段内存,使用GFP_KERNEL时,函数可能睡眠。使用GFP_ATOMIC时,函数不睡眠。

kzalloc:基于kmallc的,分配一段内核内存并且清零。

2.vmalloc/vfree:工作在内核虚拟空间的VMALLOC_START和VMALLOC_END所代表的vmalloc区,支持分配大内容,分配为逻辑地址连续的一段内存,速度慢,效率低,可能睡眠,映射的地址优先从ZONE_HIGHMEM分配.

3.利用slab分配器的高速缓存,使用kmem_cache_create和keme_cache_alloc这两个函数。/proc/slabinfo查看所有的kmem_cache缓存。 keme_cache_alloc 用于需要频繁分配和释放同一类型的数据结构对象,充分利用硬件缓存,提升系统性能。

相反的处理函数有kmem_cache_destory和kmem_cache_free

4.用于多处理器的per-CPU变量,核心思想是,通过为系统中每个处理器都分配一个CPU特定的变量副本,减少多处理器并发访问时的锁定操作,提高系统性能。

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

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

相关文章

微信小程序实战之获取用户信息并保存唯一实例

前言 这是我参加掘金启航计划的第二篇文章,这次总结的是获取用户信息并联合 mobx 状态管理库,保存全局唯一的用户对象。 本篇文章基于 微信云开发 ,数据从云数据库中取出,使用微信云数据库API进行获取数据,希望观众老…

Altium Designer飞线不从过孔里面出线如何解决?

出现以上飞线不从过孔出线的原因是其拓扑结构所导致,解决方式就是设置下拓扑结构。 1、执行菜单栏命令“设计-规则”,或者快捷键DR,快速打开“PCB规则及约束编辑器”对话框,如图1所示。 2、在对应的对话框中,选择“Rou…

postgres源码解析41 btree索引文件的创建--2

本文将从btbuild函数作为入口从源码角度进行讲解btree文件的创建流程,执行SQL对应为CREATE TABLE wp_shy(id int primary key, name carchar(20))。知识回顾见:postgres源码解析41 btree索引文件的创建–1 执行流程图梳理 _bt_spools_heapscan 执行流程…

2153年,人类已被AI所奴役。就在这一天,作为一名被俘虏的“搜查部队”士兵,你来到了A0007号城外的反抗军基地中

2153年,地球。   人类,已被AI所奴役。   这个AI的缩写名为——PTA,或称“辟塔”。      辟塔的原型,是一个用于分析网络用户消费倾向并立即给出相关引导的软广告程序。   很快,辟塔便成了广大商家的宠儿&…

【华为上机真题 2022】求解连续数列

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

MatLab SimuLink国产代替

MATLab SimuLink国产代替 米国的限制,把工业软件的国产化推到风口浪尖,作为扎根工业软件开源基础架构20多年的UCanCode, 一直是国外顶尖工业软件的基础架构提供商之一。许多国外软件都在这个基础上构建出来,这里我们也希望探讨一下国产代替Ma…

乐享元游的 UWA Pipeline 最佳实践分享

“躬身入局 践行游戏研发工业化”是UWA在2022年研发上坚持的方向,其中UWA Pipeline更是今年在工业化部署上的一个重要的突破口。在近一年里,越来越多的游戏研发团队在日常项目生产开发中,使用UWA Pipeline搭建了符合自身需求的DevOps研发交付…

fat32文件系统分析

fat32文件系统结构: fat32文件系统比fat16文件系统少了根目录FDT,其实是将根目录归结到数据区中了。 注意数据区第一个扇区所在蔟为2号蔟。 首先在磁盘管理中创建一个fat32磁盘: 大小为16GB。 使用winhex打开磁盘。 可以看到MBR在扇区0处…

AI推理卡/tensorRT c++

#####AI 推理卡:我的需求是x86上Nvidia显卡训练好的模型 用在AI推理卡上进行推理### AI 推理卡 环境配置 安装ubuntu系统、AI推理卡环境 1,安装ubuntu20.04.4 过程忽略,网上教程很多。 2,ubuntu20.04.4设置root登录&#xf…

入门系列 - Git基本操作

本篇文章,是基于我自用Linux系统中的自定义文件夹“test_rep”,当做示例演示 具体Git仓库的目录在:/usr/local/git/test_rep Git基本操作 之前我们已经创建了 Git 版本库了,下一步我们将进行一些 Git 的基本操作。 有关 Git 版本…

微服务框架 SpringCloud微服务架构 28 数据同步 28.3 声明队列和交换机

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构28 数据同步28.3 声明队列和交换机28.3.1 直接开干28 数据同步 28.3 声明…

【Mybatis】一级缓存和二级缓存

【Mybatis】一级缓存和二级缓存(一)为什么需要缓存(二)一级缓存(在SqlSession上缓存)【1】示例代码【2】增删改操作会刷新一级缓存【3】一级缓存流程总结(1)一级缓存简介&#xff08…

多点DMALL冲刺港股:年亏损超9亿 腾讯IDG金蝶是股东

雷递网 雷建平 12月8日多点数智有限公司(简称:“多点数智”)日前递交招股书,准备在港交所上市。年亏损超9亿多点DMALL成立于2015年,为本地零售业提供基于云的一站式端到端的数字零售SaaS平台。多点DMALL提供的服务包括…

搜索是过拟合的生成;生成是欠拟合的搜索

神经搜索的最大竞争者可能来自于一种甚至不需要向量嵌入作为中间表示的技术 —— 一种直接返回你想要的结果的端到端技术。"那么,谁将是神经搜索最大的竞争对手?"本文作者:肖涵,Jina AI 创始人兼 CEO 谁将是神经搜索最大…

Redis框架(二):SpringDataRedis入门和序列化方式解决内存占用问题

SpringDataRedis入门和序列化方式解决内存占用问题基本介绍实例Demo自定义RedisTemplate序列化自定义的RestTemplate的内存占用问题StringRedisTemplate解决内存占用问题总结SpringCloud章节复习已经过去,新的章节Redis开始了,这个章节中将会回顾Redis 主…

c#入门-可选参数,不定长参数

可选参数 声明可选参数 函数的参数在声明时,可以同时为其赋值一个常量。 但是所有这样的参数,需要在所有必填参数的后面。 void Any(int i 10) {Console.WriteLine(i); }使用可选参数 稍后,在调用函数时,你可以不填可选参数。…

1 - 线程池的基础用法

参考:线程池的基本用法 - 简书 1、为什么要用线程池? 在java中,开启线程的方式一般分为以下三种: a. 继承Thread,实现其run方法; b. 实现Runnabler接口,通过Thread来实现线程; …

法的概念与大纲

一、法的概念 法是由国家制定或认可并由国家强制力保证实施的,反映特定物质生活条件所决定的统治阶级意志,以权利和义务为内容,以确认、保护和发展对统治阶级有利的社会关系和社会秩序为目的的规范系统。 二、法的特征 规范性 国家意志性 权…

微信恢复大师花了200多,套路一环接一环!

数据恢复本是一个科技进步的体现,让误操作导致的重要数据可以找回来。但是近年来数据恢复跟诈骗挂钩,数据恢复本是利好的事情,为什么会跟诈骗挂钩。究竟是什么原因呢?最近小编发现,百度推荐词出现:“微信恢…

Neural Network-神经网络算法本质

1. Word2vec~single CBOW算法推导BP word2vec主要实现方式有:skip-gram和CBOW。 CBOW的目的是根据上下文contextual words来预测当前中心词的概率,且上下文所有单词对当前中心词出现的概率影响权重是一样的,如在袋子中取词,取出…