C++学习之系统I/O文件操作 |
您所在的位置:网站首页 › 安卓文件data文件访问限制 › C++学习之系统I/O文件操作 |
一、进程映像 程序是存储在磁盘上的可执行文件(二进制文件、脚本文件) 当执行程序时,系统会自动将该文件加载到内存中,在内存中的分布情况称为进程映像 从低地址到高地址的分区: text:代码段 data:数据段 bss:静态数据段 heap:堆 stack:栈,数组的话整体往下,成员往上 environ:环境变量表 argv:命令行参数 总结: 1、栈内存的增长方向受操作系统影响,大部分是从高地址向低地址增长,但也有些系统,例如Ubuntu就是从低地址向高地址增长* 2、如果是栈内存存储数据,数组元素的增长方向一定是从低地址向高地址 ps -aux 查看当前所有进程的详细信息,可以查看进程号,要程序一直运行,死循环 作业:打印出每个内存段中的数据所在的地址,然后与该进程的内存信息记录文件中的地址对比 /proc/进程号/maps 二、虚拟内存: 1、操作系统会为每个进程分配4G虚拟内存**8个1,4096MB 2、用户只能使用虚拟内存,不能直接使用物理内存 3、虚拟内存要与物理内存进行映射后才能被用户使用,虚拟内存经过内核到物理内存,如果使用了没有映射的虚拟内存(段错误)就会产生段错误 4、虚拟内存与物理内存的映射由操作系统(MMU)动态维护 arr[10],实际内存不一定连续 5、虚拟内存能让系统使用更安全,不会暴露真实的物理内存地址,另一方面,操作系统可以让进程使用比实际物理内存更大的地址空间 6、4G的虚拟内存地址分为两个部分 [0G~3G) 用户空间 [3G~4G) 内核空间 7、当进程/线程运行在用户空间时称进程处于用户态,当进程/线程运行在内核空间时称进程处于内核态 8、当进程处于内核态时,进程运行存储使用在内核空间,此时CPU可以发出任何指令,运行的代码不受任何限制,可以自由的访问任意有效的地址,也可以直接访问接口 9、当进程处于用户态时,进程运行存储在用户空间此时被执行的代码要受到CPU很多的检查,例如用户进程只能访问自己映射过的虚拟内存 10、所有进程的内核空间的代码数据都是映射在同一块物理内存中,由内核负责维护 11、用户空间的代码不能直接访问内核空间的代码和数据,可以通过系统调用(API调用系统接口函数)来切换到内核态间接的访问内核、与内核交换数据 映射虚拟内存与物理内存的函数: sbrk/brk/mmap/munmap 关于malloc获区虚拟内存空间的底层实现,跟libc.so版本有关 大概逻辑:1、如果分配的内存小于128k时,调用sbrk、brk 2、如果大于128k时,调用mmap,munmap 注意:系统映射内存是以页(一页=4096字节)为最小单位的 注意:sbrk、brk底层共同维护一个映射位置指针,该指针指向映射过的内存的下一个位置,或者说是未映射的内存的第一个位置 sbrk: void *sbrk(intptr_t increment); sbrk(4)/sbrk(-4) 功能:通过increment参数调整映射位置指针的位置,既可以映射内存也可以取消映射 increment:按字节为单位 0 获取当前指针的位置 >0 映射内存 原来位置指针的位置 映射内存 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |