我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux下的进程虚拟内存结构是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux下的进程虚拟内存结构是什么

这篇文章主要介绍“Linux下的进程虚拟内存结构是什么”,在日常操作中,相信很多人在Linux下的进程虚拟内存结构是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux下的进程虚拟内存结构是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

PostgreSQL使用进程架构,每个连接对应一个后台进程,为了更好的理解这种架构,有必要深入理解进程的相关知识

一、虚拟内存

进程虚拟内存的详细结构如下图所示:

Linux下的进程虚拟内存结构是什么

C样例程序如下:

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

void f(void)//子函数
{
     int a;
     int b;
     int c;
     a = 98;
     b = 1024;
     c = a * b;
     printf("[f] a = %d, b = %d, c = a * b = %d\n", a, b, c);
     printf("[f] Adresses of a: %p, b = %p, c = %p\n", (void *)&a, (void *)&b, (void *)&c);
}

int main(int ac, char **av, char **env)
{
     int a;//本地变量,位于栈中
     void *p;//指针,在堆中分配内存
     int i;
     int size;
     printf("Address of a: %p\n", (void *)&a);
     p = malloc(98);//在堆中分配内存
     if (p == NULL)
     {
          fprintf(stderr, "Can't malloc\n");
          return (EXIT_FAILURE);
     }
     printf("Allocated space in the heap: %p\n", p);
     printf("Address of function main: %p\n", (void *)main);//main函数所在的内存地址
     printf("First bytes of the main function:\n\t");
     for (i = 0; i < 15; i++)
     {
          printf("%02x ", ((unsigned char *)main)[i]);//首16个字节
     }
     printf("\n");
     printf("Address of the array of arguments: %p\n", (void *)av);//输入参数数组地址
     printf("Addresses of the arguments:\n\t");//
     for (i = 0; i < ac; i++)
     {
          printf("[%s]:%p ", av[i], av[i]);//打印输入参数
     }
     printf("\n");
     printf("Address of the array of environment variables: %p\n", (void *)env);//环境变量地址
     printf("Address of the first environment variables:\n");//环境变量信息
     for (i = 0; i < 3; i++)
     {
          printf("\t[%p]:\"%s\"\n", env[i], env[i]);
     }
     
     i = 0;
     while (env[i] != NULL)//以NULL作为终结
     {
          i++;
     }
     i++; 
     size = i * sizeof(char *);
     printf("Size of the array env: %d elements -> %d bytes (0x%x)\n", i, size, size);//计算环境变量数组大小
     f();//调用函数
     getchar();//接受输入,进程不退出
     return (EXIT_SUCCESS);
}

编译并执行

[root@localhost hacker]# gcc -Wall -Wextra -Werror main-7.c -o 7
[root@localhost hacker]# ./7 Hello Hacker Jack!
Address of a: 0x7fff5b327bb8 --> 位于栈中
Allocated space in the heap: 0x9b6010 --> 位于堆中
Address of function main: 0x400729 --> 可执行文件
First bytes of the main function:
    55 48 89 e5 48 83 ec 40 89 7d dc 48 89 75 d0 
Address of the array of arguments: 0x7fff5b327cb8 -->参数数组地址
Addresses of the arguments:
    [./7]:0x7fff5b329808 [Hello]:0x7fff5b32980c [Hacker]:0x7fff5b329812 [Jack!]:0x7fff5b329819 --> 输入参数
Address of the array of environment variables: 0x7fff5b327ce0 --> 环境变量数组
Address of the first environment variables:
    [0x7fff5b32981f]:"XDG_SESSION_ID=1"
    [0x7fff5b329830]:"HOSTNAME=localhost.localdomain"
    [0x7fff5b32984f]:"SELINUX_ROLE_REQUESTED="
Size of the array env: 27 elements -> 216 bytes (0xd8)
[f] a = 98, b = 1024, c = a * b = 100352 
[f] Adresses of a: 0x7fff5b327b7c, b = 0x7fff5b327b78, c = 0x7fff5b327b74 --> 函数f中的变量地址

通过udis86可反编译,得到汇编代码

[root@localhost install]#  echo "55 48 89 e5 48 83 ec 10 48 8d 45 f0 48 89 c6" | udcli -64 -x -o 400729
0000000000400729 55               push rbp                
000000000040072a 4889e5           mov rbp, rsp            
000000000040072d 4883ec10         sub rsp, 0x10           
0000000000400731 488d45f0         lea rax, [rbp-0x10]     
0000000000400735 4889c6           mov rsi, rax            
[root@localhost install]#

查看该进程的内存映射信息

[root@localhost install]# ps aux | grep "./7" | grep -v grep
root      6471  0.0  0.0   4348   348 pts/0    S+   15:24   0:00 ./7 Hello Hacker Jack!
[root@localhost install]# cat /proc/6471/maps
00400000-00401000 r-xp 00000000 fd:00 134287606                          /data/source/hacker/7
00600000-00601000 r--p 00000000 fd:00 134287606                          /data/source/hacker/7
00601000-00602000 rw-p 00001000 fd:00 134287606                          /data/source/hacker/7
009b6000-009d7000 rw-p 00000000 00:00 0                                  [heap]
7f95b5d16000-7f95b5ed8000 r-xp 00000000 fd:00 151914                     /usr/lib64/libc-2.17.so
7f95b5ed8000-7f95b60d8000 ---p 001c2000 fd:00 151914                     /usr/lib64/libc-2.17.so
7f95b60d8000-7f95b60dc000 r--p 001c2000 fd:00 151914                     /usr/lib64/libc-2.17.so
7f95b60dc000-7f95b60de000 rw-p 001c6000 fd:00 151914                     /usr/lib64/libc-2.17.so
7f95b60de000-7f95b60e3000 rw-p 00000000 00:00 0 
7f95b60e3000-7f95b6105000 r-xp 00000000 fd:00 151907                     /usr/lib64/ld-2.17.so
7f95b62f8000-7f95b62fb000 rw-p 00000000 00:00 0 
7f95b6301000-7f95b6304000 rw-p 00000000 00:00 0 
7f95b6304000-7f95b6305000 r--p 00021000 fd:00 151907                     /usr/lib64/ld-2.17.so
7f95b6305000-7f95b6306000 rw-p 00022000 fd:00 151907                     /usr/lib64/ld-2.17.so
7f95b6306000-7f95b6307000 rw-p 00000000 00:00 0 
7fff5b309000-7fff5b32a000 rw-p 00000000 00:00 0                          [stack]
7fff5b3f1000-7fff5b3f3000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
[root@localhost install]#

到此,关于“Linux下的进程虚拟内存结构是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux下的进程虚拟内存结构是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux进程虚拟内存的工作机制是什么

Linux进程的虚拟内存工作机制是基于分页和分段的。在Linux中,每个进程都有自己独立的虚拟地址空间,这个虚拟地址空间被分成多个固定大小的页(通常为4KB)。内核会将虚拟内存分为几个部分,包括代码段、数据段、栈段和堆段等。当进程访问虚拟
Linux进程虚拟内存的工作机制是什么
2024-04-28

Linux虚拟内存是什么

这篇“Linux虚拟内存是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux虚拟内存是什么”文章吧。虚拟内存由来毋
2023-06-27

linux中虚拟内存是什么

这篇文章主要为大家展示了“linux中虚拟内存是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux中虚拟内存是什么”这篇文章吧。1. 讨论虚拟内存前的热身我们需要知道的是计算机对内存分
2023-06-15

Java虚拟机的内存结构是怎样的

本篇内容主要讲解“Java虚拟机的内存结构是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java虚拟机的内存结构是怎样的”吧!一:简介内存(Memory)也被称为内存储器,其作用是用于暂
2023-06-02

linux的虚拟内存机制是什么

这篇“linux的虚拟内存机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux的虚拟内存机制是什么”文章吧。l
2023-07-01

Java虚拟机的体系结构和内存模型是什么

这篇文章主要介绍“Java虚拟机的体系结构和内存模型是什么”,在日常操作中,相信很多人在Java虚拟机的体系结构和内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java虚拟机的体系结构和内存模型
2023-06-17

Java虚拟机中JVM内存结构是怎么样的

这篇文章给大家分享的是有关Java虚拟机中JVM内存结构是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、JVM启动流程:JVM启动时,是由java命令/javaw命令来启动的。二、JVM基本结构:JV
2023-06-02

Linux进程共享内存的方法是什么

这篇文章主要讲解了“Linux进程共享内存的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux进程共享内存的方法是什么”吧!共享内存 IPC 原理共享内存进程间通信机制主要用
2023-06-28

JVM内存结构的三大块是什么

这篇文章主要介绍“JVM内存结构的三大块是什么”,在日常操作中,相信很多人在JVM内存结构的三大块是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM内存结构的三大块是什么”的疑惑有所帮助!接下来,请跟
2023-06-02

win7虚拟内存设置的方法是什么

这篇文章主要讲解了“win7虚拟内存设置的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win7虚拟内存设置的方法是什么”吧!win74g内存虚拟内存设置多少合适答:一般虚拟内存可
2023-07-01

Oracle数据库中的内存结构是什么

Oracle数据库中的内存结构主要包括SGA(System Global Area)和PGA(Program Global Area)两部分。SGA:SGA是Oracle数据库实例所使用的共享内存区域,用于存储整个数据库实例的共享数据和控制
Oracle数据库中的内存结构是什么
2024-03-02

win10虚拟内存最佳设置的方法是什么

为了设置Win10的最佳虚拟内存,您可以按照以下步骤进行操作:1. 打开“控制面板”:右键点击“开始”按钮,选择“控制面板”。2. 在控制面板中,选择“系统和安全”。3. 在“系统和安全”选项中,选择“系统”。4. 在系统面板中,选择“高级
2023-09-05

Linux创建虚拟机的流程是什么

1、安装虚拟化软件常见的虚拟化软件包括 VirtualBox、VMware 等。在 Linux 操作系统上安装虚拟化软件。2、创建虚拟机在虚拟化软件中,创建新的虚拟机实例。需要指定虚拟机的名称、操作系统类型、内存大小、磁盘空间大小等参数。3
2023-05-13

Linux容器技术与进程虚拟化技术是什么

Linux容器技术是一种操作系统层面的虚拟化技术,它通过利用Linux内核的命名空间和cgroups等功能,将应用程序及其依赖的库、配置等打包在一起,形成一个独立的运行环境,从而实现应用程序与其所在的主机系统隔离的目的。进程虚拟化技术是指
Linux容器技术与进程虚拟化技术是什么
2024-04-28

Linux进程冻结的方法是什么

本篇内容主要讲解“Linux进程冻结的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux进程冻结的方法是什么”吧!Linux休眠前需要先冻结所有进程,休眠唤醒后再解冻进程,驱动开
2023-06-27

linux结束进程的方法是什么

在Linux中,可以使用以下方法之一来结束进程:1. 使用kill命令:kill命令用于发送信号给指定进程。可以使用以下命令结束进程:```kill ```默认情况下,kill命令发送的是SIGTERM信号,这会请求进程正常退出。如果进程没
2023-08-25

Linux内核中的循环链表结构是什么

Linux内核中的循环链表结构是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文章中引用的代码来源于LXR,所分析的内核版本是v2.6.31。linux内核通过定义li
2023-06-17

Linux用户进程是怎么释放内存的

这篇文章主要讲解了“Linux用户进程是怎么释放内存的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux用户进程是怎么释放内存的”吧!Linux用户进程是如何释放内存的 Linux进程
2023-06-13

编程热搜

目录