Linux下的进程虚拟内存结构是什么
这篇文章主要介绍“Linux下的进程虚拟内存结构是什么”,在日常操作中,相信很多人在Linux下的进程虚拟内存结构是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux下的进程虚拟内存结构是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
PostgreSQL使用进程架构,每个连接对应一个后台进程,为了更好的理解这种架构,有必要深入理解进程的相关知识
一、虚拟内存进程虚拟内存的详细结构如下图所示:
C样例程序如下:
#include<stdlib.h>#include<stdio.h>#include<string.h>/***f-printlocationsofvariouselements**Returns:nothing*/voidf(void)//子函数{inta;intb;intc;a=98;b=1024;c=a*b;printf("[f]a=%d,b=%d,c=a*b=%d\n",a,b,c);printf("[f]Adressesofa:%p,b=%p,c=%p\n",(void*)&a,(void*)&b,(void*)&c);}/***main-printlocationsofvariouselements**Return:EXIT_FAILUREifsomethingfailed.OtherwiseEXIT_SUCCESS*/intmain(intac,char**av,char**env){inta;//本地变量,位于栈中void*p;//指针,在堆中分配内存inti;intsize;printf("Addressofa:%p\n",(void*)&a);p=malloc(98);//在堆中分配内存if(p==NULL){fprintf(stderr,"Can'tmalloc\n");return(EXIT_FAILURE);}printf("Allocatedspaceintheheap:%p\n",p);printf("Addressoffunctionmain:%p\n",(void*)main);//main函数所在的内存地址printf("Firstbytesofthemainfunction:\n\t");for(i=0;i<15;i++){printf("%02x",((unsignedchar*)main)[i]);//首16个字节}printf("\n");printf("Addressofthearrayofarguments:%p\n",(void*)av);//输入参数数组地址printf("Addressesofthearguments:\n\t");//for(i=0;i<ac;i++){printf("[%s]:%p",av[i],av[i]);//打印输入参数}printf("\n");printf("Addressofthearrayofenvironmentvariables:%p\n",(void*)env);//环境变量地址printf("Addressofthefirstenvironmentvariables:\n");//环境变量信息for(i=0;i<3;i++){printf("\t[%p]:\"%s\"\n",env[i],env[i]);}/*sizeoftheenvarray*/i=0;while(env[i]!=NULL)//以NULL作为终结{i++;}i++;/*theNULLpointer*/size=i*sizeof(char*);printf("Sizeofthearrayenv:%delements->%dbytes(0x%x)\n",i,size,size);//计算环境变量数组大小f();//调用函数getchar();//接受输入,进程不退出return(EXIT_SUCCESS);}
编译并执行
[root@localhosthacker]#gcc-Wall-Wextra-Werrormain-7.c-o7[root@localhosthacker]#./7HelloHackerJack!Addressofa:0x7fff5b327bb8-->位于栈中Allocatedspaceintheheap:0x9b6010-->位于堆中Addressoffunctionmain:0x400729-->可执行文件Firstbytesofthemainfunction:554889e54883ec40897ddc488975d0Addressofthearrayofarguments:0x7fff5b327cb8-->参数数组地址Addressesofthearguments:[./7]:0x7fff5b329808[Hello]:0x7fff5b32980c[Hacker]:0x7fff5b329812[Jack!]:0x7fff5b329819-->输入参数Addressofthearrayofenvironmentvariables:0x7fff5b327ce0-->环境变量数组Addressofthefirstenvironmentvariables:[0x7fff5b32981f]:"XDG_SESSION_ID=1"[0x7fff5b329830]:"HOSTNAME=localhost.localdomain"[0x7fff5b32984f]:"SELINUX_ROLE_REQUESTED="Sizeofthearrayenv:27elements->216bytes(0xd8)[f]a=98,b=1024,c=a*b=100352[f]Adressesofa:0x7fff5b327b7c,b=0x7fff5b327b78,c=0x7fff5b327b74-->函数f中的变量地址
通过udis86可反编译,得到汇编代码
[root@localhostinstall]#echo"554889e54883ec10488d45f04889c6"|udcli-64-x-o400729000000000040072955pushrbp000000000040072a4889e5movrbp,rsp000000000040072d4883ec10subrsp,0x100000000000400731488d45f0learax,[rbp-0x10]00000000004007354889c6movrsi,rax[root@localhostinstall]#
查看该进程的内存映射信息
[root@localhostinstall]#psaux|grep"./7"|grep-vgreproot64710.00.04348348pts/0S+15:240:00./7HelloHackerJack![root@localhostinstall]#cat/proc/6471/maps00400000-00401000r-xp00000000fd:00134287606/data/source/hacker/700600000-00601000r--p00000000fd:00134287606/data/source/hacker/700601000-00602000rw-p00001000fd:00134287606/data/source/hacker/7009b6000-009d7000rw-p0000000000:000[heap]7f95b5d16000-7f95b5ed8000r-xp00000000fd:00151914/usr/lib64/libc-2.17.so7f95b5ed8000-7f95b60d8000---p001c2000fd:00151914/usr/lib64/libc-2.17.so7f95b60d8000-7f95b60dc000r--p001c2000fd:00151914/usr/lib64/libc-2.17.so7f95b60dc000-7f95b60de000rw-p001c6000fd:00151914/usr/lib64/libc-2.17.so7f95b60de000-7f95b60e3000rw-p0000000000:0007f95b60e3000-7f95b6105000r-xp00000000fd:00151907/usr/lib64/ld-2.17.so7f95b62f8000-7f95b62fb000rw-p0000000000:0007f95b6301000-7f95b6304000rw-p0000000000:0007f95b6304000-7f95b6305000r--p00021000fd:00151907/usr/lib64/ld-2.17.so7f95b6305000-7f95b6306000rw-p00022000fd:00151907/usr/lib64/ld-2.17.so7f95b6306000-7f95b6307000rw-p0000000000:0007fff5b309000-7fff5b32a000rw-p0000000000:000[stack]7fff5b3f1000-7fff5b3f3000r-xp0000000000:000[vdso]ffffffffff600000-ffffffffff601000r-xp0000000000:000[vsyscall][root@localhostinstall]#
到此,关于“Linux下的进程虚拟内存结构是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。