zoukankan      html  css  js  c++  java
  • 《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段。
  • 相关阅读:
    第 9 章 类
    导入模块
    第 8 章 函数
    第七章 用户输入和while语句
    第六章 字典
    测试经理/组长职责
    测试的发展之路
    【转】测试流程
    一个网页通用的测试用例(借鉴他人的保存,加注释)
    QTP自动化测试框架简述
  • 原文地址:https://www.cnblogs.com/xuxianshen/p/13977218.html
Copyright © 2011-2022 走看看