日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 /proc/pid/maps 中查看进程堆内存详情 )

發布時間:2025/6/17 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 /proc/pid/maps 中查看进程堆内存详情 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、sbrk 內存分配系統調用代碼示例
  • 二、在 /proc/pid/maps 中查看進程堆內存詳情


本篇博客調用 sbrk 系統調用函數 , 申請并修改 堆內存 , 并在 /proc/pid/maps 中查看該進程的 堆內存 ;





一、sbrk 內存分配系統調用代碼示例



sbrk 系統調用函數 , 作用是 修改程序 BSS 段大小 ;

函數原型如下 :

#include <unistd.h> int brk(void *addr); void *sbrk(intptr_t increment);

函數執行成功 , 返回一個指向 " 堆內存 " 的指針 ;

函數執行失敗 , 返回 (void*)-1 返回值 ;


內存地址查找 : 先獲取 當前運行的 進程 ID , 也就是 PID , 然后根據 PID 找到 內存地址 ; 如果進程退出 , 也就獲取不到 進程的 信息了 , 這里需要有一個死循環 , 保證進程一直存活 ;

// 此處死循環阻塞, 方便查看 /proc/pid/maps 中的信息// 進程退出后 , 進程相關內存信息也會同時銷毀while (1);

完整代碼示例 :

#include <stdio.h> #include <stdlib.h> #include <unistd.h>int main(int argc, char* argv[]) {// 使用 sbrk 系統調用申請 堆內存int *p = sbrk(0);// 記錄該堆內存地址int *p_old = p;// 繼續為 申請的堆內存, 申請 1024 字節內存p = sbrk(1024);// 打印進程 ID , PID printf("pid : %d\n", getpid());// 打印 申請的 堆內存地址 , 發現地址沒有變化printf("p_old : %p \np : %p \n", p_old, p);// 申請新的 堆內存int *p_new = sbrk(0);// 打印新的 堆內存地址printf("p_new : %p\n", p_new);// 此處死循環阻塞, 方便查看 /proc/pid/maps 中的信息// 進程退出后 , 進程相關內存信息也會同時銷毀while (1);return 0; }

函數打印結果 :

han@ubuntu:~/vscode/memory$ gcc memory.c han@ubuntu:~/vscode/memory$ ./a.out pid : 4829 p_old : 0x203e000 p : 0x203e000 p_new : 0x2060000

進程 ID 為 482948294829 ;

sbrk 返回的指針 p , 在第二次申請內存時 , 指針始終沒有改變 , 一直都是 0x203e000 地址 ;

如果使用新的指針 p_new 接收 sbrk 系統調用返回的堆內存指針 , 則分配的是新的地址 ;





二、在 /proc/pid/maps 中查看進程堆內存詳情



在上一節 , 已經打印出進程的 PID 為 482948294829 , 根據該 PID , 可以直接獲取該進程的內存情況 ,

執行

cat /proc/4829/maps

命令 , 可以打印出指定進程 ID 的內存映射情況 , 打印結果如下 :

han@ubuntu:~/vscode/memory$ cat /proc/4829/maps 00400000-00401000 r-xp 00000000 08:01 3147969 /home/han/vscode/memory/a.out 00600000-00601000 r--p 00000000 08:01 3147969 /home/han/vscode/memory/a.out 00601000-00602000 rw-p 00001000 08:01 3147969 /home/han/vscode/memory/a.out 0203e000-02060000 rw-p 00000000 00:00 0 [heap] 7f3534a9f000-7f3534c5f000 r-xp 00000000 08:01 1723650 /lib/x86_64-linux-gnu/libc-2.23.so 7f3534c5f000-7f3534e5f000 ---p 001c0000 08:01 1723650 /lib/x86_64-linux-gnu/libc-2.23.so 7f3534e5f000-7f3534e63000 r--p 001c0000 08:01 1723650 /lib/x86_64-linux-gnu/libc-2.23.so 7f3534e63000-7f3534e65000 rw-p 001c4000 08:01 1723650 /lib/x86_64-linux-gnu/libc-2.23.so 7f3534e65000-7f3534e69000 rw-p 00000000 00:00 0 7f3534e69000-7f3534e8f000 r-xp 00000000 08:01 1723642 /lib/x86_64-linux-gnu/ld-2.23.so 7f3535074000-7f3535077000 rw-p 00000000 00:00 0 7f353508e000-7f353508f000 r--p 00025000 08:01 1723642 /lib/x86_64-linux-gnu/ld-2.23.so 7f353508f000-7f3535090000 rw-p 00026000 08:01 1723642 /lib/x86_64-linux-gnu/ld-2.23.so 7f3535090000-7f3535091000 rw-p 00000000 00:00 0 7ffc4ac84000-7ffc4aca5000 rw-p 00000000 00:00 0 [stack] 7ffc4ad19000-7ffc4ad1d000 r--p 00000000 00:00 0 [vvar] 7ffc4ad1d000-7ffc4ad1f000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] han@ubuntu:~/vscode/memory$

第一次使用 sbrk 申請的內存地址是 0x203e000 ,

第二次還是為 p 指針申請內存 , 實際上是修改 " 堆內存 " 大小 , 其指針的首地址不變 , 是 0x203e000 ;

第三次調用 sbrk 申請的是新的內存 , 地址是 0x2060000 ;


在 /proc/4829/maps 文件中 , 堆內存的區域是 0203e000-02060000 , 與打印出的值相對應 ;

0203e000-02060000 rw-p 00000000 00:00 0 [heap]

總結

以上是生活随笔為你收集整理的【Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 /proc/pid/maps 中查看进程堆内存详情 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。