《CSAPP》(第3版)答案(第九章)
P11
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|
+--|--|--|--|--|--|--|--|--|--|--|--|--|--+
param |
value |
VPN |
0x09 |
TLBI |
0x01 |
TLBT |
0x02 |
hit? |
No |
page falut? |
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|
+--|--|--|--|--|--|--|--|--|--|--|--+
param |
value |
CO |
0x00 |
CI |
0x0F |
CT |
0x17 |
hit? |
No |
value |
----- |
P12
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|
+--|--|--|--|--|--|--|--|--|--|--|--|--|--+
param |
value |
VPN |
0x0E |
TLBI |
0x02 |
TLBT |
0x03 |
hit? |
No |
page falut? |
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|
+--|--|--|--|--|--|--|--|--|--|--|--+
param |
value |
CO |
0x01 |
CI |
0x0A |
CT |
0x11 |
hit? |
No |
value |
----- |
P13
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|
+--|--|--|--|--|--|--|--|--|--|--|--|--|--+
param |
value |
VPN |
0x01 |
TLBI |
0x01 |
TLBT |
0x00 |
hit? |
No |
page falut? |
Yes |
P14
#include <stdio.h>
#include <assert.h>
#include "csapp.h"
void test(char* filename, char* content) {
int fd;
char buf[20];
fd = Open(filename, O_RDONLY, 0);
Read(fd, buf, strlen(content));
assert( !strncmp(buf, content, strlen(content)) );
}
int touch(char* filename, char* content) {
int fd;
umask(DEF_UMASK);
fd = Open(filename, O_WRONLY|O_CREAT|O_TRUNC, DEF_MODE);
Write(fd, content, strlen(content));
Close(fd);
}
int main(int argc, char* argv[]) {
touch("hello.txt", "Hello, world!");
test("hello.txt", "Hello, world!");
struct stat stat;
int fd;
char* bufp;
size_t size;
fd = Open("hello.txt", O_RDWR, 0);
fstat(fd, &stat);
size = stat.st_size;
bufp = Mmap(NULL, size, PROT_WRITE, MAP_SHARED, fd, 0);
*bufp = 'J';
Munmap(bufp, size);
test("hello.txt", "Jello, world!");
return 0;
}
P15
malloc |
size |
header |
malloc(3) |
8 |
0x9 |
malloc(11) |
16 |
0x11 |
malloc(20) |
24 |
0x19 |
malloc(21) |
24 |
0x19 |
P16
alignment |
allocated block |
spare block |
min block size |
word |
Header & Footer |
Header & Footer |
16 |
word |
Header |
Header & Footer |
16 |
double word |
Header & Footer |
Header & Footer |
16 |
double word |
Header |
Header & Footer |
16 |
P17
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mm.h"
#include "memlib.h"
#define WSIZE 4
#define DSIZE 8
#define CHUNKSIZE (1<<12)
#define MAX(x, y) ((x) > (y)? (x) : (y))
#define PACK(size, alloc) ((size) | (alloc))
#define GET(p) (*(unsigned int *)(p))
#define PUT(p, val) (*(unsigned int *)(p) = (val))
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
static char *heap_listp = 0;
static char *rover;
static void *extend_heap(size_t words);
static void place(void *bp, size_t asize);
static void *find_fit(size_t asize);
static void *coalesce(void *bp);
static void printblock(void *bp);
static void checkheap(int verbose);
static void checkblock(void *bp);
int mm_init(void)
{
mem_init();
if ((heap_listp = mem_sbrk(4*WSIZE)) == (void *)-1)
return -1;
PUT(heap_listp, 0);
PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1));
PUT(heap_listp + (3*WSIZE), PACK(0, 1));
heap_listp += (2*WSIZE);
rover = heap_listp;
if (extend_heap(CHUNKSIZE/WSIZE) == NULL)
return -1;
return 0;
}
void *mm_malloc(size_t size)
{
size_t asize;
size_t extendsize;
char *bp;
if (heap_listp == 0){
mm_init();
}
if (size == 0)
return NULL;
if (size <= DSIZE)
asize = 2*DSIZE;
else
asize = DSIZE * ((size + (DSIZE) + (DSIZE-1)) / DSIZE);
if ((bp = find_fit(asize)) != NULL) {
place(</