未初始化資料段末尾後的第乙個位置;
等於或超過此位址的地方均不可訪問;
增加program break可以為程序分配記憶體;
減少program break則釋放記憶體;
初始時,堆的起始位址
start_brk
以及堆的當前末尾
brk 指向同一位址。根據是否開啟
aslr
,兩者的具體位置會有所不同
l 不開啟 aslr 保護時,
start_brk
以及 brk
會指向
data/bss
段的結尾。
l 開啟 aslr 保護時,
start_brk
以及 brk
也會指向同一位置,只是這個位置是在
data/bss
段結尾後的隨機偏移處。
32位#define
__nr_brk
4564位
#define
__nr_brk
12引數:請求的中斷點
功能:對映記憶體,返回新的中斷點;
引數為0時,返回
program break
;失敗時,返回0;
注意:分配的堆是以頁為單位的。如果請求的中斷點不是頁邊界,則實際分配的會到頁邊界,而系統呼叫返回的中斷點仍然是期望的中斷點。
#include
int brk(void *addr);
void *sbrk(intptr_t increment);
brk函式
設定中斷點;
成功返回0,失敗返回-1;
sbrk函式
設定中斷點的增量;
成功返回0;失敗返回-1;
引數為0時,返回
program break
的當前位置
注意:ubuntu 16.04上好像有問題。使用sbrk函式獲取
program break
時,第一次呼叫時
heap
還沒有分配,後面的呼叫才是真正的
program break
。#include
#include
intmain()
millionsky@ubuntu-16:~/tmp/sbrk$ gcc -m32 x.c
millionsky@ubuntu-16:~/tmp/sbrk$ ./a.out
ptr=0x804b000
ptr=0x806c000
ptr=0x806c000
millionsky@ubuntu-16:~/tmp/sbrk$ gcc x.c
millionsky@ubuntu-16:~/tmp/sbrk$ ./a.out
ptr=0x602000
ptr=0x623000
ptr=0x623000
millionsky@ubuntu-16:~$ cat /proc/`pgrep a.out`/maps | grep heap
0804b000-0806c000 rw-p 00000000 00:00 0 [heap]
strace執行發現確實有分配
0x1000
的系統呼叫,但不知道為什麼被呼叫
millionsky@ubuntu-16:~/tmp$ strace ./a.out
brk(null) = 0x9c3e000
munmap(0xf76fb000, 109576) = 0
brk(null) = 0x9c3e000
fstat64(1, ) = 0
brk(0x9c5f000) = 0x9c5f000
write(1, "ptr=0x9c3e000\n", 14ptr=0x9c3e000
) = 14
brk.asm
sys_brk
equ45 sys_read
equ3 sys_write
equ4 sys_exit
equ1 std_in
equ0 std_out
equ1 sys_call
equ0x80
;0x80
section .data
hello:
db 'press any key!',
0 hellolen:
equ $-hello
section .bss
buf
resb
1; 1000-byte buffer (in data section)
section .text
global _start
_start:
movebx,
0 mov
eax, sys_brk
int sys_call
moveax,sys_write
; 'write' system call = 4
movebx,std_out
; file descriptor 1 = stdout
movecx,hello
; string to write
movedx,hellolen
; length of string to write
int sys_call
; call the kernel
movedx,
1; max length
movecx, buf
; buffer
movebx, std_in
; stdin
moveax, sys_read
; sys_read
int sys_call
moveax, sys_exit
movebx,
0 int sys_call
makefile
build:
nasm -felf32 brk.asm
ld -melf_i386 brk.o -o brk
gdb除錯,檢視系統呼叫的返回值;
或者檢視/proc/pid/maps
1. 深入理解程式設計使用linux組合語言
2.
ptmalloc原始碼閱讀 malloc chunk
記憶體管理不外乎三個層面,使用者管理層,c執行時庫層,作業系統層 目前輪子處於執行時庫層,製作這個輪子的目的是為了了解底層記憶體分配是如何實現的,後面肯定主要是實現使用者管理層。常見c記憶體管理程式 doug lea malloc doug lea malloc實際上是完整的一組分配程式,其中包括d...
glibc記憶體管理ptmalloc之基礎知識
2.1 x86 平台 linux 程序記憶體布局 linux 系統在裝載 elf 格式的程式檔案時,會呼叫 loader 把可執行檔案中的各個段依次載入到從某一位址開始的空間中 載入位址取決 link editor ld 和機器位址位數,在 32 位機器上是 0x8048000,即 128m 處 如...
堆排(大頂堆,小頂堆)
分類 資料結構 演算法相關 2009 10 15 12 26 2289人閱讀收藏 舉報汗,別人都說大小頂堆只是改改大於號的問題,可我的 從大頂堆只改動大於號調整為小頂堆竟然越界樂,掣肘!後來幾經更改才發現是傳參的問題 見 看來大頂堆改小頂堆不是 亦或是我rp出點問題?搞笑的是 磚頭 c b 竟然對越...