浅析linux内核内存管理之物理内存探测
作者:李万鹏
在系统boot的时候,kernel通过0x15中断获得机器内存容量。有三种参数88H(只能探测最大64MB的内存),E801H(得到大小),E802H(获得memory map)。这个memory map称为E820图,在kernel的初始化代码中会将这个memory map复制到一个kernel中的数据结构e820map里,kernel需要通过这个结构来计算可用的内存容量。
- 这里的nr_map是内存段的数量
- 每个内存段由struct e820entry表示
- addr字段表示内存段的起始地址
- size字段表示内存段的大小
- type表示内存段的类型,比如E820_RAM表示可用内存
- E820MAX是一个宏,为32,说明最多可以有32个内存段
在setup_arch函数中有这么两句,调用mach_specific_memory_setup将E820图复制到kernel中的数据结构中,包括了系统保留的段和空闲段,通过print_memory_map函数打印出来。
下面来看machine_specific_memory_setup函数的实现:
- 首先调用sanitize_e820_map函数将重叠的去除
- 调用copy_e820_map函数将E820图copy到struct e820map结构中
- 如果BIOS没有提供该信息(在较古老的机器上可能是这样),内存自身生成一个表,0~0x9f000 ,1MB~E801或88找到的最大值
看copy_e820_map函数实现:
- 至少BIOS与RAM不是一个内存段的,所以nr_map < 2肯定是不对的
- 调用add_memory_region函数将E820图填充到struct e820map结构中
- 如果类型为E820_RAM,即可用内存,判断这个范围是否覆盖640KB~1MB,这段需要为ISA图形卡等保留的,所以这段要保留,如果谁覆盖了这段需要把这段抠除。物理地址从0x000a0000到0x000fffff的范围通常留给BIOS例程,并且映射ISA图形卡上的内部内存。这个区域就是所有的IBM兼容PC上从640KB~1MB之间著名的空洞:物理地址存在但被保留,对应的页框不能由操作系统使用。
调用add_memory_region添加相应的内存段到e820map:
如果内存段数量达到了最大值E820MAX即32,则oops。
调用print_memory_map打印出各个内存段的范围和类型,我的内存是2G的,打印结果如下:
至此,kernel已经成功的通过0x 15参数E820H,得到BIOS的E820图,并将其填充内核中的e820map结构,供内核其他部分使用。
在setup_memory函数中会调用find_max_pfn,从e820map结构中获得可用内存的容量。下面来看几个宏:
- PFN_UP,PFN_DOWN都是返回地址x对应的页帧号只是PFN_UP返回的是x地址下一个页的页帧号,PFN_DOWN返回的是x所在页的页帧号
- PFN_PHYS获得页帧号对应的物理地址
- MAXMEM是低端内存的最大值
- MAXMEM_PFN是低端内存最大一个页的页帧号
- MAX_NONPAE_PFN是给出4GB之上第一个页面的页面号
setup_memory是与体系结构密切相关的函数,跟踪其实现:
- PFN_UP获得_end后第一个page的页帧号来初始化start_pfn
- 调用find_max_low_pfn获得低端内存的最大页帧号
- 如果配置了CONFIG_HIGHMEM,则初始化highstart_pfn变量
- 调用init_bootmem初始化bootmem allocator
- 将max_low_pfn,即直接内存映射部分的page设置为可用
- 保留内核镜像(从0x100000开始,kernel code, kernel data, kernel bss),page 0,bootmem allocator的bitmap占用的空间
- 然会低端内存的最大页帧号
下面来看查找最大内存的函数:
- 这里分两种情况进行讨论,一个是内存大于896MB,一个是内存小于896MB
- max_low_pfn > MAXMEM_PFN下的#ifndef CONFIG_HIGHMEM会设置max_pfn = MAXMEM_PFN;看出如果不开启highmem,即使内存大于896MB,也只能使用896MB
分享到:
相关推荐
Linux常见驱动源码分析(kernel hacker修炼之道)--李万鹏 李万鹏 IBM Linux Technology Center kernel team 驱动资料清单内容如下: Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux...
这本书是“Linux kernel hacker修炼之道”的一部分,通过深入剖析各种常见的驱动源码,帮助读者提升在Linux系统中的驱动开发能力。 在Linux操作系统中,驱动程序是连接硬件与内核的桥梁,它们负责管理和控制硬件...
《常见驱动源码分析(kernel hacker修炼之道)》这本书或课程很可能深入探讨了如何理解和编写这些驱动,旨在帮助开发者提升对Linux内核和驱动编程的理解。在这个过程中,我们将会涉及到几个关键的知识点: 1. **Linux...
如果刚刚对linux的kernel有兴趣,想了解点什么的话,请先看看此书吧,她风趣幽默的介绍了linux的发展趣事,让你开心快乐之余慢慢领会linux的魅力,让你了解学习掌握kernel的方法。其中的很多建议经过我的实践和摸索...
内存管理负责分配、回收内存资源,管理虚拟内存和物理内存的映射关系,并实现内存保护机制。 Linux内核支持多种文件系统,例如ext2、fat、isofs等。虚拟文件系统(VFS)是Linux内核中的一个重要概念,它为不同文件...
ProcessHacker是一款强大的系统信息工具,它提供了进程管理、服务管理、硬件监控、内存查看等多种功能,深受系统...通过下载并使用"processhacker-2.39-bin"压缩包,你将能够亲身体验这些功能并提升你的系统管理技能。
有关hacker 的文章和资料分享给大家
Process Hacker是一款开源、免费且功能强大的系统信息工具,它允许用户查看并管理正在运行的进程、服务、线程以及内存等系统资源。 【描述】"Process Hacker 1.1 PH1" 提示我们这是Process Hacker的早期版本,版本...
Process Hacker是一款针对高级用户的安全分析工具,它可以帮助研究人员检测和解决软件或进程在特定操作系统环境下遇到的问题。除此之外,它还可以检测恶意进程,并告知我们这些恶意进程想要实现的功能。 Process ...
渗透测试教程资料
Process Hacker是一款强大的系统进程管理工具,并且还可以显示CPU、GPU、IO、内存等相关使用信息。 官网地址:https://processhacker.sourceforge.io/ git地址:https://github.com/processhacker/processhacker
Process Hacker 2是一种开源工具,用于监视系统进程、服务、网络连接等信息,并且还可以进行系统调试和修改。它可以帮助用户更好地了解系统运行情况,识别系统中的问题和优化系统性能。 使用Process Hacker 2可以...
《Scala语言解构HackerRank算法挑战》 在编程领域,算法是不可或缺的一部分,它为计算机程序提供了高效、系统地解决问题的方法。Scala是一种多范式编程语言,融合了面向对象和函数式编程的特点,因其强大的表达能力...
Process Hacker是一款功能丰富的系统程序,比windows自带的任务管理器功能更强大。用户只要借助该程序就可以方便,快捷地查看相关进程的速度,内存,及模块等等,除此,还可以对相关的进程进行管理工作。
提供的`processhacker-2.16-setup.exe`文件是Process Hacker的安装程序,用户只需双击运行并按照提示进行安装。安装完成后,软件界面简洁直观,即使是对计算机不太熟悉的用户也能轻松上手。`Readme-说明.htm`文件...
Hacker 2012 - Final Transfer Readme =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Thank you for downloading Hacker 2012! Registration ------------------------------------ If you like the game, ...
在内存分析方面,ProcessHacker能显示进程的虚拟内存和物理内存使用情况,帮助用户识别内存泄漏或异常内存消耗。此外,它还支持查看内存映射文件,帮助开发者调试程序的内存问题。 四、硬件信息 ProcessHacker能...