#include 
#include 
#include 
#include 
#include 

void print\_binary(uint32\_t num, int bits) {
 for (int i = bits - 1; i >= 0; i--) {
 printf("%d", (num >> i) & 1);
 }
}

int main(int argc, char \*argv[]) {
 if (argc != 4) {
 printf("Usage: %s \n", argv[0]);
 return 1;
 }

 int page\_table\_type = atoi(argv[1]);
 int address\_bits = atoi(argv[2]);
 int page\_size\_kb = atoi(argv[3]);

 if (page\_table\_type != 1 && page\_table\_type != 2) {
 printf("Error: Invalid page table type. Must be 1 or 2.\n");
 return 1;
 }

 if (address\_bits < 8 || address\_bits > 63) {
 printf("Error: Invalid address bits. Must be in the range [8..63].\n");
 return 1;
 }

 int valid\_page\_sizes[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512};
 int valid\_page\_sizes\_count = sizeof(valid\_page\_sizes) / sizeof(valid\_page\_sizes[0]);
 int is\_valid\_page\_size = 0;

 for (int i = 0; i < valid\_page\_sizes\_count; i++) {
 if (page\_size\_kb == valid\_page\_sizes[i]) {
 is\_valid\_page\_size = 1;
 break;
 }
 }

 if (!is\_valid\_page\_size) {
 printf("Error: Invalid page size. Must be one of 1, 2, 4, 8, 16, 32, 64, 128, 256, 512.\n");
 return 1;
 }

 uint64\_t memory\_size = (uint64\_t)1 << address\_bits;
 uint64\_t page\_size = (uint64\_t)page\_size\_kb << 10;
 uint64\_t total\_pages = memory\_size / page\_size;

 if (memory\_size < page\_size) {
 printf("Error: Memory size is smaller than the page size.\n");
 return 1;
 }

 printf("Size of the memory: %" PRIu64 " bytes\n", memory\_size);
 printf("Total number of pages: %" PRIu64 "\n", total\_pages);

 int offset\_bits = (int)log2(page\_size);
 int vpn\_bits = address\_bits - offset\_bits;
 uint64\_t page\_table\_entries = (page\_table\_type == 1) ? total\_pages : (1 << vpn\_bits);

 printf("Total number of page table entries: %" PRIu64 "\n", page\_table\_entries);
 printf("Size of the page table: %" PRIu64 " bytes\n", page\_table\_entries \* sizeof(uint64\_t));
 printf("Number of bits for VPN: %d\n", vpn\_bits);
 printf("Number of bits for page offset: %d\n", offset\_bits);

 if (page\_table\_type == 2) {
 int pd\_bits = (int)(vpn\_bits / 2);
 int pt\_bits = vpn\_bits - pd\_bits;
 uint64\_t entries\_per\_page = page\_size / sizeof(uint64\_t);
 uint64\_t pages\_per\_page\_table = (uint64\_t)1 << pd\_bits;

 printf("Number of PTE in a page of page table: %" PRIu64 "\n", entries\_per\_page);
 printf("Number of pages in a page table: %" PRIu64 "\n", pages\_per\_page\_table);
 printf("Number of bits for page directory index: %d\n", pd\_bits);
 printf("Number of bits for page table index: %d\n", pt\_bits);
 }

 uint64\_t virtual\_address while (1) {
 printf("\nPlease enter a decimal virtual address: ");
 scanf("%" SCNu64, &virtual\_address);

 if (virtual\_address >= memory\_size) {
 printf("Error: Virtual address exceeds the memory size.\n");
 continue;
 }

 uint64\_t vpn = virtual\_address >> offset\_bits;
 uint64\_t offset = virtual\_address & ((1 << offset\_bits) - 1);

 printf("VPN of the address in decimal: %" PRIu64 "\n", vpn);
 printf("Page offset of the address in decimal: %" PRIu64 "\n", offset);

 if (page\_table\_type == 2) {
 int pd\_bits = (int)(vpn\_bits / 2);
 int pt\_bits = vpn\_bits - pd\_bits;

 uint64\_t pd\_index = vpn >> pt\_bits;
 uint64\_t pt\_index
can you finish the code
#포함 #포함 #포함 #포함 #include void print\_binary(uint32\_t num, int bits) { for (int i = bits - 1; i >= 0; i--) { printf("%d", (num >> i) & 1); }}int main(int argc, char \*argv[]) { if (argc != 4) { printf("Usage: %s \n", argv[0]); return 1; } int page\_table\_type = atoi(argv[1]); int address\_bits = atoi(argv[2]); int page\_size\_kb = atoi(argv[3]); if (page\_table\_type != 1 && page\_table\_type != 2) { printf("오류: 잘못된 페이지 테이블 유형입니다. 1 또는 2.\n이어야 합니다."); 반환 1; } if (주소\_비트 < 8 || 주소\_비트 > 63) { printf("오류: 주소 비트가 잘못되었습니다. [8..63].\n 범위에 있어야 합니다."); 반환 1; } int valid\_page\_sizes[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512}; int valid\_page\_sizes\_count = sizeof(valid\_page\_sizes) / sizeof(valid\_page\_sizes[0]); int is\_valid\_page\_size = 0; for (int i = 0; i < valid\_page\_sizes\_count; i++) { if (page\_size\_kb == valid\_page\_sizes[i]) { is\_valid\_page\_size = 1; break; } } if (!is\_valid\_page\_size) { printf("오류: 페이지 크기가 잘못되었습니다. 1, 2, 4, 8, 16, 32, 64, 128, 256, 512.\n 중 하나이어야 합니다."); 반환 1; } uint64\_t memory\_size = (uint64\_t)1 << address\_bits; uint64\_t page\_size = (uint64\_t)page\_size\_kb << 10; uint64\_t total\_pages = memory\_size / page\_size; if (memory\_size < page\_size) { printf("오류: 메모리 크기가 페이지 크기보다 작습니다.\n"); 반환 1; } printf("메모리 크기: %" PRIu64 " 바이트\n", memory\_size); printf("총 페이지 수: %" PRIu64 "\n", total\_pages); int 오프셋\_비트 = (int)로그2(페이지\_size); int VPN\_비츠 = 주소\_비츠 - 오프셋\_비츠; uint64\_t page\_table\_entries = (page\_table\_type == 1) ? total\_pages : (1 << vpn\_bits); printf("총 페이지 테이블 항목 수: %" PRIu64 "\n", page\_table\_entries); printf("페이지 테이블의 크기: %" PRIu64 "바이트\n", page\_table\_entries \* sizeof(uint64\_t)); printf("VPN의 비트 수: %d\n", vpn\_bits); printf("페이지 오프셋의 비트 수: %d\n", offset\_bits); if (page\_table\_type == 2) { int pd\_bits = (int)(vpn\_bits / 2); int pt\_bits = vpn\_bits - pd\_bits; uint64\_t 엔트리\_퍼\_페이지 = 페이지\_size / sizeof(uint64\_t); uint64\_t pages\_per\_page\_table = (uint64\_t)1 << pd\_bits; printf("페이지 테이블의 한 페이지에 있는 PTE 수: %" PRIu64 "\n", entries\_per\_page); printf("페이지 테이블의 페이지 수: %" PRIu64 "\n", pages\_per\_page\_table); printf("페이지 디렉토리 인덱스의 비트 수: %d\n", pd\_bits); printf("페이지 테이블 인덱스의 비트 수: %d\n", pt\_bits); } uint64\_t 가상\_주소 동안 (1) { printf("\n십진수 가상 주소를 입력하세요: "); scanf("%" SCNu64, &virtual\_address); if (virtual\_address >= memory\_size) { printf("오류: 가상 주소가 메모리 크기를 초과합니다.\n"); 계속합니다; } uint64\_t VPN = 가상\_주소 >> 오프셋\_비트; uint64\_t 오프셋 = 가상\_주소 & ((1 << 오프셋\_비트) - 1); printf("주소의 VPN(십진수): %" PRIu64 "\n", vpn); printf("주소의 페이지 오프셋(십진수): %" PRIu64 "\n", offset); if (page\_table\_type == 2) { int pd\_bits = (int)(vpn\_bits / 2); int pt\_bits = vpn\_bits - pd\_bits; uint64\_t pd\_index = vpn >> pt\_bits; uint64\_t pt\_index코드를 완성할 수 있나요?