13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
参数 |
值 |
VPN |
0x09 |
TLB索引 |
0x01 |
TLB标记 |
0x02 |
TLB命中 |
No |
缺页 |
No |
PPN |
0x17 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
参数 |
值 |
字节偏移 |
0x0 |
缓存索引 |
0xF |
缓存标记 |
0x17 |
缓存命中 |
No |
返回缓存字节 |
- |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
参数 |
值 |
VPN |
0x0E |
TLB索引 |
0x02 |
TLB标记 |
0x03 |
TLB命中 |
No |
缺页 |
No |
PPN |
0x11 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
参数 |
值 |
字节偏移 |
0x1 |
缓存索引 |
0xA |
缓存标记 |
0x11 |
缓存命中 |
No |
返回缓存字节 |
- |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
参数 |
值 |
VPN |
0x01 |
TLB索引 |
0x01 |
TLB标记 |
0x00 |
TLB命中 |
No |
缺页 |
Yes |
PPN |
- |
#include
#include
#include
#include
#include
int main()
{
int fd;
char *start;
fd = open("hello.txt", O_RDWR, 0); //打开文件
start = mmap(NULL, 1, PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
if(start == MAP_FAILED) return -1;//判断是否映射成功
(*start) = 'J';
munmap(start, 1);
return 0;
}
请求 |
块大小 |
块头部 |
malloc(3) |
8 |
0x9 |
malloc(11) |
16 |
0x11 |
malloc(20) |
24 |
0x19 |
malloc(21) |
32 |
0x21 |
static void *find_fit(size_t asize)
{
void *bp = cur_point;
do{
if( !GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp))) )
return cur_point = bp;
bp = (GET_SIZE(HDRP(bp)) == 0) ? heap_listp : NEXT_BLKP(bp);
}while(bp != cur_point);
return NULL;
}
else if (!prev_alloc && next_alloc) { /* Case 3 */
size += GET_SIZE(HDRP(PREV_BLKP(bp)));
PUT(FTRP(bp), PACK(size, 0));
PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));
if(cur_point == bp) cur_point = PREV_BLKP(bp);
bp = PREV_BLKP(bp);
}
else { /* Case 4 */
size += GET_SIZE(HDRP(PREV_BLKP(bp))) +
GET_SIZE(FTRP(NEXT_BLKP(bp)));
PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));
PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0));
if(cur_point == bp) cur_point = PREV_BLKP(bp);
bp = PREV_BLKP(bp);
}
#include
#include
#include
#define MAX_HEAP (1<<24)
/* Private global variables */
static char *mem_heap; /* Points to first byte of heap */
static char *mem_brk; /* Points to last byte of heap plus 1 */
static char *mem_max_addr; /* Max legal heap addr plus 1*/
/*
* mem_init - Initialize the memory system model
*/
void mem_init(void)
{
mem_heap = (char *)malloc(MAX_HEAP);
mem_brk = (char *)mem_heap;
mem_max_addr = (char *)(mem_heap + MAX_HEAP);
}
/*
* mem_sbrk - Simple model of the sbrk function. Extends the heap
* by incr bytes and returns the start address of the new area. In
* this model, the heap cannot be shrunk.
*/
void *mem_sbrk(int incr)
{
char *old_brk = mem_brk;
if ( (incr < 0) || ((mem_brk + incr) > mem_max_addr)) {
errno = ENOMEM;
fprintf(stderr, "ERROR: mem_sbrk failed. Ran out of memory...\n");
return (void *)-1;
}
mem_brk += incr;
return (void *)old_brk;
}
void mem_end(void)/*added by zhanyu*/
{
free(mem_heap);
}
#include
/* Basic constants and macros */
#define WSIZE 4 /* Word and header/footer size (bytes) */
#define DSIZE 8 /* Double word size (bytes) */
#define CHUNKSIZE (1<<12) /* Extend heap by this amount (bytes) */
#define MAX(x, y) ((x) > (y)? (x) : (y))
/* Pack a size and allocated bit into a word */
//#define PACK(size, alloc) ((size) | (alloc))
#define PACK(size, prev_alloc, alloc) ((size)|(prev_alloc<<1)|(alloc))
/* Read and write a word at address p */
#define GET(p) (*(unsigned int *)(p))
#define PUT(p, val) (*(unsigned int *)(p) = (val))
/* Read the size and allocated fields from address p */
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
#define GET_PREVALLOC(p) ((GET(p) & 0x2)>>1)
/* Given block ptr bp, compute address of its header and footer */
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
/* Given block ptr bp, compute address of next and previous blocks */
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
typedef unsigned size_t;
int mm_init(void);
static void *extend_heap(size_t words);
void *mm_malloc(size_t size);
void mm_free(void *bp);
static void *coalesce(void *bp);
static void *find_fit(size_t asize);
static void place(void *bp, size_t asize);
void mm_end(); /*added by zhanyu*/
extern void *mem_sbrk(int incr); //memlib.c
extern void mem_init(void); //memlib.c
extern void mem_end(void); //memlib.c
void *heap_listp;
int mm_init(void)
{
mem_init(); /* added by zhanyu */
/* Create the initial empty heap */
if ((heap_listp = mem_sbrk(4*WSIZE)) == (void *)-1) return -1;
PUT(heap_listp, 0); /* Alignment padding */
PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1, 1)); /* Prologue header */
PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1, 1)); /* Prologue footer */
PUT(heap_listp + (3*WSIZE), PACK(0, 1, 1)); /* Epilogue header */
heap_listp += (2*WSIZE);
/* Extend the empty heap with a free block of CHUNKSIZE bytes */
if (extend_heap(CHUNKSIZE/WSIZE) == NULL) return -1;
return 0;
}
static void *extend_heap(size_t words)
{
char *bp;
size_t size;
int prev_alloc;
/* Allocate an even number of words to maintain alignment */
size = (words % 2) ? (words+1) * WSIZE : words * WSIZE;
if ((long)(bp = mem_sbrk(size)) == -1) return NULL;
prev_alloc = GET_PREVALLOC(HDRP(bp));
/* Initialize free block header/footer and the epilogue header */
PUT(HDRP(bp), PACK(size, prev_alloc, 0)); /* Free block header */
PUT(FTRP(bp), PACK(size, prev_alloc, 0)); /* Free block footer */
PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 0, 1)); /* New epilogue header, the prev_alloc is 0*/
/* Coalesce if the previous block was free */
return coalesce(bp);
}
void mm_free(void *bp)
{
size_t size = GET_SIZE(HDRP(bp));
size_t nsize = GET_SIZE(HDRP(NEXT_BLKP(bp)));
int prev_alloc = GET_PREVALLOC(HDRP(bp));
int next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(bp), PACK(size, prev_alloc, 0));
PUT(FTRP(bp), PACK(size, prev_alloc, 0));
PUT(HDRP(NEXT_BLKP(bp)), PACK(nsize, 0, next_alloc));
if(!next_alloc) PUT(FTRP(NEXT_BLKP(bp)), PACK(nsize, 0, next_alloc));
coalesce(bp);
}
static void *coalesce(void *bp)
{
size_t prev_alloc = GET_PREVALLOC(HDRP(bp));
size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
size_t size = GET_SIZE(HDRP(bp));
if (prev_alloc && next_alloc) { /* Case 1 */
return bp;
}
else if (prev_alloc && !next_alloc) { /* Case 2 */
size += GET_SIZE(HDRP(NEXT_BLKP(bp)));
PUT(HDRP(bp), PACK(size, 1, 0));
PUT(FTRP(bp), PACK(size, 1, 0));
/**then the next block is surely nonempty and it's prev_alloc is 0*/
}
else if (!prev_alloc && next_alloc) { /* Case 3 */
/*the prev prev block is surely nonempty*/
size += GET_SIZE(HDRP(PREV_BLKP(bp)));
PUT(FTRP(bp), PACK(size, 1, 0));
PUT(HDRP(PREV_BLKP(bp)), PACK(size, 1, 0));
bp = PREV_BLKP(bp);
}
else { /* Case 4 */
/*the prev prev block is surely nonempty*/
size += GET_SIZE(HDRP(PREV_BLKP(bp))) +
GET_SIZE(FTRP(NEXT_BLKP(bp)));
PUT(HDRP(PREV_BLKP(bp)), PACK(size, 1, 0));
PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 1, 0));
bp = PREV_BLKP(bp);
/**then the next block is surely nonempty and it's prev_alloc is 0*/
}
return bp;
}
static void *find_fit(size_t asize)
{
// First fit search
void *bp;
for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)) {
if (!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp))))
return bp;
}
return NULL; // No fit
}
void *mm_malloc(size_t size)
{
size_t asize; /* Adjusted block size */
size_t extendsize; /* Amount to extend heap if no fit */
char *bp;
/* Ignore spurious requests */
if (size == 0) return NULL;
/* Adjust block size to include overhead and alignment reqs. */
if (size <= DSIZE) asize = DSIZE;
else asize = DSIZE * ((size + (WSIZE) + (DSIZE-1)) / DSIZE);
/* Search the free list for a fit */
if ((bp = find_fit(asize)) != NULL) {
place(bp, asize);
return bp;
}
/* No fit found. Get more memory and place the block */
extendsize = MAX(asize,CHUNKSIZE);
if ((bp = extend_heap(extendsize/WSIZE)) == NULL) return NULL;
place(bp, asize);
return bp;
}
static void place(void *bp, size_t asize)
{
size_t csize = GET_SIZE(HDRP(bp));
size_t nsize = GET_SIZE(HDRP(NEXT_BLKP(bp)));
int prev_alloc = GET_PREVALLOC(HDRP(bp));
int next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
if ((csize - asize) >= (2*DSIZE)) {
PUT(HDRP(bp), PACK(asize, prev_alloc, 1));
PUT(FTRP(bp), PACK(asize, prev_alloc, 1));
bp = NEXT_BLKP(bp);
PUT(HDRP(bp), PACK(csize-asize, 1, 0));
PUT(FTRP(bp), PACK(csize-asize, 1, 0));
}
else {
PUT(HDRP(bp), PACK(csize, prev_alloc, 1));
PUT(HDRP(NEXT_BLKP(bp)), PACK(nsize, 1, next_alloc));
}
}
void mm_end() /*added by zhanyu*/
{
mem_end();
}