/
KernelSystem.h
80 lines (64 loc) · 1.34 KB
/
KernelSystem.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#pragma once
#include "vm_declarations.h"
#include "part.h"
#include "queue"
#define PMT_SIZE 0x100
using namespace std;
class Process;
class KernelProcess;
struct Element
{
Process* process;
Element* next;
Element(Process* p)
{
process = p;
next = nullptr;
}
};
struct Frame
{
ProcessId pid;
PageNum frame;
PageNum page;
Frame* next;
Frame(ProcessId pid, PageNum frame, PageNum page)
{
this->pid = pid;
this->frame = frame;
this->page = page;
next = nullptr;
}
};
class KernelSystem
{
private:
ProcessId PID;
PhysicalAddress vmSpace;
PhysicalAddress pmtSpace;
PageNum vmSize;
PageNum pmtSize;
Partition* partition;
ClusterNo diskSize;
Element* first;
Element* last;
PageNum freePMTSize;
PageNum freePageSize;
ClusterNo freeClusterSize;
queue<int> freePMT;
queue<int> freePage;
queue<int> freeCluster;
Frame* firstFrame;
Frame* lastFrame;
public:
KernelSystem(PhysicalAddress processVMSpace, PageNum processVMSpaceSize, PhysicalAddress pmtSpace, PageNum pmtSpaceSize, Partition* partition);
~KernelSystem();
Process* createProcess();
void registerProcess(Process* process);
void removeProcess(KernelProcess* process);
KernelProcess* getProcess(ProcessId pid);
Status access(ProcessId pid, VirtualAddress address, AccessType access);
Time periodicJob();
friend class System;
friend class KernelProcess;
};