Ptmalloc堆概述 Brk系統呼叫

2021-08-19 20:40:15 字數 3284 閱讀 1464

未初始化資料段末尾後的第乙個位置;

等於或超過此位址的地方均不可訪問;

增加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 竟然對越...