OSDev

для всех
Текущее время: 28 апр 2024, 03:25

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




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 26 июл 2013, 12:22 

Зарегистрирован: 18 апр 2010, 15:59
Сообщения: 155
На основе собственного опыта, рекомендую отказаться от VmWare в пользу VirtualBox. VmWare нечестно эмулирует железо, в частности процессор. Видимо в VmWare присутствуют какие-то оптимизации для народных ОСей а-ля Windows/Linux, которые нарушают спецификацию процессора. В результате можно наблюдать полный ужас на виртуальной машине и в то же время вполне себе нормально работающую физическую тачку рядом с тем же кодом на борту. Я наступил на две грабли в этом огороде. Сколько всего их там валяется, никому не известно, но желание гулять по этому огороду пропало.
VirtualBox веде себя намного честнее. Единственный найденный мной недостаток - это отсутствие поддержки MultiProcesor Specification. Однако с ACPI все вроде бы должно быть в порядке.


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

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


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

Зарегистрирован: 22 июл 2013, 18:47
Сообщения: 5
В файле descriptor_tables.h: устаревший комментарий:
Код:
/* GDT inmitialization */
void init_descriptor_tables(void);


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
У меня все получилось. Следующий код выводит оба символа (каждый из отдельной задачи):
Код:
  ...
  ; создаем потомка
  call fork
  and eax,eax
  jz child
  mov word [VFB],32 + 22h shl 8
  jmp @f
child:
  mov word [VFB+80*2],32 + 44h shl 8
@@:
  hlt
  jmp @b
Формируя стек для потомка, я просто сделал его на 16 байт глубже (относительно esp родителя) и разместил в этих 16 байтах стековый кадр для корректного выхода из подпрограммы переключения в контексте новой задачи (аналогичный тому, который я использовал здесь). Адрес запуска новой задачи установил на адрес возврата из insertts внутри fork'а. Кстати можно было вообще установить адрес запуска на "return 0", чтобы избежать лишнего ветвления в конце fork'а:
Код:
  ...
  ; вставляем структуру задачи в runqueue
  call insertts
start:
  pop eax ; адрес созданной структуры задачи
  pop ecx ; индекс созданной структуры задачи
  sub eax,[current]
  jz @f ; child
  mov eax,ecx
@@:
  ret
Если в Си не захочется использовать метку start, этот адрес можно взять внутри insertts аналогично тому, как это было сделано в read_eip. Вместо pid'а использовал описатель (индекс) задачи, но в данном случае это не существенно, тем более что у первичной задачи описатель равен 0, а у первого потомка – 1.


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
polniy_debil писал(а):
В файле descriptor_tables.h: устаревший комментарий:

И правда, спасибо, устраню. Это я сам нашлепал лишних букафф... :)

phantom-84, спасибо :) Занимаюсь реализацией, правда отписаться о результатах не сразу смогу, тут грузят не подецки другим...

Надеюсь реализация вещей изложенная в исходниках выложенных в блоге не такое дно как многозадачность...

polniy_debil писал(а):
ПОЛНЫЙ ДЕБИЛ, НИФИГА НЕ ПОНИМАЮЩИЙ В ПРЕРЫВАНИЯХ

В связи с чем такой жестокий аватар? На самом деле прерывания не так уж и непонятны ;)


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

Зарегистрирован: 22 июл 2013, 18:47
Сообщения: 5
maisvendoo писал(а):
polniy_debil писал(а):
В файле descriptor_tables.h: устаревший комментарий:

polniy_debil писал(а):
ПОЛНЫЙ ДЕБИЛ, НИФИГА НЕ ПОНИМАЮЩИЙ В ПРЕРЫВАНИЯХ

В связи с чем такой жестокий аватар? На самом деле прерывания не так уж и непонятны ;)

Изначально я зарегистрировался на этом форуме, чтобы больше узнать об обработке прерываний:)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июл 2013, 21:22 
Аватара пользователя

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

http://phantomexos.blogspot.ru/2013/07/ ... ex_15.html
http://phantomexos.blogspot.ru/2013/07/ ... _7622.html
Пока так, да я думаю видели уже. С вопросами в ICQ 588351632 милости прошу :)


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

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
maisvendoo писал(а):
Занимаюсь реализацией, правда отписаться о результатах не сразу смогу, тут грузят не подецки другим...
ОК, я тоже сегодня на телефоне целый день висел...

Расскажу пока, как я организовал ВАП и сформировал данные для новой задачи. Может, будет интересно. Естественно, я сделал это без отключения пэйджинга (как и положено). Только для простоты не стал делать user space и размещать ядро в верхней части ВАП. Итак структура ВАП:
  • глобальная транс-страница для отображения ядра (все конечные страницы тоже глобальны):
    • тождественно отображенные страницы ядра плюс одна страница для видеобуфера (всего KERNEL_PCOUNT+1);
    • 1024-(KERNEL_PCOUNT+1) свободных входа;
  • 1024-3 свободных входа;
  • локальная транс-страница для локальных данных ядра (все конечные страницы тоже локальны):
    • 1024-2 свободных входа;
    • 2 страницы для стека ядра;
  • локальная транс-страница для 4-мегабайтной таблицы страниц - каталог:
    • см. состав транс-страниц.
Дополнительный расход памяти: 4 локальных страницы на каждое пространство плюс одна глобальная транс-страница для отображения ядра (физическую память брал между страницей с номером KERNEL_PCOUNT и концом доступной базовой памяти). Для подготовки ВАП для новой задачи распределял 4 страницы и отображал их в начало пространства локальных данных ядра текущей задачи (можно спокойно использовать фиксированный буфер, т.к. в рамках рассматриваемого подхода в контексте задачи существует только один поток, т.е. нет конкуренции за доступ к локальным данным ядра) - сначала две страницы для стека, потом будущую транс-страницу для локальных данных ядра новой задачи, а после будущий каталог новой задачи. Запоминал физ. адрес будущего каталога. После заполнял эти 4 страницы, причем стек копировал не полностью, а брал лишь актуальные стековые данные (лежащие выше esp текущей задачи). В процессе заполнения этих страниц отцеплял их от ВАП тек. задачи, освобождая буфер для будущих обращений к fork в контексте текущей задачи.


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

Зарегистрирован: 25 июл 2013, 08:45
Сообщения: 141
Откуда: Новочеркасск
Вобщем подолбился я над своим кодом, основательно, но ни к чему хорошему это не привело. Пришел к выводу что реализация управления памятью у меня отстой. Переделываю. Потом вернусь к планировщику.

GRUB2 через мультибут заголовок передает следующую инфу называемую карта памяти
Изображение
Изучаю...

0 - 9FC00h: Base memory - первые 640 Кб
9FC00h - A0000h: BIOS
A0000h - F0000h: Видеопамять
F0000h - 100000h: ???
100000h - 1EFE000h: 31 Мб доступные i386?

Соответствнно size = 0x14 - размер записи в структуре (20 байт); type = 1 - доспупная память, type = 2 - зарезервированная память (интересно, выше 32 Мб - зарезервировано. Со времен 80386 видимо); length - размер рассматриваемой области. Если все сложить будет 32 Мб - столько было выделено испытуемой ВМ.


Последний раз редактировалось maisvendoo 29 июл 2013, 21:46, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 июл 2013, 21:42 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
GRUB использует "стандартную" процедуру детекта памяти. Т.е. в первую очередь применяется функция BIOS int 15h/0E820h. Без лишних телодвижений доступны только области типа 1.

Непонятно, почему вы на словах уменьшили размер базовой памяти до 64 кб.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3, 4  След.

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


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

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


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

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