《CSAPP》(第3版)答案(第九章)

本文提供了计算机科学与应用基础(CSAPP)第三版第九章的习题答案,包括P11至P20各题的详细解答,涵盖了内存结构和虚拟机管理等相关知识点。
摘要由CSDN通过智能技术生成

《CSAPP》(第3版)答案(第九章)

P11

  • A
      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|
     +--|--|--|--|--|--|--|--|--|--|--|--|--|--+
  • B
param value
VPN 0x09
TLBI 0x01
TLBT 0x02
hit? No
page falut? No
PPN 0x17
  • C
      11 10  9  8  7  6  5  4  3  2  1  0
     +--|--|--|--|--|--|--|--|--|--|--|--+
     | 0| 1| 0| 1| 1| 1| 1| 1| 1| 1| 0| 0|
     +--|--|--|--|--|--|--|--|--|--|--|--+
  • D
param value
CO 0x00
CI 0x0F
CT 0x17
hit? No
value -----

P12

  • A
      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|
     +--|--|--|--|--|--|--|--|--|--|--|--|--|--+
  • B
param value
VPN 0x0E
TLBI 0x02
TLBT 0x03
hit? No
page falut? No
PPN 0x11
  • C
      11 10  9  8  7  6  5  4  3  2  1  0
     +--|--|--|--|--|--|--|--|--|--|--|--+
     | 0| 1| 0| 0| 0| 1| 1| 0| 1| 0| 0| 1|
     +--|--|--|--|--|--|--|--|--|--|--|--+
  • D
param value
CO 0x01
CI 0x0A
CT 0x11
hit? No
value -----

P13

  • A
      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|
     +--|--|--|--|--|--|--|--|--|--|--|--|--|--+
  • B
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"
/* $begin mallocmacros */
/* Basic constants and macros */
#define WSIZE       4       /* Word and header/footer size (bytes) */ //line:vm:mm:beginconst
#define DSIZE       8       /* Double word size (bytes) */
#define CHUNKSIZE  (1<<12)  /* Extend heap by this amount (bytes) */  //line:vm:mm:endconst
#define MAX(x, y) ((x) > (y)? (x) : (y))
/* Pack a size and allocated bit into a word */
#define PACK(size, alloc)  ((size) | (alloc)) //line:vm:mm:pack
/* Read and write a word at address p */
#define GET(p)       (*(unsigned int *)(p))            //line:vm:mm:get
#define PUT(p, val)  (*(unsigned int *)(p) = (val))    //line:vm:mm:put
/* Read the size and allocated fields from address p */
#define GET_SIZE(p)  (GET(p) & ~0x7)                   //line:vm:mm:getsize
#define GET_ALLOC(p) (GET(p) & 0x1)                    //line:vm:mm:getalloc
/* Given block ptr bp, compute address of its header and footer */
#define HDRP(bp)       ((char *)(bp) - WSIZE)                      //line:vm:mm:hdrp
#define FTRP(bp)       ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE) //line:vm:mm:ftrp
/* Given block ptr bp, compute address of next and previous blocks */
#define NEXT_BLKP(bp)  ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE))) //line:vm:mm:nextblkp
#define PREV_BLKP(bp)  ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE))) //line:vm:mm:prevblkp
/* $end mallocmacros */
/* Global variables */
static char *heap_listp = 0;  /* Pointer to first block */
static char *rover;           /* Next fit rover */
/* Function prototypes for internal helper routines */
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);
/*
 * mm_init - Initialize the memory manager
 */
/* $begin mminit */
int mm_init(void)
{
   
  mem_init();
  /* Create the initial empty heap */
  if ((heap_listp = mem_sbrk(4*WSIZE)) == (void *)-1) //line:vm:mm:begininit
    return -1;
  PUT(heap_listp, 0);                          /* Alignment padding */
  PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1)); /* Prologue header */
  PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1)); /* Prologue footer */
  PUT(heap_listp + (3*WSIZE), PACK(0, 1));     /* Epilogue header */
  heap_listp += (2*WSIZE);                     //line:vm:mm:endinit
  /* $end mminit */
  rover = heap_listp;
  /* $begin mminit *
  /* Extend the empty heap with a free block of CHUNKSIZE bytes */
  if (extend_heap(CHUNKSIZE/WSIZE) == NULL)
    return -1;
  return 0;
}
/* $end mminit */
/*
 * mm_malloc - Allocate a block with at least size bytes of payload
 */
/* $begin mmmalloc */
void *mm_malloc(size_t size)
{
   
  size_t asize;      /* Adjusted block size */
  size_t extendsize; /* Amount to extend heap if no fit */
  char *bp;
  /* $end mmmalloc */
  if (heap_listp == 0){
   
    mm_init();
  }
  /* $begin mmmalloc */
  /* Ignore spurious requests */
  if (size == 0)
    return NULL;
  /* Adjust block size to include overhead and alignment reqs. */
  if (size <= DSIZE)                                          //line:vm:mm:sizeadjust1
    asize = 2*DSIZE;                                        //line:vm:mm:sizeadjust2
  else
    asize = DSIZE * ((size + (DSIZE) + (DSIZE-1)) / DSIZE); //line:vm:mm:sizeadjust3
  /* Search the free list for a fit */
  if ((bp = find_fit(asize)) != NULL) {
     //line:vm:mm:findfitcall
    place(</
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值