浅析linux内核内存管理之临时内核页表

通过Jlink和PyLink读取蓝牙mac地址--Nordic&silicon labs 本文介绍在不开机的情况下读取蓝牙的mac地址,这里介绍两个平台,Nordic和Silicon Labs。 1. 通过Jlink Commander工具连接上目标板 选择当前芯片的型号 2. 使用mem命令查看mac地址 首先需要知道mac地址存储在芯片的哪个地址。 Nordic: 寄存器DEVICEADDRTYPE的第一个bit代表mac地址的类型,这里为1。DEVICEADDR[0]和DEVICEADDR[1]的低16bit代表了MAC地址,其中DEVICEADDR[1]的第15位应该或上DE 阅读详情
                   浅析linux内核内存管理之临时内核页表

                                                



临时页全局目录是在内核编译过程中静态地初始化的,而临时页表是由startup_32()汇编语言函数初始化的。临时页全局目录存放在swapper_pg_dir变量中,临时页表在pg0变量开始出存放,紧接在内核未初始化的数据段(_end符号后)后面。假设内存使用的段,临时页表和128KB的内存范围能容纳于RAM前8MB空间,为了映射8MB空间需要两个页表,一个是pg0处,另一个存放在pg0后边。为了在实模式和保护模式下都能对这8MB寻址,因此内核必须创建一个映射,把从0x00000000到0x007fffff的线性地址和从0xc0000000到0xc07fffff的线性地址映射到从0x00000000到0x007fffff。所以要设置临时页全局目录的第0,1,768,769项,其他项为0。


临时内核页表设置的代码在arch/i386/kernel/head.S中:  

[html]  view plain copy
  1.  91page_pde_offset = (__PAGE_OFFSET >> 20);  
  2.  92  
  3.  93        movl $(pg0 - __PAGE_OFFSET), %edi  
  4.  94        movl $(swapper_pg_dir - __PAGE_OFFSET), %edx  
  5.  95        movl $0x007, %eax                       /* 0x007 = PRESENT+RW+USER */  
  6.  9610:  
  7.  97        leal 0x007(%edi),%ecx                   /* Create PDE entry */  
  8.  98        movl %ecx,(%edx)                        /* Store identity PDE entry */  
  9.  99        movl %ecx,page_pde_offset(%edx)         /* Store kernel PDE entry */  
  10. 100        addl $4,%edx  
  11. 101        movl $1024, %ecx  
  12. 10211:  
  13. 103        stosl  
  14. 104        addl $0x1000,%eax  
  15. 105        loop 11b  
  16. 106        /* End condition: we must map up to and including INIT_MAP_BEYOND_END */  
  17. 107        /* bytes beyond the end of our own page tables; the +0x007 is the attribute bits */  
  18. 108        leal (INIT_MAP_BEYOND_END+0x007)(%edi),%ebp  
  19. 109        cmpl %ebp,%eax  
  20. 110        jb 10b  
  21. 111        movl %edi,(init_pg_tables_end - __PAGE_OFFSET)  
91 计算__PAGE_OFFSET在页目录中的偏移
93 %edi保存pg0的物理地址,pg0定义在连接脚本 arch/i386/kernel/vmlinux.lds中,gcc编译内核以后形成的符号地址都是虚拟地址,在我的系统redhat 9.0内核2.6.11环境下,pg0为 0xc04d4000,这个可以在System.map文件中查看到
94 将swapper_pg_dir的物理地址存放到%edi中
95 存放低12位的标志到%eax中
97 将pg0的物理地址与标志位合到一起,创建一个页目录项
98 将这个页目录项存储在swapper_pg_dir的临时页全局目录中,在第一次循环中填充0号表项,第二次循环填充1号表项
99 在第一次循环填充768号表项,第二次循环填充769号表项
100 edx指向下一个表项
101 设置计数,即要设置临时页全局目录表1024个表项
103 eax->[edi];edi = edi + 4
104 填充pg0时,一个表项对应一个page,一个page是4KB,所以加0x1000
105 一直循环,填充pg0的1024个表项;下一次大循环,填充pg0后边的那个页表的1024个表项
108 将INIT_MAP_BEYOND_END+0x007+%edi与%ebp比较,如果小于就进行下一轮大循环,此时是填充pg0后的第二个页表
111 init_pg_tables_end存放pg0+0x2000


[html]  view plain copy
  1. 183/*  
  2. 184 * Enable paging  
  3. 185 */  
  4. 186        movl $swapper_pg_dir-__PAGE_OFFSET,%eax  
  5. 187        movl %eax,%cr3          /* set the page table pointer.. */  
  6. 188        movl %cr0,%eax  
  7. 189        orl $0x80000000,%eax  
  8. 190        movl %eax,%cr0          /* ..and set paging (PG) bit */  
  9. 191        ljmp $__BOOT_CS,$1f     /* Clear prefetch and normalize %eip */  
  10. 1921:  
  11. 193        /* Set up the stack pointer */  
  12. 194        lss stack_start,%esp  

获得临时页全局目录的物理地址,存放在cr3中,并设置cr0的PG标志位,此时开启了分页功能
Win10环境下VS2019离线部署OnnxRuntime的完整指南 本文提供了在Windows 10系统下,为Visual Studio 2019进行OnnxRuntime离线部署的完整教程。针对网络受限环境,详细讲解了如何获取正确的离线安装包、配置本地NuGet源,并逐步指导项目配置与测试,确保AI模型在C++环境中顺利运行。 阅读详情

相关推荐

构建多节点AI代理网络:OpenClaw协同框架与实战部署指南

在分布式系统与AI代理技术领域,多节点协同是提升智能体能力与扩展性的核心挑战。其原理在于通过设计清晰的通信协议与数据同步机制,使分散的智能体能够共享状态、知识与技能,从而实现1+1>2的群体智能。这一技术价值在于突破了单点AI的能力上限,为构建复杂、鲁棒且可扩展的自动化系统提供了基础。典型的应用场景包括跨设备任务编排、企业级工作流自动化以及大规模AI代理集群的管理。本文聚焦于OpenClaw这一开源AI代理框架,深入探讨如何利用模块化设计(如网状网络与任务控制中心)实现记忆共享与统一调度,解决多网关协同中的

weixin_42521032的博客 298

Linux 内核创建页表,Linux 内核临时页表的创建

Motivation:当内核被解压到线性地址0x100000后,为了继续启动内核,即启动内核的第一个swapper进程,内核需要建立一张临时页表供其使用。当内核从16位的实模式进入保护模式(通过在汇编代码中的setup函数中设置linux的cr0寄存器的PE位),内核要创建一个有限的地址空间,容纳内核的代码段、数据段、初始页表和用于存放动态数据结构的128KB大小的空间。程序设计者假定,内核使用的...

weixin_32377497的博客 552

基于WebGL架构的3D可视化平台—平面图导航(一)

前言 利用CampusBuilder来搭建自己的虚拟世界过程有这样一个问题:如何快速聚焦到虚拟场景的某一位置。当然我们可以创建几个按钮对应查找我们需要去的位置(参照物)并聚焦,但是按钮并不是很炫酷也不能很好的反馈给我们一些信息。接下来我们就用平面导航图来解决这一问题。 第一步:使用CampusBuilder搭建模拟场景,CampusBuilder操作简单,分分钟就可以上手。 ...

nioooom的博客 4162

linux内核页表初始化,初始化内核页表

内核维持着一组自己使用的页表,驻留在主内核全局目录中,主内核页全局目录的最高目录项部分作为参考模型,为系统中每个普通进程对应的页全局目录项提供参考模型(进程的内核态从oxc0000000-----oxffffffff的线性地址!)内核页表的初始化化分为2个阶段:第一阶段:在还未启动分页机制下初始化化一个寻址范围在0---8M的内核页表,这个最小限度的地址空间仅能内核装载到RAM和对其初始化核心数据...

weixin_28966407的博客 943

Linux ELF文件解析:从file到readelf的完整工具链指南

ELF(可执行与可链接格式)是Linux系统中二进制文件的标准格式,定义了程序加载、内存布局和元数据组织方式。其核心原理在于通过程序头表描述执行视图、节区头表描述链接视图,实现代码与数据的结构化存储。这一格式的技术价值在于为程序调试、安全审计和性能优化提供了底层支持,尤其在动态链接、符号解析和内存保护机制中发挥关键作用。在应用场景上,系统管理员依赖ELF分析工具解决库依赖问题,安全研究员通过检查安全属性评估漏洞风险,开发者则利用反汇编进行代码调试。本文聚焦于file、readelf、objdump等工具链的

weixin_42691065的博客 634

Java 开发打飞机小游戏(附完整源码)

上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy {

一只独孤的程序猿 1万+

LINUX 内核代码备忘录

1. swapper_pg_dir : Global Page Directory (全局页目录,即最顶层页目录,PGD) 的地址 pgd_index(addr): 宏函数,返回PGD包含的项中,地址字段 值为addr的项的索引。 PAGE_OFFSET:宏函数,返回进程地址空间(线性地址)中kernel所属的地址空间的起始地址,x86_32下是0xc0000000 PAGE_S...

weixin_30387663的博客 208

XIAO ESP32S3 Sense摄像头与麦克风实战:从硬件连接到AI语音视觉项目

本文详细介绍了如何使用Seeed Studio XIAO ESP32S3 Sense开发板进行AI语音视觉项目开发。从硬件连接到Arduino环境搭建,再到摄像头拍照、视频流传输、麦克风录音等实战操作,最后引导读者探索基于TensorFlow Lite Micro的语音唤醒和SenseCraft AI的图像识别等AI应用,为物联网和边缘AI项目提供了完整的入门指南。

xray4的博客 1021

linux内存管理解析1----linux物理,线性内存布局及页表的初始化

主要议题: 1分页,分段模式及实模式 2Linux分页  3linux内存线性地址空间布局及物理内存空间布局 4linux页表初始化及代码解析 1.1.1内存寻址和保护模式 在X86平台上,内存控制单元通过分段单元电路把逻辑地址转换为线性地址,又通过分页单元把线性地址转换为物理地址。       一个逻辑地址由段标识符和段内偏移地址组成。段标示符是一个16位长度的字段,称为...

weixin_34354945的博客 129

XGBoost算法案例 - 红酒品质分类

数据集共包含 11 个特征,共计 3269 条数据. 我们通过训练模型来预测红酒的品质, 品质共有 6 个各类别,分别使用数字: 0、1、2、3、4、5 来表示。

YIAN爱学习的博客 449

Ansys HFSS 中的同轴电缆仿真

准确模拟它们的行为对于确保 RF 系统的最佳性能至关重要。在本博客中,我们将介绍在 HFSS 中设置同轴电缆仿真并绘制插入损耗、回波损耗和电场分布的过程。将波端口分配给同轴线的两端以激励模型,并定义了从 1 GHz 到 20 GHz 的频率扫描以评估其宽带性能。铜分配给内部导体,铝分配给外部导体。介电区域使用 PTFE 定义,其相对介电常数为 2.1,损耗角正切为 0.00022。仿真完成后,结果用于绘制整个频率范围内的回波损耗和插入损耗。此外,电介质内的电场分布也被绘制和动画化。

jkh920184196的博客 1907

Linux内存管理总结-系统初始化

操作系统如何为每个进程营造一个虚拟地址空间呢,写到这里不禁想起骇客帝国的场景,Matrix就是为人类虚拟出一个世界,让人们乐在其中。 首先,我们要从操作系统初始化讲起。  操作系统一般把物理内存分成4K大小一个的页框(PageFrame).系统启动最开始的一瞬,物理内存都是空闲的,好似一批蛮荒。 启动后,各路创世神灵(BIOS,各种硬件)开始占地盘。首先是BIOS,BIOS会把系

风雪满江山 1368

uniapp [全端兼容] - 实现大文件上传分片/切片+本地选择文件上传超大文件,大文件切片上传+断点续传+上传进度条+失败自动重传,支持单个/批量上传图片、视频、文档各种文件(App、小程序、H5

uniapp 分片 断点续传 大文件上传。uniapp大文件切片上传,uniapp实现大文件上传 分片上传 进度条,分片上传附件,实现大文件上传,实现分片大文件上传,Uniapp实现大文件上传 分片上传 进度条,uniapp文件分片上传,uniapp如何上传很大的文件,在选择文件后,按指定大小将文件切割成独立的文件片,并逐片上传,uniapp 微信小程序上传大文件如何切片,uniapp APP实现大文件分片上传、断点续传、秒传,解决大文件上传问题,大文件上传如何做断点续传,uniapp上传视频,Uniapp

🏆 前端领域优质创作者 1万+

浅析linux内核内存管理之最终内核页表

浅析linux内核内存管理之最终内核页表                                    在系统初始化的时候进行了最终内核映射,主要在paging_init函数中: [html] view plaincopy 499void __init paging_init(void)

白水煮鸡蛋 6144

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

linux内核页表占用内存,浅析linux内核内存管理之最终内核页表

浅析linux内核内存管理之最终内核页表在系统初始化的时候进行了最终内核映射,主要在paging_init函数中:499void__initpaging_init(void)500{501#ifdefCONFIG_X86_PAE502set_nx();503if(nx_enabled)504printk("NX(Execut...

weixin_36450447的博客 445

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Linux】浅析Linux内存管理机制

本文主要讲解Linux内存管理机制中的一个核心子模块:内核内存分配与回收机制。通过了解这个机制,对内核内存分配失败时,应该怎么看日志、分析原因有一定帮助。

xuhuang11的博客 1208

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

浅析linux内核内存管理之高端内存(上)

进程可以寻址4G,其中0~3G为用户态,3G~4G为内核态。如果内存不超过1G那么最后这1G线性空间足够映射物理内存了,如果物理内存大于1G,为了使内核空间的1G线性地址可以访问到大于1G的物理内存,把物理内存分为两部分,0~896MB的进行直接内存映射,也就是说存在一个线性关系:virtual address = physical address + PAGE_OFFSET,这里的PAGE_

白水煮鸡蛋 2073

linux内存管理浅析

进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段。 Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都

随便写写 700

深入理解Linux内核——内存管理

1:页框的大小:4KB,4MB(如果PAE被激活,则为2MB)。 2:页描述符:     1)内核必须记录每个页框当前的状态。     2)内核必须能够区分哪些页框包含的是属于进程的页,而那些页框包含的是内核代码或者内核数据。     3)空闲页框:动态内存中不包含有用数据。           不空闲页框:包含用户态进程的数据,某个软件高速缓存的数据,动态分配的内核数据结构,设

xueli1991的博客 1022

浅析Linux 内存布局

TEXT_OFFSET为0x0000_8000,为编译时指定的代码段偏移,所以,uboot最后启动内核的地址为内核代码指定的KERNEL_RAM_PADDR(0x3000_8000),这样才能正常运行,而内核的入口地址和载入地址,最好设置成一样。2.vmalloc/vfree:工作在内核虚拟空间的VMALLOC_START和VMALLOC_END所代表的vmalloc区,支持分配大内容,分配为逻辑地址连续的一段内存,速度慢,效率低,可能睡眠,映射的地址优先从ZONE_HIGHMEM分配.

m0_74282605的博客 620

kernel hacker修炼之道之内存管理-分页

浅析linux内核内存管理之分页 作者:李万鹏 硬件中的分页 硬件中的分页分常规分页和扩展分页: 常规分页,32位的线性地址被分为3个域: Directory(目录) 最高10位 Table(页表) 中间10位 Offset(偏移量) 最低12位 扩展分页,32位的线性地址被分为2个域: Di...

tomhibolu 398

Linux内存管理

转自:http://www.cnblogs.com/zhaoyl/p/3695517.html 1、虚拟地址、线性地址、逻辑地址、物理地址 虚拟地址又叫线性地址。由于Linux没有采用分段机制(不确定是没有采用分段机制,还是采用的是最低限制的分段机制),所以逻辑地址和虚拟地址(也就是线性地址)是一个概念。内核的虚拟地址和物理地址大部分只差一个线性偏移量;而用户空间的虚拟地址和物理地址则采用了多

what_Daniel的博客 288

kernel hacker修炼之道之内存管理-高端内存(上)

<style type="text/css"> <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } PRE.western { font-family: "DejaVu Sans Mono", monospace } PRE.cjk { font-family: "DejaVu Sans", monosp...

tomhibolu 235

Linux内存管理核心机制解析:从伙伴系统到Slab分配器

内存管理是现代操作系统的核心机制,它通过虚拟内存技术为每个进程提供独立的地址空间,实现了内存隔离与高效利用。其底层原理涉及硬件MMU的地址翻译和操作系统的页表管理,旨在提升系统安全性与资源利用率。在技术价值上,高效的内存管理是保障应用性能、防止系统崩溃(OOM)和进行容量规划的基础。Linux内核通过伙伴系统解决大块连续物理内存的分配与碎片问题,同时利用Slab分配器优化海量小对象的内存申请效率,减少内部碎片。这些机制共同作用于数据库、高并发服务等需要精细内存控制的典型应用场景,构成了Linux系统稳定运行

weixin_30696427的博客 193

linux 内存管理原理

本文以32位机器为准,串讲一些内存管理的知识点。 (转)初识linux内存管理子系统 转 Linux内存管理(最透彻的一篇) Linux内存管理浅析(一) linux内存管理源码分析 - 页框分配器 1. 虚拟地址、物理地址、逻辑地址、线性地址  虚拟地址又叫线性地址。linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻辑地址专指下文说的...

RopenYuan的专栏 894

页回收机制的原理

当我们申请分配页的时候,页分配器首先尝试使用低水线分配页。如果使用低水线分配失败,说明内存轻微不足,页分配器将会唤醒内存节点的页回收内核线程,异步回收页,然后尝试使用最低水线分配页。如果使用最低水线分配失败,说明内存严重不足,页分配器会直接回收。物理页根据是否有存储设备支持分为两类。(1)交换支持的页:没有存储设备支持的物理页,包括匿名页,以及tmpfs文件系统(内存中的文件系统)的文件页和进程在修改私有的文件映射时复制生成的匿名页。 (2)存储设备支持的文件页。针对不同的物理页,采用不同的回收策略:(1)

qq_53111905的博客 617
上一篇: 浅析linux内核内存管理之分页
下一篇: 浅析linux内核内存管理之最终内核页表
白水煮鸡蛋
博客等级 码龄15年 106粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值