mirror of
https://github.com/Manoj-HV30/sp-lab.git
synced 2026-05-16 19:35:27 +00:00
96 lines
3.0 KiB
C
96 lines
3.0 KiB
C
#include <stdio.h>
|
|
|
|
// ── PAGING ────────────────────────────────────────────────────────────────
|
|
void paging() {
|
|
int page_size, num_pages;
|
|
printf("\n--- PAGING ---\n");
|
|
printf("Enter page size: ");
|
|
scanf("%d", &page_size);
|
|
printf("Enter number of pages: ");
|
|
scanf("%d", &num_pages);
|
|
|
|
int page_table[num_pages];
|
|
printf("Enter frame number for each page:\n");
|
|
for (int i = 0; i < num_pages; i++) {
|
|
printf(" Page %d -> Frame: ", i);
|
|
scanf("%d", &page_table[i]);
|
|
}
|
|
|
|
int logical;
|
|
printf("Enter logical address: ");
|
|
scanf("%d", &logical);
|
|
|
|
int page = logical / page_size; // which page
|
|
int offset = logical % page_size; // offset within page
|
|
|
|
if (page >= num_pages) {
|
|
printf("Invalid! Page %d does not exist.\n", page);
|
|
return;
|
|
}
|
|
|
|
int frame = page_table[page];
|
|
int physical = frame * page_size + offset;
|
|
|
|
printf("\nPage Number : %d\n", page);
|
|
printf("Offset : %d\n", offset);
|
|
printf("Frame Number: %d\n", frame);
|
|
printf("Physical Address: %d\n", physical);
|
|
}
|
|
|
|
// ── SEGMENTATION ──────────────────────────────────────────────────────────
|
|
void segmentation() {
|
|
int num_seg;
|
|
printf("\n--- SEGMENTATION ---\n");
|
|
printf("Enter number of segments: ");
|
|
scanf("%d", &num_seg);
|
|
|
|
int base[num_seg], limit[num_seg];
|
|
printf("Enter base and limit for each segment:\n");
|
|
for (int i = 0; i < num_seg; i++) {
|
|
printf(" Segment %d -> Base: ", i);
|
|
scanf("%d", &base[i]);
|
|
printf(" Segment %d -> Limit: ", i);
|
|
scanf("%d", &limit[i]);
|
|
}
|
|
|
|
int seg, offset;
|
|
printf("Enter segment number: ");
|
|
scanf("%d", &seg);
|
|
printf("Enter offset: ");
|
|
scanf("%d", &offset);
|
|
|
|
if (seg >= num_seg) {
|
|
printf("Invalid! Segment %d does not exist.\n", seg);
|
|
return;
|
|
}
|
|
|
|
if (offset >= limit[seg]) {
|
|
printf("Segmentation Fault! Offset %d exceeds limit %d.\n", offset, limit[seg]);
|
|
return;
|
|
}
|
|
|
|
int physical = base[seg] + offset;
|
|
printf("\nSegment Base : %d\n", base[seg]);
|
|
printf("Segment Limit : %d\n", limit[seg]);
|
|
printf("Offset : %d\n", offset);
|
|
printf("Physical Address: %d\n", physical);
|
|
}
|
|
|
|
// ── MAIN ──────────────────────────────────────────────────────────────────
|
|
int main() {
|
|
int ch;
|
|
while (1) {
|
|
printf("\n1. Paging");
|
|
printf("\n2. Segmentation");
|
|
printf("\n3. Exit");
|
|
printf("\nEnter choice: ");
|
|
scanf("%d", &ch);
|
|
|
|
if (ch == 1) paging();
|
|
else if (ch == 2) segmentation();
|
|
else if (ch == 3) break;
|
|
else printf("Invalid choice\n");
|
|
}
|
|
return 0;
|
|
}
|