linux学习之虚拟地址

简介: linux学习之虚拟地址

在以往的学习中我们经常接触地址,电脑像一个小房间,它的空间是有限不可重叠的,但是可以覆盖。想象一下如果我们要放很多东西进去,如果没有合理的安排,所有东西乱放,那么我们需要寻找某一个东西的时候需要把房间找一个遍,也就是遍历,但是如果我们把房间的每一个地方都打上标签或者起个名字,然后把每个东西放在哪里记录下来放在一张纸上,我们就可以通过纸来快速定位物品。纸上写的物品信息,就是我们俗称的地址。但是我们有没有想过,我们接触的Linux地址有没有可能不是真正的地址,这就是我接下来要讲的东西了。

一,小代码测试

#include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
int g_val = 0;
int main()
 {
    pid_t id = fork();
    if(id < 0){
        perror("fork");
        return 0;
    }
    else if(id == 0){ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
        g_val=100;
        printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
    }else{ //parent
        sleep(3);
        printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
    }
    sleep(1);
    return 0;
}

当运行这段程序之后,我们会发现一个神奇的现象,父子进程g_val的地址居然一样,这是什么情况,一个地址能存储两个值?这不是违背了常识吗,难道是这个空间被分割了,一半储存父进程的值,一半存储子进程的值?

二,谜底揭晓

其实我们看到的并不是系统底层变量真正的地址,而是经过一定处理过后的地址,这个处理手段叫页表,页表里面会将我们所看到的地址转化为实际在电脑中的地址,看似两个g_val的地址一样,但实际经过页表的转化会变成不同的地址。从我查过的资料可得,页表里面首先会记录这个变量或者代码的实际存储范围,可能是由一段或者多段空间组成(指的是地址可能不连续),这段地址与我们看到的地址是对应关系,我们先看一张图来建立大概印象。

那这样子的好处是什么呢,不是多此一举吗?当然不是,首先我们要明白在系统中有时候能分配给我们的空间并不是连续的,如果我们程序员直接处理这些不连续的地址无疑会增加难度,也带来了很多不便,对于新手,地址的理解只会更加混乱,那怎么办呢?我们可不可以封装一下呢,当然可以,封装之后我们无法直接接触底层地址,大大降低了我们的学习难度,同时又能很好的利用碎片空间,也可以保护底层不被用户瞎篡改。

相关文章
|
1月前
|
NoSQL 关系型数据库 MySQL
Linux学习记录---(1、基本命令)
该博客文章提供了Linux系统中基本命令的使用记录,包括文件和目录操作、Redis服务管理、MySQL数据库操作以及Tomcat服务器的启动和检查。
Linux学习记录---(1、基本命令)
|
24天前
|
NoSQL Ubuntu Linux
Linux内核学习
Linux内核学习
45 3
|
18天前
|
Linux
使用qemu来学习Linux的休眠和唤醒
使用qemu来学习Linux的休眠和唤醒
|
18天前
|
Linux
linux内核原子操作学习
linux内核原子操作学习
|
18天前
|
Ubuntu Linux
用crash工具学习Linux内核 —— 查看cgroup_roots
用crash工具学习Linux内核 —— 查看cgroup_roots
|
18天前
|
Ubuntu Linux 调度
Linux内核学习
Linux内核学习
|
23天前
|
存储 人工智能 Ubuntu
Linux指令学习(一)
Linux指令学习(一)
53 0
|
28天前
|
Linux 持续交付 虚拟化
在Linux中,Docker和容器虚拟概念是什么?
在Linux中,Docker和容器虚拟概念是什么?
|
1月前
|
Linux 开发工具 C语言
如何在Arch Linux上构建Raspberry Pi虚拟环境
【8月更文挑战第18天】在Arch Linux中构建Raspberry Pi虚拟环境需先安装QEMU等工具,接着获取Raspberry Pi固件与内核。配置QEMU时,建立启动脚本指定硬件与软件参数,并设置执行权限。最后运行脚本即可启动虚拟环境。整个过程可能需要依据个人配置进行调试。确保拥有合法权限使用相关软件与固件。
|
2月前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
32 4