brk의 매뉴얼을 살펴보면 brk, sbrk 는 현재 프로세스의 program break의 위치를 변경하는 함수임을 알 수 있다. Program break 는 Uninitialized Data Segment 이후의 가장 첫부분의 위치를 의미한다. brk와 sbrk 함수를 사용하여 데이터 세그먼트의 크기를 조정하여, 메모리 할당 효과를 내고 program break 를 감소시켜 메모리 할당해제 효과를 낸다.
brk와 sbrk의 차이점은 program break를 설정하는가 / 증가시키는가의 차이인 것을 알 수 있다.
또한 sbrk() 함수에 increment의 인자를 0으로 설정한 후 호출하게되면 현재 program break의 위치를 void* 형 포인터로 반환함을 알 수 있다.
brk는 ASLR기법이 활성화되어있을 때와, 비활성화 되어있을 때 차이가 있는데,
ASLR
ASLR (Address Space Layout Randomization) 메모리 보호 기법 중 하나로, 스택, 힙, 라이브러리, 등의 주소를 랜덤한 영역에 배치하여, 공격에 필요한 Target address를 예측하기 어렵게 만든다.
mmap
은 메모리의 내용을 파일이나 디바이스에 대응(mapping)하기 위해서 사용하는 시스템 호출이다. mmap 함수는 운영 체제가 가용한 가상 메모리 영역을 프로세스에 할당하고, 해당 영역을 파일 또는 장치와 매핑한다. 이렇게 매핑된 메모리는 일반적으로 sbrk 함수가 할당하는 heap 메모리와는 다른 가상 메모리 영역을 사용한다. 이는 일부 상황에서 더 효율적인 메모리 사용을 가능하게 한다. 예를 들어, 대용량 파일을 읽거나 쓰는 작업에서는 mmap
함수를 사용하여 파일을 메모리에 매핑하고 이를 직접 조작함으로써 더 빠른 속도를 얻을 수 있다.
mmap과 sbrk는 모두 메모리 할당에 사용되는 함수이지만, 그 목적과 동작 방식에서 차이가 있다.
sbrk 함수는 프로그램의 break 지점을 이동시켜 메모리를 할당하거나 해제하기 때문에, heap 메모리의 크기를 동적으로 조정할 수 있다. 그에 반해, mmap 함수는 파일이나 장치와 메모리를 매핑하므로, 매핑된 파일이나 장치의 크기에 따라 메모리 크기가 정해지며, 이를 동적으로 조정할 수 없다.