
매크로 구현
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE((char *)(bp) - DSIZE))
테스트 케이스 설정
bp = 0x1010 (현재 블록 페이로드 시작)
size = 24B (현재 블록 전체 크기: 헤더 4B + 페이로드 16B + 풋터 4B)
prev_size = 16B (이전 블록 전체 크기)
전체 메모리 배치
주소 내용 값
────────────────────────────────────────────────────────────
0x1000 이전 블록 헤더 PACK(16, 1) = 17
0x1004 이전 블록 페이로드 시작 (8B)
0x1008 이전 블록 풋터 PACK(16, 1) = 17
────────────────────────────────────────────────────────────
0x100C 현재 블록 헤더 PACK(24, 0) = 24
0x1010 현재 블록 페이로드 시작 ← bp
0x1020 현재 블록 풋터 PACK(24, 0) = 24
────────────────────────────────────────────────────────────
0x1024 다음 블록 헤더
0x1028 다음 블록 페이로드 시작
────────────────────────────────────────────────────────────
HDRP(bp) - 헤더 주소
HDRP(bp) = (char *)(bp) - WSIZE
계산 과정
bp = 0x1010
WSIZE = 4
HDRP(bp) = 0x1010 - 4 = 0x100C
메모리에서 확인
0x100C [ PACK(24, 0) = 24 ] ← HDRP(bp) 가 가리키는 곳
0x1010 [ 페이로드 시작 ] ← bp
헤더는 페이로드 바로 앞 4바이트이다. bp - WSIZE(4)를 하면 항상 현재 블록의 헤더를 가리킨다.
FTRP(bp) - 풋터 주소
FTRP(bp) = (char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE
계산 과정
bp = 0x1010
① HDRP(bp) = 0x100C
② GET_SIZE(0x100C) = 24 & ~7 = 24 ← 현재 블록 크기
③ FTRP(bp) = 0x1010 + 24 - 8
= 0x1010 + 16
= 0x1020
왜 DSIZE(8)을 빼는가?
bp + size = 0x1028 ← 다음 블록 페이로드 시작
bp + size - 4 = 0x1024 ← 다음 블록 헤더
bp + size - 8 = 0x1020 ← 현재 블록 풋터 ✓ (DSIZE = 8)
메모리에서 확인
0x100C [ PACK(24, 0) = 24 ] ← HDRP(bp)
0x1010 [ 페이로드 시작 ] ← bp
...
0x1020 [ PACK(24, 0) = 24 ] ← FTRP(bp) 가 가리키는 곳
0x1024 [ 다음 블록 헤더 ]
NEXT_BLKP(bp) - 다음 블록 페이로드 주소
NEXT_BLKP(bp) = (char *)(bp) + GET_SIZE(HDRP(bp))
계산 과정
bp = 0x1010
① HDRP(bp) = 0x100C
② GET_SIZE(0x100C) = 24 ← 현재 블록 크기
③ NEXT_BLKP(bp) = 0x1010 + 24 = 0x1028
왜 bp + size가 다음 블록 페이로드인가?
현재 블록:
헤더(4B) 0x100C ~ 0x100F
페이로드 0x1010 ~ 0x101F ← bp 기준, size = 24 → 24B 차지
풋터(4B) 0x1020 ~ 0x1023
다음 블록:
헤더(4B) 0x1024 ~ 0x1027
페이로드 0x1028 ~ ← bp + 24 = 0x1028 ✓
메모리에서 확인
0x1010 [ 페이로드 시작 ] ← bp
...
0x1020 [ 현재 블록 풋터 ]
0x1024 [ 다음 블록 헤더 ]
0x1028 [ 다음 페이로드 시작] ← NEXT_BLKP(bp) 가 가리키는 곳
PREV_BLKP(bp) - 이전 블록 페이로드 주소
PREV_BLKP(bp) = (char *)(bp) - GET_SIZE((char *)(bp) - DSIZE)
계산 과정
bp = 0x1010
① bp - DSIZE(8) = 0x1010 - 8 = 0x1008 ← 이전 블록 풋터 주소
② GET_SIZE(0x1008) = 17 & ~7 = 16 ← 이전 블록 크기
③ PREV_BLKP(bp) = 0x1010 - 16 = 0x1000
왜 bp - DSIZE가 이전 블록 풋터인가?
0x1008 [ 이전 블록 풋터 PACK(16,1) = 17 ] ← bp - 8 = 0x1008
0x100C [ 현재 블록 헤더 PACK(24,0) = 24 ] ← bp - 4 = 0x100C
0x1010 [ 현재 블록 페이로드 시작 ] ← bp
bp - 4 = 현재 블록 헤더
bp - 8 = 이전 블록 풋터 ✓ (DSIZE = 8이므로 bp - DSIZE)
왜 헤더로 직접 가지 않고 풋터를 통하는가?
bp에서 이전 블록 헤더로 가려면 이전 블록 크기를 알아야 함
→ 이전 블록 크기를 모르면 얼마나 뒤로 가야 할지 모름
풋터를 쓰면:
① bp - 8 = 이전 블록 풋터 (항상 고정된 위치)
② 풋터에서 크기를 읽음 GET_SIZE → 16
③ 그 크기만큼 뒤로 이동 0x1010 - 16 = 0x1000
메모리에서 확인
0x1000 [ 이전 페이로드 시작 ] ← PREV_BLKP(bp) 가 가리키는 곳
...
0x1008 [ 이전 블록 풋터 = 17] ← bp - 8 에서 크기(16) 읽음
0x100C [ 현재 블록 헤더 ]
0x1010 [ 현재 페이로드 시작 ] ← bp
전체 결과 한눈에 보기
주소 내용 관련 매크로 결과
──────────────────────────────────────────────────────────────
0x1000 이전 블록 페이로드 시작 ← PREV_BLKP(0x1010) = 0x1000
0x100C 이전 블록 풋터 (size=16)
──────────────────────────────────────────────────────────────
0x100C 현재 블록 헤더 (size=24) ← HDRP(0x1010) = 0x100C
0x1010 현재 블록 페이로드 시작 ← bp
0x1020 현재 블록 풋터 (size=24) ← FTRP(0x1010) = 0x1020
──────────────────────────────────────────────────────────────
0x1024 다음 블록 헤더
0x1028 다음 블록 페이로드 시작 ← NEXT_BLKP(0x1010) = 0x1028
──────────────────────────────────────────────────────────────
요약
bp = 0x1010 기준
HDRP(bp) = bp - 4 = 0x100C ← 현재 블록 헤더
FTRP(bp) = bp + size - 8 = 0x1020 ← 현재 블록 풋터
NEXT_BLKP(bp) = bp + size = 0x1028 ← 다음 블록 페이로드
PREV_BLKP(bp) = bp - prev_size = 0x1000 ← 이전 블록 페이로드
↑
이전 블록 풋터(bp-8)에서 크기(16)를 읽어 역방향 이동반응형
