Linux 2.x 内核对内存的管理

在Linux 2.4.x内核中,如何从一个page找到所有映射该页面的VMA?反向映射可以带来哪些便利? 2.4.x内核中要查找映射特定页面的VMA是相对低效的,需要通过遍历进程和页表实现。查找映射页面的VMA O(N^2) 遍历所有进程和页表 通过struct page->mapping直接访问 性能从O(N)提升到O(1)在Linux 2.4.x中,没有直接的方法可以从一个struct page找到所有映射它的VMA。通过理解反向映射的演变,我们可以更好地把握Linux内存管理的设计哲学,以及为现代大型系统设计高效数据结构的重要性。进程映射页面时,调用page_add_rmap()添加反向映射项。 阅读详情

其着重点在于分页,用分页的机制把进程间的虚拟地址分隔开来。

每个进程都有一套页表,整个系统有一张GDT表(此机制由逻辑地址到线性地址变换,实际上是走了个形式,变换前后地址不变)

每个进程都有一套页表用于从线性地址到物理地址的映射变换。这样,每个进程都有一个4GB的逻辑空间。

(两进程的逻辑地址相同,但它们有不同的页表,故最终会映射到不同的物理位置)

实际上,此机制的地址翻译只有一步——直接把虚拟地址翻译成物理地址。      

CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到存储器之前先地址翻译成适当的物理地址。

地址翻译需要CPU硬件和操作系统之间的紧密合作。CPU芯片上叫做存储器管理单元(Memory Management Unit,MMU)的专用硬件,利用存放在主存中的页表来动态翻译虚拟地址,该表的内容是由操作系统管理的。


操作系统为每个进程提供了一个独立的页表,因而也就是一个独立的虚拟地址空间。

按需页面调度和独立的虚拟地址空间的结合,对系统中存储器的使用和管理造成了深远的影响。

简化链接。独立的地址空间允许每个进程的存储器使用相同的基本格式,而不管代码和数据实际存放在物理存储器的何处。

例如:一个给定的Linux系统上的每个进程都使用类似的存储器格式。文本节总还是从虚拟地址0x08048000处开始(32位),或者从0x400000处开始(64位)。数据和bss节紧跟在文本节后面。栈占据进程地址空间最高的部分,并向下生长。

这样的一致性极大地简化了链接器的设计和实现,允许链接器生成全链接的可执行文件,这些可执行文件时独立于物理存储器中代码和数据的最终位置的。

简化加载。虚拟存储器还使得容易向存储器中加载可执行文件和共享对象文件。

在ELF可执行文件中.text和.data节是连续的。要把这些节加载到一个新创建的进程中,Linux加载器分配虚拟页的一个连续的片,从虚拟地址0x08048000处开始(32位),或者从0x400000处开始(64位),把这些虚拟页标记为无效的(即未被缓存的),将页表条目指向目标文件中适当的位置。

注意:加载器从不实际拷贝任何数据从磁盘到存储器。在每个页初次被引用时,要么是CPU取指令时引用的,要么是一条正在执行的指令引用一个存储器位置时引用的,虚拟存储器需要会按照需要自动调入数据页。


段

Linux将虚拟存储器组织成一些段的集合。每个存在的虚拟页面都保存在某个区域中,而不属于某个区域的虚拟页是不存在的,并且不能被进程引用。内核不用记录那些不存在的虚拟页,而这样的页也不占用其他任何额外资源。

内核为系统中的每个进程维护一个单独的任务结构(源代码中的task_struct)。任务结构中的元素包含或者指向运行该进程所需要的所有信息(例:PID、用户栈指针、程序计数器等)


mm_struct描述了虚拟存储器的当前状态。pdg指向第一级页表的基址。mmap指向一个vm_area_structs(区域结构)的链表。当内核运行这个进程时,它就将pdg存放在CR3控制寄存器中。

vm_start: 指向这个区域的起始处。

vm_end: 指向这个区域的结束处。

vm_prot:描述这个区域所有页的读写权限。

vm_flags:描述这个区域内的页面是否是与其他进程共享的。

vm_next:指向链表中下一个区域结构。

(每个区域段一个结构 用链表串起来,其作用类似于段表)

利用TLB加速地址翻译

每次CPU产生一个虚拟地址,MMU就必须查阅一个页表项,以便将虚拟地址翻译为物理地址。在最糟糕的情况下,这又会要求从存储器取一次数据,代价很大。许多系统试图消除这样的开销,它们在MMU中包括了一个关于页表项的小的缓存,称为翻译地址后备缓冲器(Translation Lookaside Buffer,TLB)。

TLB是一个小的、虚拟寻址的缓存,其中每一行都保存着一个由单个页表项组成的块。


(高速缓存Cache是主存上的一部分数据缓存,TLB是缓存一部分页表)

多级页表

如果我们有一个32位的地址空间、4KB的页面和一个4字节的页表项,,那么需要一个4MB的页表驻留在存储器中。对于地址空间为64位的系统来说,问题将更复杂。

用来压缩页表的常用方法是使用层次结构的页表。

例如:一级页表中的每个页表项(PTE,Page Table Entry)负责映射虚拟地址空间中的一个4MB的片(chunk),这里每一片都是由1024个连续的页面组成的。假设地址空间是4GB,1024个PTE已经足够覆盖整个空间了。

如果片i中的每个页面都未被分配,那么一级PTE i就为空。


这种方法从两方面减少了存储器要求。

⑴如果一级页表中的一个PTE是空的,那么相应的二级页表就根本不会存在。这代表一种巨大的潜在节约。因为对于一个典型的程序,4GB的虚拟地址空间的大部分都将是未分配的。

⑵只有一级页表才需要总是在主存中。虚拟存储系统可以在需要时创建、页面调入或调出二级页表,这就减少了主存的压力,只有最经常使用的二级页表才需要缓存在主存中。


地址翻译过程全景


Core i7 MMU使用四级页表来将虚拟地址翻译成物理地址。36位VPN被划分成四个9位的片,每个片被用作到一个页表的偏移量。

CR3寄存器包含L1页表的物理地址。VPN 1 提供一个L1 PTE(页表项)的偏移量,这个PTE包含L2页表的基地址。VPN 2提供到一个L2 PTE的偏移量,以此类推。

页面调度

在虚拟存储器的习惯说法中,DRAM缓存不命中称为缺页(Page fault)。

地址翻译硬件从存储器中读取某页表项,从有效位推断出此虚拟页未被缓存,并且触发一个缺页异常。缺页异常调用内核中的缺页异常处理程序,该程序会选择一个牺牲页(当内存不足时),拷回磁盘。(把脏页--已经修改的页 作为牺牲页)

当异常处理程序返回时,它会重新启动导致缺页的指令,该指令会把导致缺页的虚拟地址重发送到地址翻译硬件。

在虚拟存储器的习惯说法中,块被称为页。在磁盘和存储器之间传送页的活动叫做交换(swapping)或者页面调度(paging)。页从磁盘换入DRAM和从DRAM换出到磁盘交换区。一直等待,直到最后时刻,也就是当有不命中发生时,才换入页面的策略称为按需页面调度。所有现代系统都使用的是按需页面调度的方式。

又是局部性救了我们

尽管在整个运行过程中程序引用的不同页面数可能超过物理存储器的总大小,但是局部性原则保证了在任意时刻,程序将往往在一个较小的活动页面集合上工作,这个集合叫做工作集(working set)。

在初始开销,也就是将工作集页面调度到存储器中之后,接下来对这个工作集的引用将导致命中,而不会产生额外的磁盘流量。

注意:如果工作集的大小超出了物理存储器的大小,那么程序将产生一种不幸的状态,叫做颠簸(thrashing),这时页面将不断地换进换出。虽然虚拟存储器通常是有效的,但是如果一个程序性能慢得像爬一样,那么聪明的程序员会考虑是不是发生了颠簸。

存储器映射

Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容,这个过程称为存储器映射(memorymapping)。

虚拟存储器区域可以映射到两种类型的对象中的一种:

⑴普通文件:

一个区域可以映射到一个普通磁盘文件的连续部分。例如一个可执行目标文件。

文件区(section)被分成页大小的块,每一块包含一个虚拟页面的初始内容。因为按需进行页面调度,所以这些虚拟页面没有实际交换进入物理内存,直到CPU第一次引用到页面(即发射一个虚拟地址,落在地址空间这个页面的范围之内)。

⑵匿名文件:

一个区域也可以映射到一个匿名文件,匿名文件是由内核创建的,包括的全是二进制零。

CPU第一次引用这样一个区域内的虚拟页面时,内核就在物理内存中找到一个合适的牺牲页面,如果该页面被修改过,就将这个页面换出来,用二进制零覆盖牺牲页面并更新页表,将这个页面标记为是驻留在存储器中的。注意在磁盘和存储器之间并没有实际的数据传送。因为这个原因,映射到匿名文件的区域中的页面有时也叫做请求二进制零的页(demand-areopage)

交换文件也叫做交换区域(swap area),在任何时刻,交换空间都限制着当前运行着的进程能够分配的虚拟页面总数。

(进程动态分配的区域所映射的就是交换文件区域)

再看共享对象

存储器映射的概念来源于一个聪明的发现:

如果虚拟存储器系统可以集成到传统的文件系统中,那么就能提供一种简单而高效的把程序和数据加载到存储器中的方法。

一个对象可以被映射到虚拟存储器的一个区域,要么作为共享对象,要么作为私有对象。

对共享对象的写操作,对于那些也把这个共享对象映射到它们虚拟存储器的其他进程而言也是可见的。而且,这些变化也会反映在磁盘上的原始对象中。

对一个映射到私有对象的区域做的改变,对于其他进程来说是不可见的,并且进程对这个区域所做的任何写操作都不会反映在磁盘上的对象中。


即使对象被映射到了多个共享区域,物理内存中也只需要存放在共享对象的一个拷贝。(为了方便,我们将物理页面显示为连续的,但是在一般情况下当然不是这样。)

【Linux IPC中的管道通信 即为此方式的实现】

私有对象是使用一种叫做写时拷贝(copy-on-write)的巧妙技术。

一个私有对象开始生命周期的方式基本上与共享对象的一样,在物理存储器中只保存有私有对象的一份拷贝。对于每个映射私有对象的进程,相应私有区域的页表条目都被标记为只读,并且区域结构被标记为私有的写时拷贝。

只要没有进程试图写它自己的私有区域,它们就可以继续共享物理存储器中对象的一个单独拷贝。然而,只要有一个进程试图写私有区域内的某个页面,那么这个写操作就会触发一个保护故障。 

当故障处理程序注意到保护异常是由于进程试图写私有的写时拷贝区域中的一个页面而引起的,它就会在物理存储器中创建这个页面的一个新拷贝,更新页表条目指向这个新的拷贝,然后恢复这个页面的可写权限。


通过延迟私有对象中的拷贝直到最后可能的时刻,写时拷贝最充分地使用了稀有的物理存储器。

再看fork函数

当fork函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的PID。为了给这个新进程创建虚拟存储器,它创建了当前进程的mm_struct、区域结构和页表的原样拷贝。它将两个进程中的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时拷贝。

当fork在新进程中返回时,新进程现在的虚拟存储器刚好和调用fork时存在的虚拟存储器相同。当这两个进程中的任一个后来进行写操作时,写时拷贝机制就会创建新页面,因此,也就为每个进程保持了私有地址空间的抽象概念。

再看execve函数

假设运行在当前进程中的程序执行了如下的调用:

execve(“a.out”, NULL, NULL) ;

execve函数用a.out程序有效地替代了当前程序。加载并运行a.out需要以下几个步骤:

⑴删除已存在的用户区域

删除当前进程虚拟地址的用户部分中的已存在的区域(段)结构。

⑵映射私有区域

为新程序的文本、数据、bss和栈区域创建新的区域(段)结构。所有这些新的区域都是私有的、写时拷贝的。

文本和数据段 被映射为a.out文件中的文本和数据区。

bss段       是请求二进制零的,映射到匿名文件,但其大小包含在a.out中。

栈和堆        也是请求二进制零的,初始长度为零。

⑶映射共享区域

如果a.out程序与共享库链接,那么这些对象都是动态链接到这个程序的,然后再映射到用户虚拟地址空间中的共享区域内。

⑷设置程序计数器(PC)

execve做的最后一件事就是设置当前进程上下文中的程序计数器,使之指向文本段的入口点。

(下一次调度这个进程时,它将从这个入口点开始执行。Linux将根据需要换入代码和数据页面)

 


用户级存储器映射函数

Unix进程可以使用mmap函数来创建新的虚拟存储器区域,并将对象映射到这些区域中。

#include <unistd.h>

#include <sys/mman.h>

void* mmap(void* start,  size_t length,  int  prot, int  flags,  int fd,  off_t  offset) ; 

mmap函数要求内核创建一个新的虚拟存储器区域,最好是从地址start开始的一个区域,并将文件描述符fd指定的对象的一个连续的片(chunk)映射到这个新的区域。连续的对象片大小为length字节,从距文件开始处偏移量为offset字节的地方开始。start地址仅仅是一个暗示,通常被定义为NULL。


参数prot包含描述新映射的虚拟存储器区域的访问权限位。

PROT_EXEC:可被执行。

PROT_READ:可读。

PROT_WRITE:可写。

PROT_NONE:禁止访问

 

参数flags 描述被映射对象的类型。

MAP_ANON:被映射的对象是一个匿名对象。

MAP_PRIVATE:被映射对象是一个私有、写时拷贝的对象。

MAP_SHARED:被映射对象是一个共享对象。

 

例如:

bufp = mmap(-1, size, PROT_READ,  MAP_PRIVATE | MAP_ANON, 0, 0) ;

让内核创建一个新的包含size字节的只读、私有、请求二进制零的虚拟存储器区域。

 

munmap函数删除虚拟存储器区域:

#include <unistd.h>

#include <sys/mman.h>

int  munmap(void*  start, size_t  length) ;

Linux内核Kbuild系统解析与V2X开发实践 Kbuild系统是Linux内核模块构建的核心工具链,通过Makefile和Kconfig实现自动化编译。其工作原理包括配置、编译和安装三个阶段,支持模块化开发和依赖管理。在嵌入式开发领域,Kbuild系统能显著提升构建效率,特别是在V2X车联网等实时性要求高的场景中。最新Linux 6.17版本对Kbuild进行了多项优化,包括构建速度提升和Clang编译器支持改进。掌握Kbuild系统对于内核开发者至关重要,本文结合V2X通信模块实例,详解从环境配置到性能优化的全流程实践。 阅读详情

相关推荐

Linux-2内核系列:从O(1)调度器到sysfs,现代Linux的基石

Linux内核版本众多,其中2.x系列(如2.6.32)奠定了现代Linux企业级应用的底层框架。从O(1)调度器的位图查找机制到内存管理的反向映射重构,再到sysfs设备模型让内核具备自我描述能力,这些设计直接影响了今天的容器、虚拟化与高性能网络。理解该系列内核的演进,有助于运维和开发者在面对高并发调度延迟、内存碎片化、驱动兼容性等问题时,从源码层面建立更清晰的判断力。本文从老运维视角梳理Linux-2的编译调优、模块加载与排障实战,帮助读者看懂现代内核中那些“承重墙”的设计由来。

weixin_31236101的博客 243

操作系统——虚拟内存管理

与传统存储管理方式(一次性、驻留性)相比,虚拟内存基于局部性,将操作系统在所需部分调入内存,将暂不需要的调出内存。给用户感觉内存变大了,所以称为虚拟存储器。局部性:时间局部性:某数据或指令在执行不久后可能再次访问。空间局部性:某存储单元访问不久后其附近的存储单元也将被访问。虚拟存储器并不存在,对用户透明。有三个特征:①多次性:可分多次调入内存,最重要的特征。②对换性:将暂不使用的调出内存。③虚拟性:逻辑上扩充内存容量。

m0_62344154的博客 1207

库存预测新思路:AI架构师的图神经网络应用

用图神经网络(GNN)解决传统库存预测的“关联盲区”,让预测从“孤立商品”转向“商品网络”。传统库存预测的痛点分析;GNN的核心概念(图结构、消息传递);GNN在库存预测中的算法原理与代码实战;实际应用场景与未来趋势。背景:用超市老板的烦恼引出传统方法的问题;核心概念:用“商品朋友圈”比喻GNN的图结构和消息传递;算法原理:用数学公式和Mermaid流程图讲清楚GNN的工作流程;实战:用PyTorch Geometric写一个简单的库存预测模型;

AI Python 编程之道的博客 959

TLB、程序计数器PC和指令指针寄存器IP

TLB、程序计数器PC和指令指针寄存器IP TLB TLB( Translation Look- aside buffer)专门用于缓存内存中的页表项,一般在MMU单元内部,页表一般存储在屋里内存中。当处理器要访问一个虚拟地址时,首先会在TLB中查询。如果TLB表项中没有相应的表项,称为TLB Miss,那么就需要访问页表来计算出相应的物理地址。如果TLB表项中有相应的表项,那么直接从TLB表项中获取物理地址,称为TLB命中。 程序计数器PC和指令指针寄存器IP 程序计数器PC 用指令事先编好的程序连

清梦旅人的博客 4692

西红柿成熟度检测数据集总结

成熟度类别标注数量semiripe(半成熟)10275rotten(腐烂)13470fullyripe(完全成熟)35031unripe(未成熟)26212。

crz1336768325的博客 2125

大疆控制算法笔试复习指南:从PID到MPC核心考点解析

控制算法是无人机、机器人等智能装备实现自主运行的核心技术。从经典控制到现代控制,PID控制算法、LQR控制算法、预测控制算法(MPC)以及Stanley控制算法等,构成了工程实践中不可或缺的方法体系。理解其数学原理、适用条件与调参逻辑,是评估系统稳定性、动态响应与抗扰能力的基础。在无人机飞控、云台增稳、车载路径跟踪等典型场景中,这些算法直接决定了设备的实际性能表现。大疆等企业相关岗位的笔试,正是围绕上述核心知识点,考查候选人对控制系统本质的理解、数学推导能力以及工程实现素养。本文整理了一套覆盖理论基石、高频

weixin_33178839的博客 359

linux 加载地址 0x08048000,深入理解计算机系统 第九章 虚拟存储器

虚拟存储器定义:对主存的抽象机制,是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互。功能:1. 将主存看成是一个存储在磁盘上的地址空间的高速缓存,在内存中只保存活动区域,并根据需要在磁盘和内存之间来回传送数据。2. 为进程提供了一致的地址空间,从而简化了存储器管理。3. 保护了每个进程的地址空间不被其他进程所破坏。9.1 物理和虚拟地址CPU通过生成一个虚拟地址(Virtual add...

weixin_34701183的博客 834

手把手教你用6轴IMU跑通LIO-SAM:参数配置与代码修改保姆级教程

本文提供了一套完整的6轴IMU适配LIO-SAM的解决方案,包括参数配置与代码修改的详细步骤。从理解6轴与9轴IMU的关键差异入手,逐步指导如何调整核心配置文件params.yaml、重构utility.h关键函数、优化mapOptimization.cpp的位姿融合逻辑,并给出编译验证与性能调优建议,帮助开发者快速实现6轴IMU在LIO-SAM中的稳定运行。

weixin_28717807的博客 357

linux 加载地址 0x08048000,linux – ELF的基地址

我试图找到ELF文件的基地址.我知道您可以使用readelf查找程序入口点和不同的部分详细信息(基址,大小,标志等).例如,x86体系结构的程序基于链接器的0x8048000.使用readelf我可以看到程序入口点,但输出中没有特定字段告诉基地址.$readelf -e testELF Header:Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 0...

weixin_42160376的博客 716

【Apollo规划模块探秘】—— 场景(Scenario)驱动的决策引擎

本文深入解析了Apollo自动驾驶平台规划模块的核心机制——场景(Scenario)驱动的决策引擎。文章通过类比日常驾驶,阐述了规划模块如何像经验丰富的司机一样,根据不同的路况(如车道跟随、无保护左转)切换不同的“驾驶模式”。重点剖析了场景管理器(ScenarioManager)如何基于感知信息进行场景判断与切换,以及“场景-阶段-任务”双层状态机如何精密协作,实现灵活、高效且安全的轨迹规划。

rnn9storyteller的博客 278

SIWAVE+ADS提取PCB走线寄生参数

本文将介绍一种很适合PCB走线提取寄生电感等参数的方法,即是通过SIWAVE将PCB走线的S参数提取出来,再通过ADS将S参数转换成电感、电容值。

sinat_15150363的博客 1765

现代操作系统的内存管理原理:以Linux2.6.x.x为例

不谈老掉牙的内存管理方式了。本文使用的内核是版本。内存管理?内存管理!不管是在老版本的操作系统各个子系统中,亦或是现代版本操作系统中,都是极其复杂和庞大的。当然,万变不离其宗,但是,看源码可以让你找不到方向。本文在上一篇的基础上来解释,当然要把源码完完全全的列出来不太现实,大家对照自己的前置理解即可,如果有时间和精力去完完全全看懂源码才是最好!。动态链接算是把Glibc、vir addr和用到了极致!对照之前的Linux 0.11和0.99版本,2.6.x.x。

遇事不决,问春风 984

【RKNN】RKNN(Rockchip Neural Network)​​ 的详解

RKNN 为 Rockchip 硬件提供了高效的 AI 推理解决方案,适合需要低功耗、实时响应的边缘场景

浩瀚之水的专栏 1686

linux malloc free 内存碎片_Linux 内核 VS 内存碎片 (上)

(外部)内存碎片是一个历史悠久的 Linux 内核编程问题,随着系统的运行,页面被分配给各种任务,随着时间的推移内存会逐步碎片化,最终正常运行时间较长的繁忙系统可能只有很少的物理页面是连续的。由于 Linux 内核支持虚拟内存管理,物理内存碎片通常不是问题,因为在页表的帮助下,物理上分散的内存在虚拟地址空间仍然是连续的 (除非使用大页),但对于需要从内核线性映射区分配连续物理内存的需求来...

weixin_29956897的博客 387

在 SAP 中,Primary Cost Element(初级成本要素)与Secondary Cost Element(次级成本要素)的核心区别、作用及业务含义可归纳如下

摘要:SAP中初级成本要素与次级成本要素的核心区别在于:初级要素必须关联FI模块的损益科目,直接影响财务报表,用于记录外部成本(如电费、薪酬);次级要素仅存在于CO模块,用于内部成本分配(如分摊、作业分配),不影响外部报表。初级要素是"外部成本入口",次级要素是"内部成本搬运工",二者共同实现成本的多维度追踪与管理。

金牌架构师 760

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux内存描述之内存节点node--Linux内存管理(二)

1 内存节点node 1.1 为什么要用node来描述内存 这点前面是说的很明白了, NUMA结构下, 每个处理器CPU与一个本地内存直接相连, 而不同处理器之前则通过总线进行进一步的连接, 因此相对于任何一个CPU访问本地内存的速度比访问远程内存的速度要快 Linux适用于各种不同的体系结构, 而不同体系结构在内存管理方面的差别很大. 因此linux内核需要用一种体系结构无关的方式来...

weixin_30301449的博客 377

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

3. 内核内存的布局图(linux4.0)

思考题: 在32bit Linux中,内核空间的线性映射的虚拟地址和物理地址是如何换算的? 答:在vexpress平台,物理地址PHYS_OFFSET = 0x6000000(1G), PAGE_OFFSET= 0xc0000000(3G),假设虚拟地址是X ,物理地址是Y, X-PAGE_OFFSET + PHYS_OFFSET = Y,Y-PHYS_OFFSET +PAGE_OFFSET = X 在32bit Linux中,高端内存的起始地址是如何计算的? 答:回答此问题之前,...

Do one thing at a time, and do well. 385

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

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

Linux内核的l2tp实现,Linux Kernel gdth实现内核内存破坏漏洞

Linux Kernel gdth实现内核内存破坏漏洞发布日期:2010-11-04更新日期:2010-11-16受影响系统:Linux kernel 2.6.x描述:--------------------------------------------------------------------------------CVE ID: CVE-2010-4157Linux Kernel是开放...

weixin_42468911的博客 234

Linux内核内存管理:反向映射、Zswap与Cgroup v2实战

内存管理是操作系统核心机制,涉及物理地址转换、页面回收等底层原理。Linux内核通过四级页表结构管理48位地址空间,Slab分配器优化小对象分配效率。在工程实践中,反向映射机制通过anon_vma和address_space结构实现物理页到虚拟地址的追踪,对解决内存泄漏至关重要。Zswap和Zram作为内存压缩技术,分别适用于高频交换场景和内存受限设备,通过LZ4等算法可显著降低延迟。Cgroup v2提供更精确的内存控制,其memory.high阈值和协同资源分配特性,能有效预防容器OOM。本文结合分布式

weixin_29587015的博客 211

Linux 2.6.19.x 内核编译配置选项简介

博主按:写得十分详细,保存备查。感谢金步国 原文链接:http://www.svn8.com/shouce/Linux/kernel_options.html Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者...

weixin_33918114的博客 198

[转]Linux 2.6.19.x内核编译配置选项简介[来自:Linux联盟收集整理]

Linux 2.6.19.x内核编译配置选项简介       Code maturity level options 代码成熟度选项 Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择 General setup 常规设置 Local ve

改变不了世界也改变不了自己 1617
上一篇: 操作系统内存管理
下一篇: Linux 0.12 内核对内存的管理
coo1fish
博客等级 码龄14年 22粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值