内核分配大块连续内存的方法【转】

简介:

参数传递:

    uboot向内核传递参数的方式分为两类。

    (1)第一类是通过boot cmd 例如在uboot终端提示行使用pri命令现实出的boot arg等。

    (2)第二类是通过DeviceTree。在/arch/arm/boot/dts/文件中和定义了和开发板相关的板级描述信息。

注(1)Device Tree的分析在其它文章中分析

以soc devkit (友晶)为参考在dts目录下文件socfpga_cyclone5.dtsi或者socfpga.dts文件中有以下描述:

memory {

name = "memory";

device_type = "memory";

reg = <0x0 0x40000000>; /* 1 GB */

};

描述了开发办的物理内存使用情况为1G。设备类型为deivce_type。

    在函数:setup_arch()中调用setup_machine_fdt()。这个函数参数是__atags_pointer。这个地址是由uboot传递。Uboot把控制权交给kernel之前会在R2寄存中存放device tree的线性地址。物理还是虚拟地址?虚拟地址。此地址和物理地址相差一个pgd。即段映射的高12位做基地址。Kernel还没有真正使用mmu的三级映射方案,还是停留在段映射的空间内。

函数调用顺序:

setup_arch()

i early_init_dt_scan_memory()

early_init_dt_add_memory_arch()

arm_add_memory()

中作相关处理。主要是把reg字段解析。最后把base和size等参数存放入相关结构体。这些结构体在下一章中解释。

 

uboot cmd 传递参数:

static int __init early_mem(char *p) 

 

以上两种参数传递都是通过R2寄存器中的__atags_pointer传递。在setup_arch函数中解析。这个函数还是用了cmdline作为参数分析uboot传递的参数。

以上两种方式方法主要初始化以下全局变量:(memory的使用SOC采用的是Device Tree)

/*

 * Memory map description

 */

struct membank {

phys_addr_t start;

phys_addr_t size;

unsigned int highmem;

};

struct meminfo {

int nr_banks;

struct membank bank[NR_BANKS];

};

内存描述:

由membank到meminfo的过渡

membank描述了硬件的相关信息,这些信息最后落实到linux的管理范围之内。并且依据处理后的相关信息分配布置内存空间。这个过程使用到了memblock_type和memblock的数据结构。

struct memblock_type {

unsigned long cnt; /* number of regions */

unsigned long max; /* size of the allocated array */

phys_addr_t total_size; /* size of all regions */

struct memblock_region *regions;

};

 

struct memblock {

phys_addr_t current_limit;

struct memblock_type memory;

struct memblock_type reserved;

};

Reserved 和memory代表的是保留和物理内存描述。可以结合一下打印信息进行分析。

MEMBLOCK configuration:

 memory size = 0x40000000 reserved size = 0x54f553

 

 memory.cnt  = 0x1

 memory[0x0]    [0x00000000000000-0x0000003fffffff], 0x40000000 bytes

 

 reserved.cnt  = 0x3

 reserved[0x0]  [0x00000000004000-0x00000000007fff], 0x4000 bytes

 reserved[0x1]  [0x000000000081c0-0x0000000054e763], 0x5465a4 bytes

 reserved[0x2]  [0x00000003ffb000-0x00000003ffffae], 0x4faf bytes

 

   所有保留的数据大小综合为0x54f553。Memory的区域没有记录。只是调用create_mapping把这些物理地址建立相应的页表和叶目录项。那么那些记录为reserve的内存大小又是什么呢?其实这就是内核本身以及device tree 还有一些其它的数据指令段。这些段都是已经存在于内存中。并且系统本身以及系统将会用到的数据和指令等,这些信息非常重要,一定要保留。既然保留,那么一定是将来的其它管理方案接手并且采用自己的方案管理。但是不会对前一任管理方案所保留的内容进行破坏。

    内核内存管理方案在初始化和运行时是不同的。初始化偏重于“区分”,而运行时偏重于“效率”。初始化一定要把不同的区域区分明白,告诉后者如何有效管理。至于后者的管理是否和前者冲突,当然有这些reserve的区域来解决。(实际使用更复杂)









本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5567487.html,如需转载请自行联系原作者


相关文章
|
4天前
|
机器学习/深度学习 算法 Linux
xenomai内核解析--实时内存管理--xnheap
Xenomai是一个实时操作系统(RTOS)层,用于Linux,旨在提供确定性的任务调度和服务。其内存管理机制包括一个名为xnheap的内存池,确保内存分配和释放的时间确定性,以满足硬实时系统的严格需求。
12 0
xenomai内核解析--实时内存管理--xnheap
|
8天前
|
缓存 运维 算法
深入理解Linux内核的虚拟内存管理
【5月更文挑战第6天】 在现代操作系统中,尤其是类Unix系统如Linux中,虚拟内存管理是一项核心功能,它不仅支持了多任务环境,还提供了内存保护和抽象。本文将深入探讨Linux操作系统的虚拟内存子系统,包括分页机制、虚拟地址空间布局、页面置换算法以及内存分配策略。通过对这些概念的剖析,我们旨在为读者揭示Linux如何有效地管理和优化物理内存资源,并确保系统的稳定运行与高效性能。
|
14天前
|
算法 安全 Linux
深度解析:Linux内核内存管理机制
【4月更文挑战第30天】 在操作系统领域,内存管理是核心功能之一,尤其对于多任务操作系统来说更是如此。本文将深入探讨Linux操作系统的内核内存管理机制,包括物理内存的分配与回收、虚拟内存的映射以及页面替换算法等关键技术。通过对这些技术的详细剖析,我们不仅能够理解操作系统如何高效地利用有限的硬件资源,还能领会到系统设计中的性能与复杂度之间的权衡。
|
2月前
|
缓存 监控 算法
Linux内核的SLAB内存管理机制
Linux内核的SLAB内存管理机制
109 4
|
6月前
|
存储 编译器 Linux
解密Linux内核神器:内存屏障的秘密功效与应用方法(下)
解密Linux内核神器:内存屏障的秘密功效与应用方法(下)
|
2月前
|
存储 Linux 编译器
Linux用户空间和内核空间所有15种内存分配方法
Linux用户空间和内核空间所有15种内存分配方法
84 1
|
5月前
|
存储 安全 数据安全/隐私保护
3.2 Windows驱动开发:内核CR3切换读写内存
CR3是一种控制寄存器,它是CPU中的一个专用寄存器,用于存储当前进程的页目录表的物理地址。在x86体系结构中,虚拟地址的翻译过程需要借助页表来完成。页表是由页目录表和页表组成的,页目录表存储了页表的物理地址,而页表存储了实际的物理页框地址。因此,页目录表的物理地址是虚拟地址翻译的关键之一。在操作系统中,每个进程都有自己的地址空间,地址空间中包含了进程的代码、数据和堆栈等信息。为了实现进程间的隔离和保护,操作系统会为每个进程分配独立的地址空间。在这个过程中,操作系统会将每个进程的页目录表的物理地址存储在它自己的CR3寄存器中。当进程切换时,操作系统会修改CR3寄存器的值,从而让CPU使用新的页
66 0
3.2 Windows驱动开发:内核CR3切换读写内存
|
6月前
|
安全 Windows
3.3 Windows驱动开发:内核MDL读写进程内存
MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式。在Windows操作系统中,每个进程都有自己独立的虚拟地址空间,不同进程之间的内存空间是隔离的。因此,要在一个进程中读取或写入另一个进程的内存数据,需要先将目标进程的物理内存映射到当前进程的虚拟地址空间中,然后才能进行内存读写操作。
49 0
3.3 Windows驱动开发:内核MDL读写进程内存
|
6月前
|
缓存 监控 Anolis
|
6月前
|
Web App开发 缓存 Linux
深入理解Linux内核内存管理机制与实现(下)
深入理解Linux内核内存管理机制与实现