Linux kernel内存初始化介绍

news2025/2/25 3:00:50

       early_fixmap_init:

         dtb进行映射,通过设备树文件和membloc模块让内核了解更为广阔的内存世界。Uboot将dtb拷贝到内存中,且通过传递相关参数将dtb的物理地址告知内核。但是内核必须将dtb的相关物理地址映射到虚拟地址上,通过虚拟地址间接访问dtb文件。由于此时物理地址映射并没有完成。为了解决该问题提出了fixed map机制。

        内核访问DTB物理地址,先将DTB所在的物理地址映射到内核虚拟地址空间的Fixed map区域,然后通过该虚拟地址区域间接访问DTB文件。系统对dtb的大小有限制,不能大于2MB,这样要求主要是为了保证创建地址映射的时候不会分配其它的 translation table page(可以从setup_machine_fdt中有描述,必须要8字节对齐且不能超过2M)。该机制是通过early_fixmap_init函数来完成。

     init/main.c中

     start_kernel

       --setup_arch

          ---early_fixmap_init

              ---early_ioremap_init

                   ---setup_machine_fdt

                       ---arm64_memblock_init

early_ioremap_init:

会调用early_ioremap_setup-->内核启动初期需要通过early_ioremap机制让设备寄存器对内存进行访问。一些硬件需要在内存管理系统运行起来之前就需要工作,内核采early_ioremap机制来映射内存给这些硬件驱动使用。并且这些硬件驱动在使用完early_ioremap的地址后需要尽快的释放掉这些内存,这样才能保证其他硬件模块继续使用。因此early_ioremap采用的是Fixed map的temporary fixmap段虚拟地址。ioremap的空间为7 * 256K的区域,保存在slot_vir[]数组中,当需要进行IO操作的时候,最终会调用到__early_ioremap函数,在该函数中去填充对应的pte entry,从而完成最终的虚拟地址和物理地址的映射。

setup_machine_fdt:

返回dtb所在的虚拟地址dt_virt void *dt_virt = fixmap_remap_fdt(dt_phys) fixmap_remap_fdt传入dtb所在的物理地址dt_phys返回其虚拟地址dt_virt,此时运行内核cpu已经开启了MMU。下面是其实现代码细节和调用流程:

  1. 1.//arc/arm64/mm/mmu.c
  2. 2.void *__init fixmap_remap_fdt(phys_addr_t dt_phys)
  3. 3.{
  4. 4. void *dt_virt;
  5. 5. int size;
  6. 6. //完成fdt PTE表entry的内容填写,返回fdt起始虚拟地址dt_virt和空间大小size
  7. 7. dt_virt = __fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL_RO);
  8. 8. if (!dt_virt)
  9. 9. return NULL;
  10. 10. /*把DTB所占的内存添加到memblock管理模块的reserve模块里,这样后续内存分配不会使用这段内存。在后面 11. *会使用memblock_free()把该内存释放 12. */
  11. 13. memblock_reserve(dt_phys, size);
  12. 14. return dt_virt;
  13. 13.}
  14. 1.//arc/arm64/mm/mmu.c
  15. 2.void *__init __fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot)
  16. 3.{
  17. //为dtb提供虚拟地址的base,静态定义事先预留
  18. 15. const u64 dt_virt_base = __fix_to_virt(FIX_FDT);
  19. 16. int offset; de
  20. 17. void *dt_virt;
  21. 18.
  22. 19. BUILD_BUG_ON(MIN_FDT_ALIGN < 8);
  23. //检查物理地址的对齐,必须MIN_FDT_ALIGN对齐
  24. 20. if (!dt_phys || dt_phys % MIN_FDT_ALIGN)
  25. 21. return NULL;
  26. 22. //检查虚拟地址的对齐,必须SZ_2M对齐
  27. 23. BUILD_BUG_ON(dt_virt_base % SZ_2M);
  28. 24. /* 25. *保证FDT所在的虚拟地址范围落在early_fixmap_init函数建立的PMD范围内以为在early_fixmap_init已经建 26. *立了PUD和PMD,不能让其额外浪费PMD内存 */
  29. 27. BUILD_BUG_ON(__fix_to_virt(FIX_FDT_END) >> SWAPPER_TABLE_SHIFT !=
  30. 28. __fix_to_virt(FIX_BTMAP_BEGIN) >> SWAPPER_TABLE_SHIFT);
  31. 29. //物理地址偏移(2M空间范围,末尾21位)
  32. 30. offset = dt_phys % SWAPPER_BLOCK_SIZE;
  33. 31. //偏移后实际的虚拟地址
  34. 32. dt_virt = (void *)dt_virt_base + offset;
  35. 33.
  36. 34. //根据提供的物理地址和虚拟地址设置页表的entry
  37. 35. create_mapping_noalloc(round_down(dt_phys, SWAPPER_BLOCK_SIZE),
  38. dt_virt_base, SWAPPER_BLOCK_SIZE, prot);
  39. 36.
  40. 37. //根据实际的虚拟地址访问物理地址空间内容,即FDT文件内容,此处检测DTB文件首部内容是否是DTB魔数
  41. 38. if (fdt_magic(dt_virt) != FDT_MAGIC)
  42. 39. return NULL;
  43. 40. //获取dtb文件大小
  44. 41. *size = fdt_totalsize(dt_virt);
  45. 42. //DTB大小不能超过2M
  46. 43. if (*size > MAX_FDT_SIZE)
  47. 44. return NULL;
  48. 45. //如果dtb文件结尾的地址空间超过了上面建立的2M地址范围,需要紧接着再映射2M地址空间
  49. 46. if (offset + *size > SWAPPER_BLOCK_SIZE)
  50. 47. create_mapping_noalloc(round_down(dt_phys, SWAPPER_BLOCK_SIZE), dt_virt_base,
  51. 48. round_up(offset + *size, SWAPPER_BLOCK_SIZE), prot);
  52. 50. return dt_virt;
  53. 38.}

early_init_dt_scan

 -----early_init_dt_verify(对dtb头进行检查) 使用crc校验 scripts/dtc/libfdt中

  -----early_init_dt_scan_nodes

of_scan_flat_dt:

of_scan_flat_dt对dtb里面的所有节点进行扫描,

 //向系统注册该memory node内存区域,通过memblock_add完成添加

 early_init_dt_add_memory_arch(base, size);

         下一章节介绍设备驱动根据dts信息如何进行内存映射。

     

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

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

相关文章

基于springboot的城乡医疗卫生服务系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把城乡医疗卫生服务与现在网络相结合&#xff0c;利用java语言建设城乡医疗卫生服务系统&#xff0c;实现城乡医疗卫生服务系统的信息化。则对于进一步提高医院的发展&#xff0c;丰富城乡医疗卫生服务经验能起到不少的促进作…

ModaHub魔搭社区:向量数据库Zilliz Cloud集群、Collection 及 Entity教程

目录 集群 Collection 字段 Schema 索引 Entity Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection,然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection …

使用React的函数式组件实现一个具有过渡变化、刻度切换、点击高亮的柱状图DIY组件

本想使用业界大佬们开源的各种图表库&#xff08;如&#xff1a;ECharts、G2可视化引擎、BizCharts ...&#xff09;&#xff0c;但是有的需求不仅要求有过渡变化&#xff0c;还要点击某个图高亮同时发送HTTP请求数据等功能&#xff0c;着实不知道怎么把canvas或svg绘制的图表弄…

ElasticSearch入门教程

文章目录 一、Elasticsearch 概述1.1、ElasticSearch是什么&#xff1f;1.2、ElasticSearch的安装 二、ElasticSearch的使用2.1、索引操作2.2、文档操作2.3、映射操作2.4、高级查询操作 一、Elasticsearch 概述 1.1、ElasticSearch是什么&#xff1f; 官网解释如图所示&#…

Rdkit|操作分子对象

github&#xff1a;地址 文章目录 RDKit|操作分子对象引入所需库获取分子中的原子获取原子的坐标信息访问单个原子的信息访问所有原子分子中的键操作获取键的信息 获取分子中所有的环 RDKit|操作分子对象 引入所需库 from rdkit import Chem from rdkit.Chem import Draw获取…

Mysql基本语法+Navicat使用

进入数据库&#xff1a;mysql -uroot -p 修改数据库密码&#xff1a;ALTER USER rootlocalhost IDENTIFIED BY 这里输入密码; &#xff08;如&#xff1a;ALTER USER rootlocalhost IDENTIFIED BY 111111;&#xff09; 创建数据库&#xff1a;create database 数据库名; 查…

刷题记录01

题目一. 这道题要先解释一下什么是非递增,非递增就是a[i] >a[i1],递增则是相反. 非递减就是a[i]>a[i1],递减就是相反 大方向思路是: 遍历数组判断相邻元素的顺序关系统计排序子序列数量 具体思路: 本题依次比较整个数组a[i1]>a[i] &#xff0c;则进入非递增序列判…

在vue中点击弹框给弹框中的表格绑值

场景描述&#xff1a;如下图所示&#xff0c;我们需要点击 ‘账单生成’ 按钮&#xff0c;然后里边要展示一个下图这样的表格。 最主要的是如何展示表格中的内容&#xff0c;一起看看吧&#xff01; <template><!-- 水费 欠费--><el-dialog title"水费欠费…

静态图片转3D动态GIF/视频

Leiapix是一项令人印象深刻的技术&#xff0c;它可以让静态的图片动起来&#xff0c;为观众提供沉浸式和交互式的图像体验。这项创新的技术使用了Leia Inc.的自适应光栅屏幕技术&#xff0c;通过利用人眼的视差和立体视觉效应&#xff0c;将图像中的元素以动态的方式呈现出来&a…

《第一次线下面试总结》

《第一次线下面试总结》 面试时间&#xff1a;2023/7/11 上午10点 面试总时长20分钟。 实习薪资&#xff1a;2.3k…后期看表现&#xff0c;可根据实际情况那啥 。估计是看锤子… 一、HR面 自我介绍你哪里的、目前住哪里等基本信息。你偏向前端还是后端&#xff1f;说说你的项目…

电路分析基础学习(上)第7章

李瀚荪版电分第二版 目录 二阶电路的定义 电路中的等幅振荡与阻尼振荡 RLC电路的零输入响应 ----------------------------------------------------------------------------------------------------------------------------- 二阶电路的定义 二阶电路是指由电容、电感…

[QT编程系列-3]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:HelloWorld、常见控件、对象树原理

目录 2. QT程序的运行框架 2.1 Hello World程序框架 2.2 QT Designer初识 2.3 用QT Designer设计用户登录界 2. QT程序的运行框架 2.1 Hello World程序框架 上述示例代码中&#xff0c;首先根据应用程序的需求使用 QCoreApplication 或 QApplication 定义 app 对象。如果你…

[综述] Generative AI meets 3D: A Survey on Text-to-3D in AIGC Era

论文&#xff5c; 改文章是23年5月27日挂在arxiv上&#xff0c;本文重点关注4.1节Text Guided 3D Avatar Generation、4.4节Text Guided 3D Shape Transformation和第5章Discussion Text Guided 3D Avatar Generation DreamAvatar DreamAvatar: Text-and-Shape Guided 3D Hu…

k8s中网络通讯简单介绍

1 前言 Kubernetes的网络模型假定了所有的pod都在一个可以直接连通的扁平的网络空间中&#xff0c;这在GCE&#xff08;Google Compute Engine&#xff09;里面是现成的网络模型&#xff0c;Kubernetes假设这定这个网络已经存在。但是在私有云里搭建Kubernetes集群&#xff0c;…

CHI read trans flow

Read transactions with DMT and without snoops 对于不产生snoop的read trans&#xff0c;建议使用DMT功能&#xff0c;如下图所示&#xff1a; 注意点&#xff1a; a. SNF并不需要给HNF回响应&#xff0c;因为RN发送的compack可以释放HNF处记录的请求; Read transaction wi…

《Redis 核心技术与实战》课程学习笔记(七)

切片集群&#xff1a;数据增多了&#xff0c;是该加内存还是加实例&#xff1f; 切片集群&#xff0c;也叫分片集群&#xff0c;就是指启动多个 Redis 实例组成一个集群&#xff0c;然后按照一定的规则&#xff0c;把收到的数据划分成多份&#xff0c;每一份用一个实例来保存。…

使用Dcoker Registry搭建私有镜像仓库

Dcoker Registry 和Harbor有什么相似和区别&#xff1f;各自有什么优劣&#xff0c;请详细介绍 Docker Registry和Harbor都是容器镜像仓库管理系统&#xff0c;用于存储、管理和分发Docker镜像。它们有一些相似之处&#xff0c;但也存在一些区别。下面是对它们的相似之处和区别…

idea导入springboot项目,下载的pom.xml文件是html格式。

一、可以看到我的pom.xml的parent标签 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0…

使用cuda报错的一次记录(CUDA error: out of memory)

原因&#xff1a; 由于batch_size设置过大导致的&#xff01;&#xff01;&#xff01;

机器学习技术(四)——特征工程与模型评估

机器学习技术&#xff08;四&#xff09;——特征工程与模型评估(1️⃣) 文章目录 机器学习技术&#xff08;四&#xff09;——特征工程与模型评估(:one:)一、特征工程1、标准化2、特征缩放3、缩放有离群值的数据4、非线性转换5、样本归一化6、特征二值化7、标称特征编码(one-…