zoukankan      html  css  js  c++  java
  • 5. Linux应用程序地址布局

    5. Linux应用程序地址布局

    程序构成:

    在学习Linux应用程序开发时,经常会遇到如下概念:代码段、数据段、BSS段(Block Started by Symbol,又名:未初始化数据段) 、堆(heap)和栈(stack)。而这些部分也是构成Linux应用程序的重要组成部分。

    内存布局:

    当Linux应用程序在内存中运行的时候,以上组成部分在内存中布局:

    1. 从低地址到高地址分别为:代码段、数据段、BSS段、堆、栈。
    2. 堆向高内存地址生长。
    3. 栈向低内存地址生长。

    下面测试下面的程序:

    查看系统的线程:

    下面我们看这代码的地址分配:

    数据存放的地址:

    1. 代码段:代码,全局常量(const)、字符串常量。
    2. 数据段:全局变量(初始化以及未初始化的)、静态变量(全局的和局部的、初始化的以及未初始化的)。
    3. 堆:动态分配的区域
    4. 栈:局部变量(初始化以及未初始化的,但是不包括静态变量)、局部只读变量(const)。

    从上面的得知:代码段的起始地址是8048000.数据段起始地址8049000,堆的开始地址b77a5000,栈的起始地址bfb47000.

    分析数据存放位置:

    例子代码:

    #include <stdio.h>

    #include <stdlib.h>

    int global_init_a=1; //global init variable

    int global_uninit_a; //global uninit variable

    static int static_global_init_a=1;

    static int static_global_uninit_a;

    const int const_global_a=12;

    int global_init_b=2; //global init variable

    int global_uninit_b; //global uninit variable

    static int static_global_init_b=12;

    static int static_global_uninit_b;

    const int const_global_b=12;

    int main()

    {

        int local_init_a=1;

        int local_uninit_a;

        static int static_local_init_a=1;

        static int static_local_uninit_a;

        const int const_local_a=12;

        int local_init_b=1;

        int local_uninit_b;

        static int static_local_init_b=1;

        static int static_local_uninit_b;

        const int const_local_b=12;

        int * malloc_p_a;

        malloc_p_a=malloc(sizeof(int)); //

        printf("&global_init_a =%p ", &global_init_a);

        printf("&global_uninit_a =%p ", &global_uninit_a);

        printf("&static_global_init_a =%p ", &static_global_init_a);

        printf("&static_global_uninit_a =%p ", &static_global_uninit_a);

        printf("&const_global_a =%p ", &const_global_a);

        printf("&global_init_b =%p ", &global_init_b);

        printf("&global_uninit_b =%p ", &global_uninit_b);

        printf("&static_global_init_b =%p ", &static_global_init_b);

        printf("&static_global_uninit_b =%p ", &static_global_uninit_b);

        printf("&const_global_b =%p ", &const_global_b);

        printf("&local_init_a =%p ", &local_init_a);

        printf("&local_uninit_a =%p ", &local_uninit_a);

        printf("&static_local_init_a =%p ", &static_local_init_a);

        printf("&static_local_uninit_a =%p ", &static_local_uninit_a);

        printf("&const_local_a =%p ", &const_local_a);

        printf("&local_init_b =%p ", &local_init_b);

        printf("&local_uninit_b =%p ", &local_uninit_b);

        printf("&static_local_init_b =%p ", &static_local_init_b);

        printf("&static_local_uninit_b =%p ", &static_local_uninit_b);

        printf("&const_local_b =%p ", &const_local_b);

        printf("&malloc_p_a =%p ", &malloc_p_a);

        return 0;

    }

    分析BSS段:

    Bss段是数据段的一个子段。

  • 相关阅读:
    Linux文件编辑器 vi
    Sudo 和 Root 帐号
    Linux基本命令篇的习题解答
    Linux应用篇
    VMware中虚拟机网卡的四种模式
    Ubuntu游戏集合
    Linux与Window文件共享
    Linux知识点滴II
    [转载][翻译]jQuery Mobile教程创建一个订餐web应用(下)
    在WPF中创建带有刻度线的滑动条
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188604.html
Copyright © 2011-2022 走看看