malloc使用的系統呼叫

2021-09-02 02:16:17 字數 4050 閱讀 6779

看本文章之前,你應該知道malloc使用系統呼叫獲取記憶體。正如下圖中所展示的,malloc呼叫brkmmap系統呼叫去獲取記憶體。

brk

brk通過增加程brk的位置從核心中獲取記憶體(沒有被0初始化)。開始的時候,堆的初始位置(start_brk)和結束位置(brk)指向相同的位置。

上面的程序虛擬位址布局-展示了start_brk就是堆(heap)段的開始處,brk(program break)就是堆結束處。

例項:

/* sbrk 和 brk 例子 */

#include #include #include int main()

輸出分析:

在增加程式break之前,通過下面的觀察我們可以看到沒有heap段,因而,start_brk = brk = end_data = 0x804b000.

sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$ ./sbrk 

welcome to sbrk example:6141

program break location1:0x804b000

...sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$ cat /proc/6141/maps

...0804a000-0804b000 rw-p 00001000 08:01 539624 /home/sploitfun/ptmalloc.ppt/syscalls/sbrk

b7e21000-b7e22000 rw-p 00000000 00:00 0

...sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$

增加之後,通過下面的輸出我們可以看到heap已經有了,因而,start_brk = end_data = 0x804b000brk = 0x804c000.

sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$ ./sbrk 

welcome to sbrk example:6141

program break location1:0x804b000

program break location2:0x804c000

...sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$ cat /proc/6141/maps

...0804a000-0804b000 rw-p 00001000 08:01 539624 /home/sploitfun/ptmalloc.ppt/syscalls/sbrk

0804b000-0804c000 rw-p 00000000 00:00 0 [heap]

b7e21000-b7e22000 rw-p 00000000 00:00 0

...sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$

在這裡,

mmap:

malloc使用mmap建立私有對映記憶體段。目的就是申請一段新記憶體(0填充),這段記憶體將由呼叫的程序專用。

示例:

/* 使用mmap系統呼叫建立私有記憶體 */

#include #include #include #include #include #include #include void static inline errexit(const char* msg)

int main()

輸出分析:

在mmap之前,通過下面的輸出,我們只能看到屬於共享庫libc.sold-linux.so的記憶體對映:

sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$ cat /proc/6067/maps

08048000-08049000 r-xp 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap

08049000-0804a000 r--p 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap

0804a000-0804b000 rw-p 00001000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap

b7e21000-b7e22000 rw-p 00000000 00:00 0

...sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$

在mmap之後,通過觀察我們可以看到記憶體對映段(b7e00000-b7e22000,大小為我們設定的132k)和本就已經存在的記憶體對映(b7e21000-b7e22000)組合起來了:

sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$ cat /proc/6067/maps

08048000-08049000 r-xp 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap

08049000-0804a000 r--p 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap

0804a000-0804b000 rw-p 00001000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap

b7e00000-b7e22000 rw-p 00000000 00:00 0

...sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$

在這兒,

在munmap之後,通過下面的輸出,我們的記憶體對映段已經被返回給作業系統了。

sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$ cat /proc/6067/maps

08048000-08049000 r-xp 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap

08049000-0804a000 r--p 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap

0804a000-0804b000 rw-p 00001000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap

b7e21000-b7e22000 rw-p 00000000 00:00 0

...sploitfun@sploitfun-virtualbox:~/ptmalloc.ppt/syscalls$

注意,在我們的程式中aslr被關閉。

在頻繁呼叫的底層函式中使用malloc的影響分析

近來,測試中發現乙個問題,ipcam會自動重啟。經過定位,是增加了乙個外部i2c timer作為看門狗引起的。看了ex wdt keep alive的code後發現,呼叫了乙個i2c writebytes 函式,這個func中呼叫了兩次malloc申請記憶體,並且,對malloc分配的 指標未作nu...

malloc 函式的使用

c語言中malloc是動態記憶體分配函式。函式原型 void malloc unsigned int num bytes 引數 num bytes 是無符號整型,用於表示分配的位元組數。返回值 如果分配成功則返回指向被分配記憶體的指標 此儲存區中的初始值不確定 否則返回空指標null。void 表示...

system系統呼叫的使用

system 系統呼叫在應用中很廣泛 可以直接在c 中呼叫命令,執行一些特殊操作,用法如下.1.直接執行命令 可以在c檔案中直接執行命令,這是基本用法,例如 system mkdir test system chmod 777 test.bin 等等 2.如果需要執行的命令是變動的,則可以使用字串變...