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

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

虚拟地址 1.1 虚拟地址引入 先先来一个测试代码: 1 #include 2 #include 3 #include 4 #include...这个地址在系统层面上称之为虚拟地址。 1.2 虚拟地址理解 每一个进程除了要把代码和数据加载到内存之外,对于当前的操作系统来讲,系统当中会为每一个进程创建一个地址空间。 地址空间在操作系统里面。...其实PCB和地址空间都是在物理内存里面的,只不过要访问初始化全局数据的时候,不在地址空间上保存,地址空间只会提供线性连续地址,让用户之后通过虚拟地址的地址空间,将虚拟地址转化到为了物理内存中。...修改的只是子进程的物理地址和页表,而地址空间里面的依然是虚拟地址。子进程和父进程的虚拟地址是一样的,只是映射到物理内存到不同区域,所以对应看到的地址是一样的,但内容却不一样。...所以虚拟地址相同而物理地址不同。 3. 进程调度 Linux中的nice值并不是能任意调度的,而是从-20到19,这40个数字之间变换。

16510

Linux虚拟地址空间布局

这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。...虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护并被处理器引用。内核空间在页表中拥有较高特权级,因此用户态程序试图访问这些页时会导致一个页错误(page fault)。...事实上,这与Linux内核版本有关。...8 保留区 位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。...在32位X86架构的Linux系统中,用户进程可执行程序一般从虚拟地址空间0x08048000开始加载。该加载地址由ELF文件头决定,可通过自定义链接器脚本覆盖链接器默认配置,进而修改加载地址。

3.3K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    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 是编译内核时

    7.2K20

    Linux 进程虚拟地址空间布局

    文章目录 1.虚拟地址空间简介 2.虚拟地址空间布局 参考文献 1.虚拟地址空间简介 虚拟地址空间(Virtual Address Space)是每一个程序被加载运行起来后,操作系统为进程分配的虚拟内存...每个进程所能访问的最大的虚拟地址空间由计算机的硬件平台决定,具体地说是由 CPU 的位数决定的。...对于 Linux,4GB 的虚拟地址空间的默认分配状态如下: 2.虚拟地址空间布局 C/C++程序为编译链接后生成可执行的二进制文件,由多个段组成,一般包含代码段、数据段和 BSS 段等。...可执行文件载入内存运行时,在 Linux 环境下的虚拟地址空间由一般有代码段、初始化数据段、未初始化数据段、堆和栈构成,如果程序使用了内存映射文件(比如共享库、共享文件),那么包含映射段。...64bits的Linux默认栈大小为10MB,可通过命令ulimit -s临时修改。

    5.1K50

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

    ---- ---- 一、虚拟地址空间 1.虚拟地址的引出(看不到物理地址,只能看看虚拟地址喽) 1 #include 2 #include 3...虚拟地址还有另外两个名字,分别叫做线性地址和逻辑地址 2.虚拟地址空间布局(系统角度:六个段。语言角度:五个段。) 1....env_start, env_end; unsigned long saved_auxv[AT_VECTOR_SIZE]; /* for /proc/PID/auxv */ struct linux_binfmt...那其实就是在进行虚拟地址空间编址的选择呢,你是选择64比特位的方式进行虚拟地址空间编址呢?还是选择32位虚拟地址空间编址,一个是4GB一个是16GB,但也没啥用,因为都是虚拟的,仅仅只是空间范围而已。...编译器和进程一样也被画饼,所以CPU在读取加载到内存上的程序的时候,读取的就是程序的虚拟地址,背后通过操作系统在不断的切换虚拟地址和物理地址,以便使得CPU读取的地址始终是虚拟地址。 9.

    1.5K20

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

    文章目录 一、Linux 内核中对 " 虚拟地址空间 " 的描述 二、task_struct 结构体源码 一、Linux 内核中对 " 虚拟地址空间 " 的描述 ---- 进程 的 " 虚拟地址空间 "...由 mm_struct 和 vm_area_struct 两个数据结构描述 ; mm_struct 是 “最高层次 " 上描述 ” 整个虚拟地址空间 “ 的结构体 ; 该结构是对 ” 整个 “ ” 用户空间..." 进行描述 ; vm_area_struct 是 " 较高层次 " 上的描述 " 虚拟地址空间 " 的区间 的 ; 每个进程只有 1 个 mm_struct 结构体数据 , 用于描述 整个 "...虚拟地址空间 " ; 则 对应的 " 进程描述符 task_struct " 中 , 有 1 个指针指向 mm_struct 结构体 ; task_struct -> mm_struct -> vm_area_struct...内核源码的 linux-4.12\include\linux\sched.h#483 位置 ; task_struct 中的 mm active_mm 是 描述 " 整个虚拟空间 " mm_struct

    3.7K20

    Linux可执行文件与进程的虚拟地址空间

    作者简介: 本文由西邮陈莉君教授研一学生贺东升编辑,梁金荣、张孝家校对 建议结合之前的《linux的内存寻址方式》看。...Linux可执行文件与进程的虚拟地址空间 一个可执行文件被执行的同时也伴随着一个新的进程的创建。...Linux会为这个进程创建一个新的虚拟地址空间,然后会读取可执行文件的文件头,建立虚拟地址空间与可执行文件的映射关系,然后将CPU的指令指针寄存器设置成可执行文件的入口地址,然后CPU就会从这里取指令执行...32位的虚拟地址空间 ? 64位的虚拟地址空间 ? Proc目录下的进程虚拟地址空间布局 Linux在装载可执行文件的时候,会将这些segment映射到进程的地址空间中。...Linux将进程虚拟地址空间中的一个段叫做虚拟内存区域(VMA)。在/proc目录下,可以查看一个进程的虚拟地址空间,通过命令 cat /proc/pid/maps ?

    4.3K30

    进程的虚拟地址空间

    Linux 系统中,采用了虚拟内存管理技术,事实上大多数现在操作系统都是如此!...在 Linux 系统中,每一个进程都在自己独立的地址空间中运行,在 32 位系统中,每个进程的逻辑地址空间均为 4GB,这 4GB 的内存空间按照 3:1 的比例进行分配,其中用户进程享有 3G 的空间...虚拟地址会通过硬件 MMU(内存管理单元)映射到实际的物理地址空间中,建立虚拟地址到物理地址的映射关系后,对虚拟地址的读写操作实际上就是对物理地址的读写操作,MMU 会将物理地址“翻译”为对应的物理地址...Linux 系统下,应用程序运行在一个虚拟地址空间中,所以程序中读写的内存地址对应也是虚拟地址,并不是真正的物理地址,譬如应用程序中读写 0x80800000 这个地址,实际上并不对应于硬件的 0x80800000...为什么需要引入虚拟地址呢?

    2.5K30

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

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

    3.2K00

    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...page_table_lock, in other configurations by being atomic. */ struct mm_rss_stat rss_stat; struct linux_binfmt

    64210

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

    虚拟地址空间的大小也由操作系统决定,32位的操作系统虚拟地址空间的大小为 2^32 字节,也就是 4G,64 系统的操作系统虚拟地址空间大小为 2^64 字节,这是一个非常大的数,感兴趣的可以自己计算一下...其次,所谓“独立拥有的虚拟地址”是指对于每一个进程,都可以访问自己的0-4G的虚拟地址虚拟地址是“虚拟”的,需要转化为“真实”的物理地址。 好比你有你的地址簿,我有我的地址簿。...、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表示访问级别

    1.1K20

    Linux 内核】进程管理 ( 进程与操作系统 | 进程与程序 | 进程与线程 | 虚拟地址空间 )

    文章目录 一、进程与操作系统 二、进程与程序 三、进程与线程 四、虚拟地址空间 一、进程与操作系统 ---- 操作系统与硬件的关系 : 操作系统 使用 硬件 提供的资源 , 如 CPU , 内存 , 磁盘...的组合在一起的文件 , 在操作系统中运行起来之后 , 才叫做 进程 ; 进程 是 运行的 程序 ; 三、进程与线程 ---- 进程 与 线程 : 线程 是 运行的基本单位 , 进程 是 线程 的容器 ; 四、虚拟地址空间...---- 进程 与 内存管理 : 进程 是 内存管理 的基本单元 , 每个进程都是 独立的内存管理单元 ; 在 Linux 内核中 , 进程 又被称为 任务 ; 虚拟地址空间概念 : 每个 进程 作为...独立的内存管理单元 , 其内存单元 称为 虚拟地址空间 , 进程 的 虚拟地址空间 分为 用户虚拟地址空间 ( 每个进程独立拥有 ) 内核虚拟地址空间 ( 所有进程共享 ) 操作系统 中 运行的 所有进程...共享 内核虚拟地址空间 , 每个 进程 都 拥有 独立的 用户虚拟地址空间 ;

    80510

    物理地址和虚拟地址的分布

    上一节内容的学习我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括: 以虚拟地址(VA)的形式,为应用程序提供远大于物理内存的虚拟地址空间...Linux内核空间虚拟地址分布 ? 在 Kernel Image 下面有 16M 的内核空间用于 DMA 操作。...Linux用户空间虚拟地址分布 ? 用户进程的代码区一般从虚拟地址空间的 0x08048000 开始,这是为了便于检查空指针。...Linux物理地址和虚拟地址的关系 ? Linux 将 4G 的线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...到这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址的,最后我们用一张图来总结一下: ?

    2.1K111

    物理地址和虚拟地址的分布

    上一节内容的学习我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括: 以虚拟地址(VA)的形式,为应用程序提供远大于物理内存的虚拟地址空间...Linux内核空间虚拟地址分布 ? 在 Kernel Image 下面有 16M 的内核空间用于 DMA 操作。...Linux用户空间虚拟地址分布 ? 用户进程的代码区一般从虚拟地址空间的 0x08048000 开始,这是为了便于检查空指针。...Linux物理地址和虚拟地址的关系 ? Linux 将 4G 的线性地址空间分为2部分,0~3G 为 user space,3G~4G 为 kernel space。...到这里我们应该知道了 Linux 是如何用虚拟地址来映射物理地址的,最后我们用一张图来总结一下: ?

    2.1K31
    领券