• 《C语言笔记:linux下C程序的内存映像》


    一,内存图示
    二,各内存段的作用
    1,代码段、只读数据段
    • 对应着程序中的代码(函数),代码段在Linux中也叫做文本段(.text)
    • 只读数据段就是程序在运行时只能读不能写的数据,const修饰的常量就有可能存放在只读数据段。
    2,数据段、.bss段
    • 数据段存放,显示初始化为非0的全局变量和显示初始化为非0的静态局部变量。
    • .bss段存放,显示初始化为0或者未显示初始化的全局变量和显示初始化为0或者未显示初始化的静态局部变量。
    3,堆
    • 程序不会自动向堆中存放东西,堆的操作由程序员自己手工操作。需要的时候申请,使用时存放/读取数据,使用完释放。
    4,文件映射区
    • 程序从操作(读取/写入)硬盘中文件的中间人。
    5,栈区
    • 局部变量分配在栈区,函数调用传参过程也用到栈。
    6,内核映射区
    • 内核映射区就是将操作系统的内核程序映射到这个区域。
    • 对于Linux中的每一个进程来说,它都以为整个程序只有它自己和内核而已。它认为内存地址0xc0000000以下的都是它自己的活动空间,0xc0000000以上的是os内核的活动空间。
    • 每一个进程都活在自己独立的进程空间中,实际上0-3G的空间每一个进程都是不同的(虚拟地址技术),但内核是唯一的。
    三,OS下和裸机下C程序加载执行的差异
    1,C语言程序运行时环境有一定的要求,意思是单独个人写的C程序没法直接在内存中运行,需要外部一定的协助,这段协助的代码叫做加载运行代码。(或者叫构建C运行时环境的代码,这一段代码在操作系统下是别人写好的,会自动添加到程序上,这段代码的主要作用是给全局变量赋值,清.bss段)。
    2,数据段的全局变量或静态局部变量都是有非0的初值的,这些初值在重定位期间完成初始化,在main函数运行之前。
    3,裸机中需要在启动代码start.S中补齐重定位和清.bss段。
  • 相关阅读:
    【MongoDB详细使用教程】三、高级查询
    【MongoDB详细使用教程】二、MongoDB基本操作
    【MongoDB详细使用教程】一、Mac安装MongoDB
    【python数据分析实战】电影票房数据分析(二)数据可视化
    【python数据分析实战】电影票房数据分析(一)数据采集
    python爬取旅游数据+matplotlib简单可视化
    详解UDP协议
    MAC地址和交换机
    StringTable结构以及基本调优
    聊聊各种常量池
  • 原文地址:https://www.cnblogs.com/xuxianshen/p/13977218.html
Copyright © 2020-2023  润新知