帮我改正一下这段代码:int a=0; printf("data in pdata.bin:\n"); for (int i = 0; i < PAGE_TABLE_SIZE; i++) { printf("page %d\n", i); for (int j = 0; j < 4; j++) { for (int k = 0; k < 8; k++) { printf("%5d", (signed char)backing_store[a+j*8+k]); a++; } printf("\n"); } }
时间: 2023-12-06 13:43:08 浏览: 28
int a=0;
printf("data in pdata.bin:\n");
for (int i = 0; i < PAGE_TABLE_SIZE; i++) {
printf("page %d\n", i);
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 8; k++) {
printf("%5d", *(signed char*)(backing_store+a+j*8+k)); //改动这一行
a++;
}
printf("\n");
}
}
你需要将 `(signed char)backing_store[a+j*8+k]` 改成 `*(signed char*)(backing_store+a+j*8+k)`,这样可以正确解析出 backing_store 中的每个字节。
相关问题
用C语言写一个程序:1.Setup a simulating backing store in memory. Read the data from pdata.bin to this backing store. 2.Initialize a page table for process p, set the frame number to be -1 for each page, indicating that the page is not loaded into memory yet. 3.Read logical addresses one by one from la.txt. 4.For each logical address, a)if its page has been loaded into physical memory, simply find the frame number in the page table, then generate physical address, find and print out the physical address and data inside this address. b)if the page is used for the first time, i.e., in page table, its frame number is -1,then the page that contains this address should be loaded into a free frame in physical memory (RAM). Then update the page table by adding the frame number to the right index in the page table. Then repeat 4a). Assumption: 1.Assume the file la.txt includes the sequence of generated addresses from CPU. 2.Use a part of memory as backing store that store data for a process. 3.The backing store size is 128 bytes 4.The size of process p is 128 bytes. 5.The contents of p is included in a file pdata.bin which is a binary file. 6.Use a part of memory as RAM. The size of physical memory is 256 bytes, from 0 to 255. All the physical memory is available, allocating starting from beginning in sequence. That is, allocate frame 0 first, then frame 1, then frame 2…. 7.The size of a frame is 32 bytes, i.e., 5 bits for the offset in a frame, total number of frames is 8. At beginning, no page table is available for process p.
```
#include <stdio.h>
#include <stdlib.h>
#define PAGE_SIZE 32
#define FRAME_SIZE 32
#define PAGE_TABLE_SIZE 4
#define BACKING_STORE_SIZE 128
#define RAM_SIZE 256
typedef struct {
int frame_number;
} page_table_entry;
int main() {
// Step 1: Setup a simulating backing store in memory. Read the data from pdata.bin to this backing store.
FILE *pdata_file = fopen("pdata.bin", "rb");
if (pdata_file == NULL) {
printf("Error: failed to open pdata.bin\n");
return 1;
}
char backing_store[BACKING_STORE_SIZE];
fread(backing_store, sizeof(char), BACKING_STORE_SIZE, pdata_file);
fclose(pdata_file);
// Step 2: Initialize a page table for process p, set the frame number to be -1 for each page.
page_table_entry page_table[PAGE_TABLE_SIZE];
for (int i = 0; i < PAGE_TABLE_SIZE; i++) {
page_table[i].frame_number = -1;
}
// Step 3: Read logical addresses one by one from la.txt.
FILE *la_file = fopen("la.txt", "r");
if (la_file == NULL) {
printf("Error: failed to open la.txt\n");
return 1;
}
int logical_address, page_number, offset, frame_number;
char data;
while (fscanf(la_file, "%d", &logical_address) == 1) {
// Step 4a: if its page has been loaded into physical memory, simply find the frame number in the page table, then generate physical address, find and print out the physical address and data inside this address.
page_number = logical_address / PAGE_SIZE;
offset = logical_address % PAGE_SIZE;
if (page_table[page_number].frame_number != -1) {
frame_number = page_table[page_number].frame_number;
int physical_address = frame_number * FRAME_SIZE + offset;
data = backing_store[page_number * PAGE_SIZE + offset];
printf("Logical address: %d, Physical address: %d, Data: %c\n", logical_address, physical_address, data);
}
// Step 4b: if the page is used for the first time, i.e., in page table, its frame number is -1,then the page that contains this address should be loaded into a free frame in physical memory (RAM). Then update the page table by adding the frame number to the right index in the page table. Then repeat 4a).
else {
for (int i = 0; i < RAM_SIZE / FRAME_SIZE; i++) {
if (page_table[i].frame_number == -1) {
page_table[i].frame_number = i;
frame_number = i;
int physical_address = frame_number * FRAME_SIZE + offset;
for (int j = 0; j < FRAME_SIZE; j++) {
backing_store[page_number * PAGE_SIZE + j] = backing_store[page_number * PAGE_SIZE + j];
}
data = backing_store[page_number * PAGE_SIZE + offset];
printf("Logical address: %d, Physical address: %d, Data: %c\n", logical_address, physical_address, data);
break;
}
}
}
}
fclose(la_file);
return 0;
}
```
Write a program to 1. Setup a simulating backing store in memory. Read the data from pdata.bin to this backing store. 2. Initialize a page table for process p, set the frame number to be -1 for each page, indicating that the page is not loaded into memory yet. 3. Read logical addresses one by one from la.txt. 4. For each logical address, a) if its page has been loaded into physical memory, simply find the frame number in the page table, then generate physical address, find and print out the physical address and data inside this address. b) if the page is used for the first time, i.e., in page table, its frame number is -1,then the page that contains this address should be loaded into a free frame in physical memory (RAM). Then update the page table by adding the frame number to the right index in the page table. Then repeat 4a).写c语言文件
Sorry, as an AI language model, I am not able to create files or execute programs directly. However, I can provide you with the C code for the program you requested. Here is the code:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FRAME_SIZE 256
#define PAGE_SIZE 256
#define PAGE_TABLE_SIZE 256
#define BACKING_STORE_SIZE 65536
typedef struct {
int page_number;
int frame_number;
} page_table_entry;
int main() {
FILE *pdata, *la;
int backing_store[BACKING_STORE_SIZE];
int physical_memory[FRAME_SIZE][PAGE_SIZE];
page_table_entry page_table[PAGE_TABLE_SIZE];
// Initialize page table
for (int i = 0; i < PAGE_TABLE_SIZE; i++) {
page_table[i].page_number = i;
page_table[i].frame_number = -1;
}
// Read data from pdata.bin to backing store
pdata = fopen("pdata.bin", "rb");
fread(backing_store, sizeof(int), BACKING_STORE_SIZE, pdata);
fclose(pdata);
// Read logical addresses from la.txt
la = fopen("la.txt", "r");
int logical_address;
while (fscanf(la, "%d", &logical_address) != EOF) {
int page_number = (logical_address & 0xff00) >> 8;
int offset = logical_address & 0xff;
if (page_table[page_number].frame_number == -1) {
// Page fault, load page into physical memory
int free_frame = -1;
for (int i = 0; i < FRAME_SIZE; i++) {
if (page_table[i].frame_number == -1) {
free_frame = i;
break;
}
}
if (free_frame == -1) {
fprintf(stderr, "Error: Physical memory is full\n");
exit(1);
}
memcpy(physical_memory[free_frame], backing_store + page_number * PAGE_SIZE, PAGE_SIZE);
page_table[page_number].frame_number = free_frame;
}
// Generate physical address and read data
int frame_number = page_table[page_number].frame_number;
int physical_address = frame_number * PAGE_SIZE + offset;
int data = physical_memory[frame_number][offset];
printf("Virtual address: %d Physical address: %d Value: %d\n", logical_address, physical_address, data);
}
fclose(la);
return 0;
}
```
This program simulates a simple virtual memory system that reads logical addresses from a file and translates them to physical addresses using a page table and a backing store in memory. The program first reads the data from `pdata.bin` to the backing store, then initializes a page table for process p, setting the frame number to -1 for each page to indicate that the page is not loaded into memory yet. It then reads logical addresses one by one from `la.txt`, and for each logical address, it checks if its page has already been loaded into physical memory. If the page is not in memory, the program loads it into a free frame in physical memory and updates the page table. Finally, the program generates the physical address and reads the data from memory, printing out the virtual address, physical address, and value of the data.