Добавлено: Вс Сен 27, 2009 9:00 pm Заголовок сообщения: WhiteSea Operating System
Долгое время до этого я разрабатывал некую ось, на подобие win3.1, как надстройка над DOS`ом. Где-то на 40% ядра решил, что проект стоит того, чтобы быть стать полностью самостоятельной осью. Вот сейчас делаю
Концепции вот такие:
1. ПОЛНАЯ поддержка ООП, как на уровне ядра, так и приложений.
2. Виртуальная машина (похоже на .NET, не java-ос! )
3. Память плоская (В виртуальной машине защита памяти не нужна)
4. Полноценный GUI
5. Новые принципы защиты данных
6. В перспективе разработка Object FS.
7. Режим 32-бит, в перспективе 64-бит
Пишется все на C++ (Не C )
В этой теме я буду задавать глупые вопросы по написанию, отписывать прогресс, а также обсуждение концепции.
Зарегистрирован: 12.01.2005 Сообщения: 3105 Откуда: Москва
Добавлено: Пн Сен 28, 2009 10:56 am Заголовок сообщения:
Какой-то смешанный набор концепций...
Современные принципы защиты данных и файловые системы типа поддерживаться не будут?
Современный GUI типа неполноценный? Хотя тут пожалуй соглашусь.
Как плоская память и виртуальная машина сочетаются с C++?
Добавлено: Пн Сен 28, 2009 7:34 pm Заголовок сообщения:
Из файловых систем будут поддерживаться FAT12, FAT32.
Так С++ просто язык разработки, предоставляющий средства для реализации полноценного ОО подхода, разве виртуальные машины с плоской памятью обязательно пишутся на ASM?
Да, забыл, также есть кое-какие идеи по ускорению выполнения CIL-кода в 5 раз.
В комментариях описано.
Далее загружаю IDT вот так:
Код:
unsigned char *IDT=(unsigned char *)0x100000;
//Указатель на мое начало IDT
unsigned short *IDT_Size=(unsigned short *)0x100800;
//Указатель на размер IDT
unsigned int *IDT_Ptr=(unsigned int *)0x100802;
//Указатель на начало начала IDT
for(int i=0;i<0x800;i++)
{
IDT[0]=0; //Зачищаем память с IDT
}
IDT_Size=(unsigned short*)2047;
//Помещаем размер IDT в след. 2 байта
IDT_Ptr=(unsigned int*)0x100000;
//Помещаем адрес начала IDT в еще след. 4 байта
asm("lidt 0x100800");
//Загружаем IDT, указывая адрес начала слова с размером IDT
Добавлено: Вт Сен 29, 2009 8:05 am Заголовок сообщения:
Что за ламерство... Для начала регистр DS в обработчике переустанови, не забыв восстановить его на выходе, или к примеру префикс SS: используй. Даже не рискую спросить, инициализирован ли TR. В код подробно не вникал... надеюсь, там все правильно. GDT_Add не увидел.
А чтобы пыль не лезла в нос - надо сделать пыле...
Прежде чем ставить обработчики прерываний - поставь обработчики исключений - и тогда тебе, может быть, станет ясно что ты делаешь не так.
Добавлено: Вт Сен 29, 2009 6:45 pm Заголовок сообщения:
Dron писал(а):
PS: Насчет CLI - жжешь...
CLI или CIL?
Цитата:
GDT_Add не увидел.
Там GDT_Add, он не подписан
Цитата:
Загружаем дескрипторы прерываний так: Код:
unsigned char *IDT=(unsigne .........
Цитата:
Вот такой код ей богу удобнее писать на асме...
Это только набросок, пока не до удобства, работало бы просто...
Цитата:
Для начала регистр DS в обработчике переустанови, не забыв восстановить его на выходе, или к примеру префикс SS: используй. Даже не рискую спросить, инициализирован ли TR.
Первый раз слышу, в документации такого нет. Это как делается? Никто не посоветует какую-нибудь хорошую доку по работе с прерываниями?
[GLOBAL _IRQ_0]
align 4
_IRQ_0:
pusha
mov esi,0xb8000
mov byte [SS:esi],34 ;;Что-то покажем(только опять таки дескриптор стёка должен быть нормален. Если объявить стёк размером 16кб с базой=0x120000, это не прокатит :) )
mov al,0x20
out 0x20,al
popa
iret
ну ты понел Кстати когда сам такое пИсал, SS как-то в голову не пришло. А ведь красиво получаеться, и всего +1 байт. Хотя канеш если в обработчике 200+ строк, активно работающих с памятью, то уже не выгодно.
Добавлено: Вт Сен 29, 2009 9:24 pm Заголовок сообщения:
R_NEW, Да, спасибо, IDT[0]=0; исправил. По коменту подправил, только все равно не пашет... Это же по выводу символа, с этим проблем нет, по-ламаковски тоже работает.
Добавлено: Ср Сен 30, 2009 7:08 pm Заголовок сообщения:
Хм, странно... Все заваливается еще не на обработке самого прерывания. Ставил в адрес обработчика прерывания адрес начала кода ядра, чтобы просто ядро перегружалось, но такого не происходит - все равно вылет. Как будто вообще IDT кривая. Пробовал самыми разными способами, и на асме, и на С, все перепробовал, все варианты - нет, вылет.