Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не могу исправить ошибку(error C2137: empty character constant) http://www.cyberforum.ru/cpp-beginners/thread736283.html
задание найти с помощью функции максимальный и минимальный элемент массива размерностью m*n и вывести на экран ошибка одна: error C2137: empty character constant Error executing cl.exe. (в коде...
C++ Дан файл с текстом, нужно вывести каждое слово с новой строчки и посчитать количество символов у каждом слове.. Дан файл с текстом, нужно вывести каждое слово с новой строчки и посчитать количество символов у каждом слове.. #include <iostream> #include <fstream> #include <conio.h> #include <string> ... http://www.cyberforum.ru/cpp-beginners/thread736280.html
C++ Из заданной матрицы удалите строку, в которой находится первый отрицательный элемент
Люди,очень прошу!помогите написать несколько программа,через неделю зачёт,а я вообще ничего не успеваю... 1.Матрица задается динамически. При работе с матрицами использовать указатели Из заданной...
По заданному двумерному массиву сформировать одномерный массив и реализовать указанные преобразования. C++
Люди,очень прошу!помогите написать несколько программа,через неделю зачёт,а я вообще ничего не успеваю... 2.Матрица задается динамически - А(m,n). Тип элементов –целый. По заданному двумерному...
C++ Отсортировать по возрастанию массив 10 целых чисел методом выбора (Borland C++) http://www.cyberforum.ru/cpp-beginners/thread736265.html
2. Отсортировать по возрастанию массив 10 целых чисел методом выбора.
C++ Отсортировать линейный массив из 20 действительных чисел методом включения(Borland C++) 3. Отсортировать линейный массив из 20 действительных чисел методом включения. подробнее

Показать сообщение отдельно
Kastaneda
Форумчанин
Эксперт С++
4656 / 2864 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
22.12.2012, 13:37
Короче вот что-то набросал
C++
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <iostream>
 
// следующие typedef'ы лучше реализовать через структуры с битовыми полями
// но для простоты сделаем так
typedef unsigned char byte;
typedef unsigned short word; // при условии, что sizeof(short) == 2
typedef unsigned int dword; // при условии, что sizeof(int) == 4
typedef long long unsigned int qword; //при условии, что sizeof(long long int) == 8;
 
class Page
{
public:
    unsigned char& operator[] (int idx)
    {
        return page[idx];
    }
 
private:
    static const int pageSize = 4 * 1024; // размер страницы 4 КБ (бывают и другие, добавить при необходимости)
    unsigned char page[pageSize];
};
 
class PGEntries
{
public:
    static const int tableSize = 1024; // в случае использования PAE или имитации х86_64 размер будет равен 512
 
    virtual ~PGEntries() {}
 
protected:
   // добавить маски флагов для проверки различных вещей, например разрешение на чтение/запись
};
 
class PTE : public PGEntries
{
public:
    PTE()
    {
        table = new Page*[tableSize];
 
        for (int i = 0; i < tableSize; i++)
        {
            table[i] = new Page;
        }
    }
 
    ~PTE() {/* освободить память */}
 
    Page* operator [] (int idx)
    {
        return table[idx];
    }
 
private:
    Page **table;
    // добавить маски флагов для проверки различных вещей, например разрешение на чтение/запись
    // так же добавить маску флага присутствия страницы в памяти, для имитации исключени Page Fault
};
 
class PDE : public PGEntries
{
public:
    PDE()
    {
        table = new PTE*[tableSize];
 
        for (int i = 0; i < tableSize; i++)
        {
            table[i] = new PTE;
        }
    }
 
    ~PDE() { /* освободить память */}
 
    PTE* operator[] (int idx)
    {
        return table[idx];
    }
 
private:
    PTE **table;
 
    // добавить маски флагов для проверки различных вещей, например разрешение на чтение/запись
};
 
// реализовать при необходимости
// class PDPTE : public PGEntries{};// для имитации использования PAE (PDPTE содержит 4 указателя на PDE (в protected mode) или 512 в х86_64
// class PML4 : public PGEntries{}; // Page Map Level 4 - для имитации пэйджинга x86_64
 
 
class Descriptor {}; // реализовать
class GDT {}; // реализвать
// GDT - global description table - главная табилца дескрипторов
 
typedef int Selector;
 
// на самом деле полный адрес определяется путем сложения базы десктриптора (который опеределяется селектором) плюс адрес
// но уже лень это все реализовывать. Там нужно сделать проверку на лимит и т.д. Так же там есть всякие флаги, которые тоже можно имитировать
class VAddress
{
public:
    VAddress(Selector sel, dword addr)  :  _addr(addr), _sel(sel), PDEmask(0xFFC00000), PTEmask(0x3FF000), pageOffsetMask(0xFFF) {}
    // перегрузить конструктор для 64 битных адресов
 
    int getPDEIndex() const
    {
        return _addr & PDEmask;
    }
 
    int getPTEIndex() const
    {
        return _addr & PTEmask;
    }
 
    int getOffset() const
    {
        return _addr & pageOffsetMask;
    }
 
private:
    Selector _sel;
    dword _addr; // _addr можно сделать как union{qword, dword} для хранения 64 битных адресов
    dword PDEmask;
    dword PTEmask;
    dword pageOffsetMask;
 
    // добавить при необходимости
    // unsigned int PDPTEmask;
    // unsigned int PML4mask;
};
 
class VMemmory
{
public:
    VMemmory(PGEntries *mainTbl) : CR3(mainTbl) {}
 
    // для всех слещующих методов сделать разную реализацию в зависимости от модели paging'а
    // например можно добавить в класс члены bool _paeIsUsed и _pml4IsUsed и инициализировать их в конструкторе
    void setByte (const VAddress &addr, byte val)
    {
        PTE *pte = (*(dynamic_cast<PDE*> (CR3))) [addr.getPDEIndex()];
        Page *page = (*pte)[addr.getPTEIndex()];
        (*page)[addr.getOffset()] = val;
    }
 
    void setWord (const VAddress &addr, word val) { /*реализвать*/}
    void setDword (const VAddress &addr, dword val) { /*реализвать*/}
    void setQword (const VAddress &addr, qword val) { /*реализвать*/}
 
    byte getByte (const VAddress &addr)
    {
        PTE *pte = (*(dynamic_cast<PDE*> (CR3))) [addr.getPDEIndex()];
        Page *page = (*pte)[addr.getPTEIndex()];
 
        return (*page)[addr.getOffset()];
    }
 
    word getWord (const VAddress&) { return 0;/*реализвать*/}
    dword getDword (const VAddress&) { return 0;/*реализвать*/}
    qword getQword (const VAddress&) { return 0;/*реализвать*/}
private:
    PGEntries *CR3; // в процессоре регистр CR3 содержит адрес таблицы верхнего уровня
};
 
int main ()
{
    PDE *pde = new PDE;
    VMemmory mem (pde);
 
    VAddress addr (123 /*это типа селктор, но нужно сделать по другому*/, 0x12345678); // просто для примера
 
    mem.setByte(addr, 0xAB);
 
    std::cout << "Our byte = " << mem.getByte(addr) << std::endl;
 
    return 0;
}
небольшое пояснение - здесь реализовано процентов 10 от того, что реально нужно сделать. Это только самая общая модель (и то не полная без дескрипторов) paging'a. То, что написано в коментариях - это далеко не полный список того, что нужно добавить. Если нужно я могу написать все, что нужно сделать, просто это не пару строк текста, поэтому без надобности писать неохото.

Цитата Сообщение от easybudda Посмотреть сообщение
Я бы значительно дольше провозился
Ага, я что-то про день/полдня неподумав сказал. Реально если делать все как следует, с реализацие всего всего, то пару дней надо (с учетом понимания paging'a). И это только на реализацию модели paging'a, а плюс еще сами задания.

Цитата Сообщение от easybudda Посмотреть сообщение
убивать просто так на это задание целый выходной (а то и два, если сразу не заработает ) - какое-то сомнительное удовольствие...
Да, просидел часа полтора, потом плюнул, даже дескрипторы не стал делать, просто в коментариях отметил

Короче совет - во фриланс! Только вот стоить это будет (как уже писали выше) далеко не 500 рублей.

P.S. не пытайтесь запускать этот код, я там не подумав мапировал все 4 ГБ памяти (как это на самом деле бывает), только вот я эти 4 ГБ из кучи беру, поэтому программа (и ОС) просто зависнут Поэтому нужно подумать - либо обрезать размер памяти, либо мапировать только используемую таблицу -> страницу по запросу.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru