首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )

文章目录 一、虚拟地址空间布局架构 二、用户虚拟地址空间划分 一、虚拟地址空间布局架构 ---- 在 64 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 64 位的虚拟地址..., 最大只支持 48 位的虚拟地址 , 64 位地址太大 , 并不需要那么大的内存空间 ; " ARM64 架构 " 中 , Linux 系统的 " 内核虚拟地址 “ 与 ” 用户虚拟地址 "...是等同的 ; 用户虚拟地址 : 0x 0000 0000 0000 0000 ~ 0x 0000 FFFF FFFF FFFF , 48 位有效地址 ; 内核虚拟地址 : 0x FFFF 0000...0000 0000 ~ 0x FFFF FFFF FFFF FFFF , 48 位有效地址 ; 二、用户虚拟地址空间划分 ---- Linux 操作系统 进程 的 " 用户虚拟空间 " 起始地址...内核源码的 LINUX-4.12\arch\arm64\include\asm\memory.h#86 中 , 定义了 TASK_SIZE 与 TASK_SIZE_64 宏 ; VA_BITS 是编译内核时

7K20
您找到你想要的搜索结果了吗?
是的
没有找到

Linux虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…

6.未初始化数据段(又称为BSS段,Block Started by Symbol,以符号开头的块): 包含所有未初始化的全局变量和局部static变量,此段中的所有变量都由零或者空指针初始化,该区域大小在编译阶段就已确定...env_start, env_end; unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */ struct linux_binfmt...进程无法直接接触物理内存,只能通过虚拟地址依靠页表映射物理地址的方式,来间接访问物理内存。...所以操作系统为了保证进程的独立性,通过虚拟地址空间,再到页表,让不同的进程使用的同一虚拟地址,能够映射到不同的物理内存处。 3....4.使编译器编译后的程序 && 内存中的进程 ==> 均以统一的视角看待程序对应的代码和数据(程序和进程:两份虚拟地址空间,分别在磁盘和内存中,进程的虚拟地址空间源于程序的) 1.

1.4K20

Linux】地址空间&&虚拟地址

这个地址在系统层面上称之为虚拟地址。 1.2 虚拟地址理解 每一个进程除了要把代码和数据加载到内存之外,对于当前的操作系统来讲,系统当中会为每一个进程创建一个地址空间。 地址空间在操作系统里面。...其实PCB和地址空间都是在物理内存里面的,只不过要访问初始化全局数据的时候,不在地址空间上保存,地址空间只会提供线性连续地址,让用户之后通过虚拟地址的地址空间,将虚拟地址转化到为了物理内存中。...子进程和父进程的虚拟地址是一样的,只是映射到物理内存到不同区域,所以对应看到的地址是一样的,但内容却不一样。...2.2 页表和写时拷贝 查页表对内存地址进行访问是CPU,它里面包含CR3寄存器内,CPU的还有有一个叫做MMU硬件(内存管理单元),快速把虚拟地址结合页表转化为物理地址。...所以虚拟地址相同而物理地址不同。 3. 进程调度 Linux中的nice值并不是能任意调度的,而是从-20到19,这40个数字之间变换。

10610

linux」物理地址,虚拟地址内存管理,逻辑地址之间的关系

虚拟地址虚拟地址是CPU保护模式下的一个概念,保护模式是80286系列和之后的x86兼容CPU操作模式,在CPU引导完操作系统内核后,操作系统内核会进入一种CPU保护模式,也叫虚拟内存管理,在这之后的程序在运行时都处于虚拟内存当中...,虚拟内存里的所有地址都是不直接的,所以你有时候可以看到一个虚拟地址对应不同的物理地址,比如A进程里的call函数入口虚拟地址是0x001,而B也是,但是它俩对应的物理地址却是不同的,操作系统采用这种内存管理方法...,比如mov 0x4h8这个是虚拟地址,当我们要对这个虚拟地址里写数据时那么MMU会先判断CPU的分页状态寄存器里的标志状态是否被设定,如果被设定那么MMU就会捕获这个虚拟地址物理并在操作系统内核初始化好的内存映射表里查询与之对应的物理地址...,并将其转换成真正的实际物理地址,然后在对这个实际的物理地址给CPU,在由CPU去执行对应的命令,相反CPU往内存里读数据时比如A进程要读取内存中某个虚拟地址的数据,A进程里的指令给的是虚拟地址,MMU...首先会检查CPU的分页状态寄存器标志位是否被设置,如果被设置MMU会捕获这个虚拟地址并将其转换成相应的物理地址然后提交给CPU,在由CPU到内存中去取数据!

3K00

Linux内存空间分配、物理地址与虚拟地址映射

一、Linux内核动态内存分配与释放 1.1 kmalloc函数 Kmalloc分配的是连续的物理地址空间。...linux/init.h> #include #include char *buff; static int __init.../init.h> #include #include #include char *buff=...返回值:解除成功返回0,否则返回-1 2.2 Linux内核的mmap接口 2.2.1 内核描述虚拟内存的结构体 Linux内核中使用结构体vm_area_struct来描述虚拟内存的区域,其中几个主要成员如下...在没有使用虚拟存储器的机器上,地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址

2.9K31

Liunux内核内存管理之虚拟地址空间

虚拟地址空间 虚拟地址空间是一个非常抽象的概念,先根据字面意思进行解释: 它可以用来加载程序数据(数据可能被加载到物理内存上,空间不够就加载到虚拟内存中) 它对应着一段连续的内存地址,起始位置为 0。...MMU完成虚拟内存到物理内存的映射,即虚拟地址映射为物理地址; 流水线中预取指令取到的地址是虚拟地址,需要MMU转换以及设置访问权限 MMU采用分页机制(即按页来划分物理内存) 用MMU的是:Windows...、MacOS、Linux、Android; 不用MMU的是:FreeRTOS、VxWorks、UCOS…… 与此相对应的:CPU也可以分成两类,带MMU的、不带MMU的。...带MMU的是:Cortex-A系列、ARM9、ARM11系列; 不带MMU的是:Cortex-M系列……(STM32是M系列,没有MMU,不能运行Linux,只能运行一些UCOS、FreeRTOS等等)...内存访问级别的设置和修改(内存保护),在完成映射的同时,会设置CPU访问该段内存的访问级别(3,2,1,0 Linux只有用户空间3,内核空间0), 如图: ro表示read only 0和3表示访问级别

1K20

Linux 内核 内存管理】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 )

文章目录 一、用户虚拟地址空间组成 二、内存描述符 mm_struct 结构体源码 一、用户虚拟地址空间组成 ---- " 用户虚拟地址空间 " 包括以下区域 : ① 代码段 ② 数据段 ③ 未初始化数据段...④ 动态库 代码段 , 数据段 , 未初始化数据段 ; ⑤ 堆内存 : 通过 malloc brk vmalloc 等函数 申请的 动态分配 的内存 ; ⑥ 栈内存 : 存放 局部变量 和 函数调用栈...; ⑦ 内存映射区 : 将 文件 通过 mmap 函数 映射到 " 虚拟地址空间 " 的 " 内存映射区 " ; ⑧ 环境变量与参数 : 在 栈底 存放着程序运行的 环境变量 与 参数配置 信息 ;...二、内存描述符 mm_struct 结构体源码 ---- 在 Linux 内核中 , 使用 " 内存描述符 " mm_struct 结构体 代表 " 用户虚拟地址内存空间 " , mm_struct 结构体...在 Linux 源码 linux-4.12\include\linux\mm_types.h#359 位置 ; mm_struct 结构体源码如下 : struct mm_struct { struct

56210

linux」物理地址,虚拟地址内存管理,逻辑地址之间的关系2

如果不使用段偏移表示地址的话则称为虚拟地址!...1.虚拟地址是CPU保护模式下的一个概念,保护模式是80286系列和之后的x86兼容CPU操作模式,在进入虚拟模式之前CPU以及Bootloader,操作系统内核均运行在实模式下,直接对物理地址进行操作...2.虚拟内存中也有分页管理,这种管理方法是为了确保内存中不会出现内存碎片,当操作系统内核初始化完毕内存中的分页表后CPU的分页标志位会被设置,这个分页标志位是给MMU看的!...3.虚拟内存采用一种拆东墙补西墙的形式让每个进程都拥有3G用户空间! 4.当内存中的容量不够时会从磁盘中切割内存出来供进程使用!...7.内存中有一个叫MMU(内存管理单元)的电子元件负责从操作系统已经初始化好的内存映射表里查询与虚拟地址对应的物理地址并转换, 8.逻辑地址由两部份组成,段标识符和段内偏移量。

1.9K00

Linux 内核 内存管理】虚拟地址空间布局架构 ⑤ ( Linux 内核中对 “ 虚拟地址空间 “ 的描述 | task_struct 结构体源码 )

文章目录 一、Linux 内核中对 " 虚拟地址空间 " 的描述 二、task_struct 结构体源码 一、Linux 内核中对 " 虚拟地址空间 " 的描述 ---- 进程 的 " 虚拟地址空间 "...由 mm_struct 和 vm_area_struct 两个数据结构描述 ; mm_struct 是 “最高层次 " 上描述 ” 整个虚拟地址空间 “ 的结构体 ; 该结构是对 ” 整个 “ ” 用户空间..." 进行描述 ; vm_area_struct 是 " 较高层次 " 上的描述 " 虚拟地址空间 " 的区间 的 ; 每个进程只有 1 个 mm_struct 结构体数据 , 用于描述 整个 "...内核源码的 linux-4.12\include\linux\sched.h#483 位置 ; task_struct 中的 mm active_mm 是 描述 " 整个虚拟空间 " mm_struct...信号处理相关字段 | 信号量和共享内存相关字段 )

3.6K20

Linux虚拟地址空间布局

在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。...这并不意味着内核使用那么多物理内存,仅表示它可支配这部分地址空间,根据需要将其映射到物理内存虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护并被处理器引用。...Program)中的伪指令,用于为符号预留一块内存空间。...8 保留区 位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。...在32位X86架构的Linux系统中,用户进程可执行程序一般从虚拟地址空间0x08048000开始加载。该加载地址由ELF文件头决定,可通过自定义链接器脚本覆盖链接器默认配置,进而修改加载地址。

3.2K40

Linux 进程虚拟地址空间布局

文章目录 1.虚拟地址空间简介 2.虚拟地址空间布局 参考文献 1.虚拟地址空间简介 虚拟地址空间(Virtual Address Space)是每一个程序被加载运行起来后,操作系统为进程分配的虚拟内存...对于 Linux,4GB 的虚拟地址空间的默认分配状态如下: 2.虚拟地址空间布局 C/C++程序为编译链接后生成可执行的二进制文件,由多个段组成,一般包含代码段、数据段和 BSS 段等。...可执行文件载入内存运行时,在 Linux 环境下的虚拟地址空间由一般有代码段、初始化数据段、未初始化数据段、堆和栈构成,如果程序使用了内存映射文件(比如共享库、共享文件),那么包含映射段。...在Linux中,如果使用malloc()申请一块过大的内存,C库函数便会创建这种内存映射段,而不是使用堆内存。...参考文献 [1] linux内核空间和用户空间详解 [2] 程序或-内存区域分配(五个段)–终于搞明白了 [3] 进程内存分布剖析 [4] 深入理解计算机系统中文版[M].C1.7.3虚拟内存.P12

5K50

linux系统调用函数 mmap--创建内存映射区(在虚拟地址空间上)munmap--释放内存映射区

第二个参数是映射区的大小size_t length,由于32bit的linux内核虚拟地址空间是由4KB大小的页面组织的,实际大小是4KB的整数倍。不能指定为0,否则调用失败!...返回值: 成功时,返回内存映射区的首地址。 失败,MAP_FAILED (void)-1*。 功能: 将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。...(1)使用普通文件提供的内存映射: 适用于任何进程之间。...对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式。此时,不必指定具体的文件,只要设置相应的标志即可。...fcntl.h> int main(){ //打开一个文件 int fd = open("a.txt",O_RDWR); int len = lseek(fd,0,SEEK_END); //创建内存映射区

1.4K20

如何更新 Linux符号链接 | Linux 中国

UNIX 和 Linux 用户发现链接有很多用途,特别是符号链接。我喜欢使用符号链接的一种方式是管理各种 IT 设备的配置备份。...如上所示,@ 符号表示这些是链接。 创建一个链接 符号链接 Router 指向我的 Netgear RL5000 的 config 目录。...如果我决定用一个新的型号替换这个路由器,使用符号链接的第二个好处就很明显了。我可能会把旧的路由器改成一个接入点。因此,它的目录并没有被删除。...更新一个链接 由于我的主路由器已经改变,我想让路由器的符号链接指向它的目录。...,就把它当作一个正常的文件 -s、--symbolic:制作符号链接而不是硬链接 总结 链接是 UNIX 和 Linux 文件系统中最强大的功能之一。

2.7K20

编译、链接到载入、运行的大致过程----3.载入

,并生成了最终的程序文件;而"stripped" 就表示 符号 已经被解析为 程序虚拟地址,而"not stripped" 就表示 符号没有被解析为 程序虚拟地址;所以 编译后的文件,其属于"not stripped...程序解释器(比如:/lib/ld-linux.so.2 就是程序解释器的一种 ), 程序解释器根据程序的头部信息,生成程序的 内存虚拟地址的入口,并从程序需要的动态链接库文件中查找对应的符号地址,这些找到的符号地址...,被加载器进行了重定向,然后加入到当前程序的虚拟内存地址空间中合适的位置,从而完成 当前程序中的符号解析,至此完成程序虚拟地址内存虚拟地址的转换工作;然后程序解释器创建程序的进程映像,创建进程映像之后...载入内存后,在运行时候,访问的地址是: 内存虚拟地址。这个内存虚拟地址 并不是 “程序虚拟地址”,也不是“内存物理地址”;但是 这三者之间是有关系的: A....“程序虚拟地址” 通过分析文件获得,依赖于程序文件;而“内存虚拟地址” 是 程序加载器 分配的,所以每次运行程序可能都会发生变化,实际上没有不发生变化的,程序的运行访问的都是"内存虚拟地址" ,所以"内存虚拟地址

2.2K30

怎样Hack Linux的内核符号

本文从一个实际例子出发,阐述了在对二进制形式的Linux固件做自动化安全加固的时遇到的技术难题和解决办法。 Linux内核是不是坚不可摧?答案是NO!...而自动化漏扫技术又可单独成文,本文将主要介绍自动化漏洞修复所用到的内核符号Hack技术。 所谓内核漏洞,其实就是Linux内核中存在的缺陷函数。...这里有很多核心问题需要解决,其中之一是修复函数使用未导出内核符号问题。 ? 我们都知道Linux是宏内核架构(Monolithic Kernel)。...为了实现内核功能的动态扩展,Linux又引入了内核模块。内核模块将不可避免的使用内核函数。正常情况下,Linux内核代码会将一些基础功能性函数导出。如控制台输出函数printk等。...对于Linux内核模块而言,它本质上也是动态链接库,因此加载模块时必然存在解析符号地址的函数。

2.3K10
领券