多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 服務器 > Linux 進程內存模型 (2)

Linux 進程內存模型 (2)

來源:程序員人生   發布時間:2014-03-14 15:48:53 閱讀次數:2580次
接下來我們分析不同生存周期變量在進程空間的位置。
int x = 0x1234; // 全局初始化變量
char *s; // 全局未初始化變量

int test()
{
  static int i = 0x4567; // 靜態局部變量
  return ++i;
}

int main(int argc, char** argv)
{
  int i = test() + x; // i: 局部變量
  s = "Hello, World!";

  char* p = (char*)malloc(10); // 動態分配地址

  return 0;
}

在分析 ELF 文件結構時我們就已經知道全局變量和靜態局部變量在編譯期就決定了其內存地址。

$ readelf -s hello
Symbol table '.symtab' contains 84 entries:
  Num: Value Size Type Bind Vis Ndx Name
  ... ...
  50: 0804a024 4 OBJECT LOCAL DEFAULT 24 i.2347
  57: 0804a030 4 OBJECT GLOBAL DEFAULT 25 s
  65: 0804a020 4 OBJECT GLOBAL DEFAULT 24 x

$ readelf -S hello
There are 38 section headers, starting at offset 0x1a10:

Section Headers:
  [Nr] Name Type Addr Off Size ES Flg Lk Inf Al
  ... ...
  [16] .rodata PROGBITS 08048618 000618 000030 00 A 0 0 4
  [24] .data PROGBITS 0804a018 001018 000010 00 WA 0 0 4
  [25] .bss NOBITS 0804a028 001028 00000c 00 WA 0 0 4
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

通過對比相關段,我們可確定全局初始化變量和靜態局部變量被分配在 .data 中,而全局非初始化變量則分配在 .bss。可以用反匯編代碼驗證一下。

$ objdump -dS -M intel hello | less
int x = 0x1234;
char *s;

int test()
{
  ... ...
    static int i = 0x4567;
    return ++i;
  80484c7: mov eax,ds:0x804a024 ; 靜態局部變量 i (對照上面符號表) 地址 0x804a024, .data 段
  80484cc: add eax,0x1
  80484cf: mov ds:0x804a024,eax
  80484d4: mov eax,ds:0x804a024
}
  ... ...

080484db <main>:

int main(int argc, char** argv)
{
  ... ...
    int i = test() + x;
  80484e4: call 80484c4 <test>
  80484e9: mov edx,DWORD PTR ds:0x804a020 ; 全局初始化變量 x 地址 0x804a020, .data 段
  80484ef: add eax,edx
  80484f1: mov DWORD PTR [esp+0x1c],eax
    s = "Hello, World!";
  80484f5: mov DWORD PTR ds:0x804a030,0x8048620 ; 全局未初始化變量 s 地址 0x804a030, .bss 段
    ; 字符串 "Hello, World!" 地址 0x8048620, .rodata 段
  ... ...

接下來我們看看局部變量和 malloc 在堆上分配的情況。

(gdb) p &i ; main() 局部變量 i 地址
$2 = (int *) 0xbffff45c

(gdb) p p ; malloc 返回空間指針 p
$3 = 0x804b008 ""

(gdb) info proc mappings
Mapped address spaces:

  Start Addr End Addr Size Offset objfile
  0x804b000 0x806c000 0x21000 0 [heap]
  0xb7fef000 0xb7ff0000 0x1000 0
  0xb7ffe000 0xb8000000 0x2000 0
  0xbffeb000 0xc0000000 0x15000 0 [stack]

很顯然,局部變量 i 分配在 stack (0xBFFEB000 ~ 0xC0000000)。而 p 則是在 Heap (0x804B000 ~ 0x806C000) 上分配。

轉自:http://www.rainsts.net/

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 最近2019中文字幕最新 | 欧美一区精品 | 国产精品福利视频手机免费观看 | 精品卡通动漫在线观看视频一区 | 日韩欧美一级a毛片欧美一级 | 伊人中文在线 | 一区| 动漫毛片| 久久欧美精品欧美九久欧美 | 欧美成人午夜视频 | 国产乱码一区二区三区 | 日本xxx网站 | 欧美成人午夜做爰视频在线观看 | 日韩精品久久不卡中文字幕 | 69xxxx女人免费 | 国内成人乱小说 | 老司机一二三区福利视频 | 亚洲国产精品免费观看 | 欧美啪啪毛片一区二区 | 琪琪see色原网中文 琪琪理论影院2018中文版 | 亚洲精品视频在线看 | 国产欧美另类 | 一级毛片特级毛片国产 | 成人国产一区 | 性欧美精品 | 最近最新中文字幕1页 | 在线免费观看h视频 | 日产精品久久久一区二区 | 午夜dj高清中文免费观看 | 免费欧洲毛片a级视频无风险 | 久久xxx| 国产69精品久久久久9999 | 久久久久国产免费 | 日本啊啊啊| 国内精品综合九九久久精品 | 视频一区视频二区在线观看 | 一级做a爱过程免费视频超级 | 国产乱码一区二区三区四区 | 欧美最新一区二区三区四区 | 多人伦交性欧美在线观看 | 最近最新中文字幕免费大全 |