Linux0.12内核之内存管理(2)

《Linux内核完全注释》pdf v3.0 阅读详情

本文主要介绍Linux0.12内核memory.c中的函数

1.void free_page(unsigned long addr)
//释放物理地址addr处的一页内存。用于free_page_tables()函数
void free_page(unsigned long addr)
{
//首先判定给定物理地址的合理性。如果物理地址addr小于内存低端1M,对此不///予处理。如果addr>=内存最高端,则显示出错并且内核停止工作
if(addr<LOW_MEM) return;
if(addr>=HIGH_MEMORY)
panic("trying to free nonexistent page");
//如果对参数验证通过,那么就根据这个物理地址换算出从内存低端开始计算的//内存页面号。页面号=(addr-LOW_MEM)/4096。可见页面号从0号开始计起。此///时addr中存放着页面号。如果该页面号对应的页面映射字节不等于0,则减1返//回。此时映射字节值应该是0,表示页面已经释放。如果对应页面字节原本就///是0,表示该物理页面本来就是空闲的,说明内核代码出问题,于是显示出错///并停机。
addr-=LOW_MEM;
addr>>=12;
if(mem_map[addr]--) return;
mem_map[addr]=0;
panic("trying to free page);
}
2.int free_page_tables(unsigned long from,unsigned long size)
//该函数释放页表连续的内存块,只处理4MB长度的内存块
//根据指定的线性地址和限长(页表个数),释放对应内存页表指定的内存块并置表项//空闲。页目录位于物理地址0开始处,共1024项,每项4字节,共占4KB。每个目录//项指定一个页表。内核页表从物理地址0x1000处开始,共4个页表。每个页表有10//24项,每项4B,因此也占4KB内存。每个页表最多可以映射1KB*4B=4M的物理内存。
//参数:from--起始线性地址;size--释放的字节长度
int free_page_tables(unsigned long from,unsigned long size)
{
unsigned long *pa_table;
unsigned long *dir,nr;

//首先检测参数from是否在4MB的边界上,因为该函数只能处理这种情况。若fr//om=0,则出错,说明释放内核和缓冲所占空间
if(from & 0x3fffff)
panic("free_page_tables called with wrong alignment")
if(!from)
panic("Trying to free up swapper memory space");

//然后计算参数size给出的长度所占的页目录项目数(4MB的进位整数倍),也即所占页表数。因为一个页表可管理4MB物理内存,所以这里用右移22位的方式把需要复制的内存长度值除以4MB。其中加上0x3fffff(即4MB-1)用于得到进位整数倍结果。即除操作若有余数则进1。例如原size=4.01MB,那么可到结果size=2。接着计算给出的线性地址对应的起始目录项。对应的目录项号=from>>22。因为每项占4字节,并且由于页目录表从物理地址0开始存放,因此实际目录项指针=目录项号<<2,也即from>>20。

size=(size+0x3fffff)>>22;
dir=(unsigned long *)((from>>20) & 0xffc);

//此时size是释放的页表个数,即页目录项数,而dir是起始目录项指针。现在开始循环操作页目录项,依次释放每个页表中的页表项(??具体什么操作叫释放)。如果当前目录项无效(p=0),表示该目录项没有使用(对应的页表不存在),则继续处理下一个目录项。否则从目录项中取出页表地址pg_table,并对该页表中1024个表项进程处理,释放有效页表项对应的物理内存页面,或者从交换设备中释放无效页表项对应的页面,即释放交换设备中对应的内存页面。

for(;size-->0;dir++)
{
if(!(1 & *dir))
continue;
pg_table=(unsigned long *)(0xfffff000 & *dir);
for(nr=0;nr<1024;nr++)
{
if(*pg_table)
{
if(1 & *pg_table)
{
free_page(0xfffff000 & *pg_table)
}
else
swap_free(*pg_table>>1);
*pg_table=0;
}
pg_table++;
}
free_page(0xfffff000 & *dir);
*dir=0;//对应页表的页目录项清零
}
invalidate();
return 0;
}


总结:

1.free_page()用于释放指定物理地址处的一页物理内存。假如物理地址对应的页号是addr,那么何谓释放?物理内存就在那里,我们所谓的获取物理内存,其实就是使用一个标志,说明我们占用了他,相对应的,所谓的释放就是清除表示,说明我们我们释放了内存,释放的本质就是:mem_map[addr]--。

2.free_page_tables()以一个页表对应的物理内存为单位,释放指定线性地址和长度(页表个数)对应的物理内存页块。不仅对管理线性地址的页目录项和页表中的页表项内容进行修改(修改其实就是清0),同时会释放对应的页表内存和页表项对应的物理内存。


Linux内核5.0版本五大模块及内核书籍推荐 时间已经来到8月份,现在还在迷茫的同学真的要好好想一下今年的秋招了。这里就给大家分享一份嵌入式岗位学习Linux内核的最强攻略,突击一下吧,少年! 阅读详情

相关推荐

基于Cadence IC617的共源级放大器设计:从直流到交流的virtuoso仿真实践

本文详细介绍了使用Cadence IC617的Virtuoso平台进行共源级放大器设计的完整仿真流程。从电路图绘制、直流工作点分析,到负载电阻RD的参数扫描及其对增益和带宽的影响,再到交流小信号频率响应仿真,提供了从理论到实践的全面指导,帮助初学者掌握模拟集成电路设计的核心仿真技能。

jj890的博客 478

关于比较中设置极大值,常设置的0x3f3f3f3f

int型变量的取值范围:[-2^31, 2^31 - 1] -> [-2147483648, 2147483647]

m0_74183164的博客 726

Trae IDE与Playwright MCP:5分钟实现零代码网页数据抓取

网页数据抓取是数据采集和自动化处理中的基础技术,其核心原理是通过程序模拟浏览器行为,定位并提取页面中的结构化信息。传统方式依赖编写脚本处理网络请求、解析HTML和应对反爬机制,技术门槛较高。而结合AI与自动化工具的新范式,通过自然语言交互即可完成复杂操作,极大降低了技术门槛并提升了开发效率。这种技术价值在于将开发者从繁琐的编码中解放,使其更专注于数据分析和业务逻辑。在数据监控、市场调研、竞品分析等应用场景中,快速获取网页数据是关键需求。本文以Trae IDE集成Playwright MCP为例,演示如何通过

culi3118的博客 498

linux内核函数解析(一)

1:int free_page_tables(unsigned long from,unsigned long size)          这个函数的作用是用于释放一个以页目录项为单位的连续内存块,当然了这指的是虚拟地址,但是linux32位的虚拟地址又被分成三个部分,从第31~22位用于确定页目录表中的页目录项(可以从CR3寄存器获取页目录表的基地址,然后将此相对偏移地址加上基地址就可以得到

lintong137的专栏 967

医疗AI Agent实战:从零搭建一个能看病的智能助手(附完整代码)

本文详细介绍了如何从零搭建一个医疗AI Agent智能助手,涵盖核心架构设计、症状推理引擎开发、安全与合规实现以及系统集成等关键环节。通过完整的代码示例和实战案例,帮助开发者快速构建具备医疗咨询能力的智能Agent,提升医疗服务的效率和质量。

ss78901的博客 465

基于Matlab模拟六自由度Stewart并联机器人运动学逆解

在现代工业和科学领域中,机器人技术的发展已经取得了巨大的进步,为生产和研究提供了许多便利。其中,六自由度Stewart并联机器人是一种广泛应用于各种领域的机器人系统。它具有高精度、高刚度和高可靠性的特点,被广泛应用于飞行模拟器、手术机器人和运动仿真等领域。然而,要使Stewart并联机器人能够实现复杂的运动任务,我们需要了解其运动学逆解。运动学逆解是指根据机器人末端执行器的位置和姿态,计算出各个关节的角度和长度。这对于控制机器人的运动非常重要,因为它可以帮助我们确定机器人各个关节的运动范围和工作空间。

qq_59747472的博客 1126

TMS320F28335启动过程

TMS320F28335启动过程分析

橙子的博客 4015

基于Simulink建模仿真的滑模控制的磁悬浮轴承稳定控制仿真

磁悬浮轴承(Magnetic Bearing)利用电磁力来支撑和定位转子,无需机械接触,因此在高速旋转设备中具有广泛应用。滑模控制(Sliding Mode Control, SMC)是一种鲁棒性强的非线性控制方法,适用于磁悬浮轴承的精确控制。以下是基于Simulink的磁悬浮轴承滑模控制系统的详细设计与仿真步骤。通过上述步骤,设计并实现了基于 Simulink 和 Control System Toolbox 的磁悬浮轴承滑模控制系统。

MHD0815的博客 778

Linux 内核解读之内存管理----memory.c

转载请注明原文出处http://blog.csdn.net/lizhiliang06/article/details/8655115 80x86体系结构中,Linux内核的内存管理程序使用分页管理方式。利用页目录和页表结构处理内核中其他部分代码对内存申请和释放操作。Memory.s是linux内存管理的核心,80x86内存管理最大寻址范围是4G的内存空间,在最大1024*1024*4KB的范

2026

深入RKNN Toolkit2:自定义算子与内存优化秘籍

本文系统探讨了RKNNToolkit2在模型转换中的关键技术与优化策略。首先介绍了该工具包的基础功能及模型转换流程,重点阐述了自定义算子的实现方法,包括算子分析、代码编写和注册集成等步骤,并以ReduceLogSumExp算子为例进行案例分析。在内存优化方面,详细论述了模型量化、内存复用和参数配置等策略,通过具体案例展示优化效果。最后结合智能安防项目实践,分享了YOLOv5模型部署经验及问题解决方案。文章指出,随着AI技术发展,RKNNToolkit2将在算子支持、量化技术和硬件适配等方面持续优化,为边缘计

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1387

Android Camera MTK框架

Camera简介: 虽然前文说道Android在5.0之后就推出了Camera2 API,但是各个厂家的基本未适配,导致目前市场上大部分机型使用的仍然是Camera1 API。PS:Android 9.0 Google强制要求各个平台厂商(高通/MTK/华为等)支持Camera2,不再兼容Camera1。 ...

weixin_49303682的博客 5506

linux0.12之内存管理(1)-整体框架思路

内存管理一直是本人比较佩服linus的地方。为此先看linux0.11版本,又看了0.12版本,基本思路一样,差异性会单独列出来。 本篇博客只是梳理一下大体思路,具体函数分析,放在后面的博客。一、 从实模式到保护模式谈起 1、简单讲实模式,是16位寻址的访问方式,保护模式是32位的访问方式。在linux0.12的启动代码中bootsect和setup是工作在实模式下,之后的所有代码都运行在保护

No detail can be too detailed 619

Python爬虫实战:使用最新技术爬取新浪新闻首页数据

本文详细介绍了三种爬取新浪新闻首页的技术方案,从简单的requests-html到强大的Playwright,再到分布式Scrapy架构。小规模爬取:requests-html或aiohttp方案需要JavaScript渲染:Playwright方案大规模分布式爬取:Scrapy-Redis方案。

2201_76125261的博客 1243

LINUX内核完全剖析基于0.12内核:深入理解Linux内核运作机制

LINUX内核完全剖析基于0.12内核:深入理解Linux内核运作机制 【下载地址】LINUX内核完全剖析基于0.12内核 《LINUX内核完全剖析:基于0.12内核》是一份深度解析Linux内核的珍贵资源,专注于0.12版本的Linux内核,全面涵盖内核架构、内存管理、进程调度等核心主题。通过本资料,您将深入理解Lin...

gitblog_06789的博客 765

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

内核解读之内存管理(0)开篇介绍

内存管理是linux内核比较重要的一个模块,其实也是任何操作系统里的一个核心专题。在实际的开发工作中,经常会遇到和内存牵扯的问题,比如内存泄露啊,内存越界等。如果你的技术仅仅只是停留于业务层面,对内核的东西一无所知,遇到这些问题往往是束手无策的。我们从事嵌入式linux开发的,应用程序跑在linux操作系统上,你总不能对程序的运行载体一无所知吧。网上有很多关于内存管理的博客,零零散散,对对错错,并不系统,我在阅读了大概上百篇博客之后,结合最新版本(6.x)的内核源码,写了这个系列的文章。

二进制君 1337

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LINUX内核完全剖析:基于0.12内核

LINUX内核完全剖析:基于0.12内核 【下载地址】LINUX内核完全剖析基于0.12内核 《LINUX内核完全剖析:基于0.12内核》是一份深度解析Linux内核的珍贵资源,专注于0.12版本的Linux内核,全面涵盖内核架构、内存管理、进程调度等核心主题。通过本资料,您将深入理解Linux内核的基本结构和工作原理,...

gitblog_06791的博客 496

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

内核解读之内存管理(2)内存管理三级架构之内存结点node

结合NUMA的架构,Linux抽象出了三级内存管理架构:内存节点node、内存区域zone和物理页框page。在NUMA模型中,每个CPU都有自己的本地内存节点(memory node),而且还可以通过QPI总线访问其他CPU下挂的内存节点,只是访问本地内存要比访问其他CPU下的内存的速度高许多,一般经过一次QPI要增加30%的访问时延。

二进制君 2014

内核解读之内存管理(8)什么是page cache

文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问。由于读写硬盘的速度比读写内存要慢很多(DDR4 内存读写速度是机械硬盘500倍,是固态硬盘的200倍),所以为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核使用 页缓存(Page Cache) 机制来对文件中的数据进行缓存,即将文件中的数据缓存到page中,这些page就叫page cache。

二进制君 2451

linux-0.12内核之内存管理(1)

1.内存分页管理机制 内存分页管理是通过页目录表和内存页表所组成的二级表组成的,其中页目录表和页表的结构是一样的,表项结构也相同。页目录表中的每个表项(4B)来寻址一个页表,而每个页表项(4B)来指定一页物理内存页。因此,当指定了一个页目录项和一个页表项,我们就可以唯一地确定所对应的物理内存页。在Linux 0.12内核中,所有进程都是用一个页目录表,而每个进程都有自己的页表。内核代码和数据段长

GetnextWindow的专栏 1596

内核解读之内存管理(13)逆向映射

数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希望能对逆向映射有更加深入的理解。

二进制君 939

linux内存管理_linux-0.11之内存管理思路并不难

内存管理的内容牵涉面比较广,它会联系到文件系统,进程等等。因此,写内存管理也脱离不了它们。这里想到哪里就写到哪里,因为linux-0.11内存管理掌握起来挺容易的。先从内存管理与进程之间的关系来说。前面有一篇文章专门写到进程,里面涉及到了gdt,ldt,tss等。先说该怎么设计它们的存放位置。在gdt表按如下方式组织:0(位置空),内核代码段,内核数据段,系统段,tss0,ldt0,tss1,ld...

weixin_39817215的博客 200

Linux内核之内存管理

NUMA(Non-Uniform Memory Access,非统一内存访问)是一种多处理器系统的内存架构。内存被划分为多个节点(node),每个节点与一个或多个处理器核心相关联。处理器访问本地节点内存的延迟较低,访问远程节点内存的延迟较高。以上是我自己学习内存管理时所做的笔记,很多抽象的东西用了通俗的语言来解释清楚,方便在学习的过程中理解,如果你正好是在学习内存管理的相关内容,可以以我的笔记作为参考,如果你是需要突击内存管理相关的知识,也可以结合着大语言模型来进行学习。

qq_56187001的博客 1128

Linux内核源代码分析一(Linux0.12)

Linux 内核主要由 5 个模块构成,它们分别是:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。首先说一下pc机的启动流程,在加电后,80X86会先进入实模式并进入地址0XFFFF0开始自动执行代码,这个地址一般带表了BIOS的代码地址,PC的BIOS将会执行硬件检测和诊断功能,并在0地址进行中断向量的初始化,最后BIOS会将启动设备的第一个扇区读入地址0X7C00位置,并从这个位置开始执行代码。boot目录下包含三个汇编代码文件bootsect文件是在记录在磁盘的第一个扇区中,

qq_43147121的博客 3023

内存管理(Linux内核源码分析)

背景本篇博客试图通过linux内核源码分析linux的内存管理机制,并且对比内核提供的几个分配内存的接口函数。然后聊下slab层的用法以及接口函数。内核分配内存与用户态分配内存内核分配内存与用户态分配内存显然是不同的,内核不可以像用户态那样奢侈的使用内存,内核使用内存一定是谨小慎微的。并且,在用户态如果出现内存溢出因为有内存保护机制,可能只是一个报错或警告,而在内核态若出现内存溢出后果就会严重的多(

hty46565的博客 1万+

操作系统(Linux Kernel 0.11&Linux Kernel 0.12)解读整理——内核初始化(main & init)之内存的划分

MMU:内存管理单元(Memory Management Unit)完成的工作就是虚拟地址到物理地址的转换,可以让系统中的多个程序跑在自己独立的虚拟地址空间中,相互不会影响。程序可以对底层的物理内存一无所知,物理地址可以是不连续的,但是不妨碍映射连续的虚拟地址空间。Linux 内核的内存管理程序采用了分页管理方式。它利用页目录和页表结构处理内核中其他部分代码对内存的申请和释放操作。内存的管理是以内存页面为单位进行的,一个内存页面是指地址连续的 4K 字节物理内存。

weixin_56228133的博客 981

Linux0.12内核源码解读(6)-main.c

大家好,我是呼噜噜,好久没有更新old linux了,上次我们讲到了Linux0.12内核的,内核正式完成从汇编到c程序的切换,本文我们一起来看看main.s究竟发生了什么?系列文章目录main.c在内核源代码的init/目录下,我们知到main函数通常是C语言的入口,所以我们可以知晓这里的main是操作系统很重要的入口文件,main.c文件不是很大,但却包括了内核初始化的所有工作,主要是完成操作系统各种硬件数据结构的初始化。

小牛呼噜噜的博客 1405
上一篇: linux-0.12内核之内存管理(1)
下一篇: Linux0.12内核之内存管理(3)
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值