OSDev

для всех
Текущее время: 25 авг 2025, 12:54

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9, 10, 11 ... 16  След.
Автор Сообщение
СообщениеДобавлено: 19 авг 2013, 23:20 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Вот здесь sortie все верно сказал, хотя и слишком мягко. Естественно, James Molloy не специально писал быдлокод или делал ошибки. Причина более банальна :P

Цитата:
Что-то чем больше вникаю в архитектуру x86 тем больше мне кажется что там много избыточных нелогичностей - вот есть страничная адресация, но мы продолжаем использовать селекторы и сегменты, иначе никак не изменить уровень привелегий, никто не применяет аппаратную многозадачность, а огрызок TSS все равно используется при переключении и т.п... Утверждение что x86 чуть более чем полностью состоит из костылей кажется более обоснованным теперь
Наша задача нивелировать программным путем хотя бы часть этих костылей.

P.S. кстати аппаратная многозадачность все-таки используется. Я (и не только я) ее использую для обработки NMI и сбоев в режиме ядра.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 авг 2013, 23:55 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Цитата:
Theoretically, size of the page table and page directory on x86 should be the same :wink:

Хм, кстати у JM там в описатель директории страниц засунуты нафиг не нужные поля (типа физического адреса таблиц и адреса начала каталога), вот и размер разный получается. Я у себя обошелся более простыми структурами в итоге.

Вообще надо постепенно переписать весь код ядра, убрать нафиг код JM


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 авг 2013, 00:18 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
maisvendoo писал(а):
Хм, кстати у JM там в описатель директории страниц засунуты нафиг не нужные поля (типа физического адреса таблиц и адреса начала каталога), вот и размер разный получается. Я у себя обошелся более простыми структурами в итоге.
А зачем где-то отдельно хранить физические адреса таблиц, если они хранятся в самом каталоге? Я отдельно храню только счетчики страниц (по одному счетчику на каждую таблицу прикладного пространства), которые использую для определения момента удаления из таблицы последней страницы, чтобы сразу удалить и саму таблицу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 авг 2013, 00:26 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
phantom-84 писал(а):
А зачем где-то отдельно хранить физические адреса таблиц, если они хранятся в самом каталоге?
А, понял. Такое может быть нужно, когда не используется рекурсивное отображение каталога. Один вход каталога должен указывать на спец. таблицу, а один вход этой таблицы - на каталог или на себя. Во всем остальном они должны совпадать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 авг 2013, 10:32 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Там у него так
Код:
/*------------------------------------------------------------------------------
//   Pages directory
//----------------------------------------------------------------------------*/
typedef struct page_directory
{
  page_table_t*   tables[1024];
  u32int   tables_phys_addr[1024];
  u32int   phys_addr;
 
} page_directory_t;

tables - адреса таблиц без флагами (P, W, U и т.п.)
tables_phys_addr - то же самое с флагами
phys_addr - физический адрес каталога
Итого при оттображении всех 4 Гб структура весит 8196 байт. Идея типо в том что первое поле - указатель для доступа к таблице. Я башку ломал долго зачем потом плюнул и у меня вот так
Код:
physaddr_t* kernel_page_dir - каталог таблиц страниц, а для доступа к таблицам physaddr_t* page_table = kernel_page_dir + PAGE_SIZE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 авг 2013, 11:19 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
maisvendoo писал(а):
Там у него так
Код:
/*------------------------------------------------------------------------------
//   Pages directory
//----------------------------------------------------------------------------*/
typedef struct page_directory
{
  page_table_t*   tables[1024];
  u32int   tables_phys_addr[1024];
  u32int   phys_addr;
 
} page_directory_t;

tables - адреса таблиц без флагами (P, W, U и т.п.)
tables_phys_addr - то же самое с флагами
phys_addr - физический адрес каталога
Итого при оттображении всех 4 Гб структура весит 8196 байт.
Я по прежнему в недоумении. Зачем отдельно хранить адреса без флагов? А физический адрес каталога по-любому нужно хранить где-то в расширенной 4-мегабайтной таблице страниц, чтобы он был доступен для модификации. Я так вообще адрес каталога храню в самом каталоге (рекурсивное отображение каталога). А для определения физического адреса каталога из другого процесса можно всегда воспользоваться соответствующим полем в структуре процесса/потока. Хвостик размером в двойное слово - это полнейшее недоразумение.

Цитата:
Идея типо в том что первое поле - указатель для доступа к таблице.
Может, это используется для доступа к таблицам при отключенном пэйджинге? Все равно не понятно, зачем дублировать все адреса. Значительно проще использовать только второй массив, обнуляя флаги для получения адресов, когда это необходимо.

Цитата:
у меня вот так
Код:
physaddr_t* kernel_page_dir - каталог таблиц страниц, а для доступа к таблицам physaddr_t* page_table = kernel_page_dir + PAGE_SIZE
А у меня каталог и таблица - это одна и та же страница.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 авг 2013, 11:35 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
phantom-84 писал(а):
Значительно проще использовать только второй массив, обнуляя флаги для получения адресов, когда это необходимо.

я так и делаю у себя
Код:
/* Delete table flags from address */
table &= ~PAGE_OFFSET_MASK;
/* Get table's memory */
temp_map_page(table);

/* Set page descriptor in table */
tmp_page[page_idx] = (paddr & ~PAGE_OFFSET_MASK) | flags;

Почитал тут доки, у Зубкова
Цитата:
Комада IRET загружает из стека значения IP, CS, FLAGS, а IRETD - EIP, CS, EFLAGS

Соответственно перед выходом в user mode необходимо зарядить в стек следующую последовательность
Код:
EFLAGS
CS
EIP

где - CS - селектор кода пользовательского режима, EIP - адрес функции, которую хотим выполнять в user mode. А регистр DS можно зарядить и вручную.

Ещё интересна команда SYSEXIT, она позволяет практически непосредственно загрузить SS, CS, EIP, но там надо пользоваться MSR регистрами (MSR #174h) а как с ними на виртуальной машине я не знаю


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 авг 2013, 11:58 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
maisvendoo писал(а):
я так и делаю у себя...
Все равно сложно. Значительно проще держать все используемые таблицы страниц постоянно отображенными в ВАП.

Цитата:
Соответственно перед выходом в user mode необходимо зарядить в стек следующую последовательность
Код:
EFLAGS
CS
EIP

где - CS - селектор кода пользовательского режима, EIP - адрес функции, которую хотим выполнять в user mode.
Нет. Еще нужно сохранить в стеке указатель на прикладной стек (я об этом писал). См. в руководстве, как происходит передача управления между разными кольцами защиты.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 авг 2013, 13:12 
Аватара пользователя

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Для начала мне надо добиться того чтобы при записи вершины стека ядра в tss.esp0 у меня не вываливалось #TS :D


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 авг 2013, 13:44 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Странно. Код в студию.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 160 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9, 10, 11 ... 16  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB