【Linux】:程序地址空间

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序地址空间的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

​ 

目录

1. 程序地址空间分布 

2. 基于地址空间,重新理解地址

3. 进程地址空间

3.1 地址空间和区域划分

3.2 为什么要有地址空间? 

4. 基于地址空间进行扩展

4.1 每一个进程都有页表

4.2 缺页中断 

4.3 进程的独立性

5. 写时拷贝


1. 程序地址空间分布 

在C语言阶段就了解过这个图,那么本章来配合代码深入了解一下:

#include <stdio.h>
#include <stdlib.h>

int un_gval;
int init_gval = 100;

int main(int argc, char *argv[], char *env[])
{
    printf("code addr: %p\n", main);                     // 代码区

    const char *str = "HelloLinux!";
    printf("read only char addr: %p\n", str);            // 字符常量区

    printf("init global value addr: %p\n", &init_gval);  // 已初始化全局数据区
    printf("uninit global value addr: %p\n", &un_gval);  // 未初始化全局数据区

    char* heap = (char*)malloc(100);
    printf("heap addr: %p\n", heap);                     // 堆区

    printf("stack addr: %p\n", &str);                    // 栈区

    int i = 0;
    for(i = 0; argv[i]; i++)
    {
        printf("argv[%d]: %p\n",i, argv[i]);             // 命令行参数
    }

    for(i = 0; env[i]; i++)
    {
        printf("env[%d]: %p\n",i, env[i]);               // 环境变量
    }
    return 0;
}

​ 使用代码将对应区域的地址打印出来可以发现于图片完全一致。

① 在程序地址空间中的堆区是向上增长的,栈区是向下增长的,通常也叫做堆栈相对而生。

② 我们定义的任何类型(栈区中)都是整体向下开辟,使用时局部向上使用。

③ 在栈中定义的int类型变量是4个字节,我们要访问时,需要通过它的起始地址再配合它的类型大小进行访问,变量类型大小就相当于起始地址的偏移量,访问的形式就是起始地址 + 偏移量。

④ static修饰局部变量本质上就是将局部变量的地址放到了全局区(全局变量)。

2. 基于地址空间,重新理解地址

在之前的进程创建与进程fork本质章节中遗留了一个问题:如何理解同一个变量会有两个不同的指?

#include <stdio.h>
#include <stdlib.h>
#include <uni
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stackY、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值