Создадим О/С (перемешено из форума "Операционные системы")
Подключайтесь к созданию новой мультизадачной операционной системы!
[email]gladkih@hot.ee[/email]
Да, лучше всего именно програмным методом через таймер, но лучше использовать таймер локального APIC, чем внешний таймер, так будет намного быстрее.
Мда. Я считал всегда, что то, что делает сам процессор происходит быстрее. И мне удобнее. Есть над чем подумать.
Интересно поразмышлять над вашей фразой "надо не через TSS, а через таймер ":)
Ну сработал таймер, а дальше ведь надо на задачу переключатся, сохранять т.н. контекст процессора.
Вот я вас и спрашивал - сохранять ли ПОЛНЫЙ контекст КАЖДОГО процесса или нет? То-есть, должны ли быть процессы АБСОЛЮТНО друг от друга независимыми
Получилось ли у кого что-нибудь по линии неработающего на Аварде ядра?
Мда. Я считал всегда, что то, что делает сам процессор происходит быстрее. И мне удобнее. Есть над чем подумать.
Интересно поразмышлять над вашей фразой "надо не через TSS, а через таймер ":)
Ну сработал таймер, а дальше ведь надо на задачу переключатся, сохранять т.н. контекст процессора.
Вот я вас и спрашивал - сохранять ли ПОЛНЫЙ контекст КАЖДОГО процесса или нет? То-есть, должны ли быть процессы АБСОЛЮТНО друг от друга независимыми
Ну естественно должны.
В МенуэтОСе программа постороена по принципу общего цикла - то-есть, когда
происходит прерывание от какого-то источника, кроме таймера, оно обрабатывается, и данные сохраняются, ставятся соответствующие флаги.
Когда же происходит прерывание от таймера, то(здесь и начинается собственно, действо) программа смотрит, не нажата ли клавиша на клавиатуре, на мыши и т.д.
ели да - переходит куда положено, если нет - идет далее, просто главный цикл.
Мне это не очень нравится.
Вспомните Visual Basic и Visual C.
Там каждому событию в программе выделяется особая подпрограмма, ну там
key_down или что еще. Произошло данное действо - вызывается такая подпрограмма. Неудобно это тем, что(по крайней мере, в VB это так) если надо где-то среди программы подождать, пока не нажмут клавишу(ну художественная задумка такая), придется либо в подпрограмме key_down вести таблицу, что нажато, а что - нет, или просто один флаг, в другом месте - это анализировать.
Либо оформить нужный кусок в виде подпрограммы и вызывать ее из key_down.
Но если это главный код, так не сделаешь.
Мне это не нравится.
В MN-DOS будет сделано так:
Если по алгоритму надо отдельную подпрограмму, создается процесс, вызывается специальная регистрирующая функция, в качестве аргумента в одном из регистров - адрес начала процесса. Если возникает потребность в ожидании вне специального процесса, вызывается та же функция, но со смещением следующей команды. Какие идеи?
Кстати, в одном из документов вроде советов по программированию на Ассемблере нашел т.н. Puzzle: Сколько команд минимум надо, чтобы заполнить содержимым AL верхнюю часть EAX и AH? Ответ был довольно прикольным...
Это по поводу оптимизации.
Есть ли у кого пособие :), где расписаны команды процессора и их длина в байтах, может быть, кол-во циклов. Был у меня, да сгинул со старым НЖМД.
Да, народ! Кто из дизайнёров помнит, как сделать, чтобы текст в Тех. подробностях был мааленьким, но с полосой прокрутки. А то что-то у меня не выходит.
Мда. Я считал всегда, что то, что делает сам процессор происходит быстрее.
Как правило все наоборот - чем сложнее команда, тем дольше ее выполняет процессор по сравнению с аналогичной последовательностью простых команд. Ну вот тебе навскидку пара примеров:
ENTER
LEAVE
LOOP
LODSx
SCASx
И мне удобнее. Есть над чем подумать.
Интересно поразмышлять над вашей фразой "надо не через TSS, а через таймер ":)
Ну сработал таймер, а дальше ведь надо на задачу переключатся, сохранять т.н. контекст процессора.
Вот я вас и спрашивал - сохранять ли ПОЛНЫЙ контекст КАЖДОГО процесса или нет? То-есть, должны ли быть процессы АБСОЛЮТНО друг от друга независимыми
Конечно!
Я тут подумал - это ж сколько команд и усилий надо, чтобы сохранить контекст программно... А возможно ли вообще сохранить ВСЕ ТЕ данные?
Безусловно. Единственное, что нужно от TSS - это ESP0 и SP0, т.е. достаточно иметь по одной TSS на микропроцессор, только для того, чтобы пользовательские приложения могли осуществлять системные вызовы.
Что-то мне кажется, что TSS все же быстрее будет...
Уже давно все проверили и такты посчитали :) Ни одна из современных ОС TSS не использует. TSS - это такой атавизм вроде реального режима - избавиться легко, но потеряешь совместимость с кучей ПО :)
Если кому надо поговорить СО МНОЙ, в будни - за два, в выходные - за день напишите об этом на [email]mndos@narod.ru[/email].
А до этого на вопрос должны ли быть процессы независимыми, ты ответил:
Но в таком случае регистры процессов будут смешиваться, а это не хорошо...
(изивиняюсь за жутко "кривой" язык, просто устал сильно.)
Наблюдается любопытная тенденция - все мои респонденты делятся на тех, кто занимается теоритическими вопросами, и тех, кто критикует ту или иную реализацию их...
А до этого на вопрос должны ли быть процессы независимыми, ты ответил:
Но в таком случае регистры процессов будут смешиваться, а это не хорошо...
Почему регистры будут смешиваться? Я говорил, что вместо использования TSS для сохранения контекста процессора, быстрее сохранить его вручную. Но проблема в том, что для переключения из третьего кольца в нулевое TSS все таки понадобится (она должна хранить регистры стека нулевого кольца). Все другие современные процессоры не имеют аналогов TSS, а реализуют ту или иную форму команды SYSCALL предназначенной именно для системного вызова. Начиная с Pentium II интеловские процессоры имеют команду SYSENTER и если я ничего не перепутал, TSS теперь не нужна вообще (впрочем я могу ошибаться)
Вот кстати программное переключение:
http://www.o3one.org/sources/oz_kernel_486.s
Наблюдается любопытная тенденция - все мои респонденты делятся на тех, кто занимается теоритическими вопросами, и тех, кто критикует ту или иную реализацию их...
Да, все мы разные :)
А до этого на вопрос должны ли быть процессы независимыми, ты ответил:
Но в таком случае регистры процессов будут смешиваться, а это не хорошо...
(изивиняюсь за жутко "кривой" язык, просто устал сильно.)
Наблюдается любопытная тенденция - все мои респонденты делятся на тех, кто занимается теоритическими вопросами, и тех, кто критикует ту или иную реализацию их...
Да, тяжело вам... Объясняю все по порядку(по поводу переключения задач). Во-первых, TSS нам нужен только для переключения стека супервизора, побитовой карты ввода-вывода и для реализации VM86.
Все остальное легче делать ручками, а собственно и делать-то нечего. Почему? Смотрите: переключение задач возможно только после прерывания(таймера или системного вызова) одной задачи, при этом ВЕСЬ контекст уже сохранен процедурой обработки прерывания! Остается только перегрузить стек и указатель комманд и TR, а т.к. задача до этого ОБЯЗАТЕЛЬНО была прервана(т.е. она находилась в режиме ядра!), то весь ее контекст УЖЕ сохранен и востановиться автоматически коммандой возврата из обработчика прерывания(надеюсь механизм их обработки у вас уже проработан).... Единственная сложность -- старт новой задачи, но это обходиться 2 путями:
* использовать модель процессов UNIX -- тогда весь контекст наследуеться от предка
** просто имитировать возврат из прерывания
На конец, шлю соответствующий фрагмент из STiNG/0.00a на так любимом вами АСМЕ...
------
Если чего-то не понятно -- обращайтесь...
Ну и что НОВОГО ты этим сказал? Это и так было понятно...
Я говорил о том, что в твоем ответе наблюдалось противоречие, примерно такое
Да, мы должны, но все же этого делать не следует... :D
И, если не секрет, откуда такие сведения о TSS? Где можно об этом почитать подробнее?
после прерывания(таймера или системного вызова) одной задачи, при этом
ВЕСЬ контекст уже сохранен процедурой обработки прерывания!
Что-то я ничего не понял! Кто УЖЕ сохранил контекст? К. ядра-то сохраняется автоматически, а процессов - нет.
Что-то я ничего не понял! Кто УЖЕ сохранил контекст? К. ядра-то сохраняется автоматически, а процессов - нет.
Давайте определимся, что такое контескст задачи. Контесктом мы называем всю информацию, которая описывает состояние задачи в данный момент времени:
1. Регистры общего назначения
2. Сегментные регистры
3. Указатель команд
4. Адресное пространство(при использовании страничной организации памяти его описывает регистр CR3)
(1) При входе в обработчик перывания НЕОБХОДИМО сохранить *регистры* общего назначения данной задачи. Это ясно. Собственно при вызове прерывания автоматически сохраняется eip, cs, eflags. остается только сохранить сегментные регистры. Ок.(Все эти данные сохраняються в стеке "старой" задачи)
(2) Эти же регистры должны быть восстановлены при возврате из обработчика прерывания...
Так вот, именно переключение происходит до выполнения (2)! А это означает, что любая НЕАКТИВНАЯ задача находиться после выполнения (1), но до выполнения (2). Таким образом вся информация сохранена и мы можем спокойно переключать cr3 загружать ss:esp и eip(только надо не забіть установить eip "старой" на спец. точку возврата).... О "старой" задаче мы не переживаем...
-----------------------
Для большей убедительности вышесказанного шлю еще больше исходников STiNG/0.00a....
-----------------------
Если вам все понятно, то зачем же говорить глупости? Sorry за грубость и хамство ...
-----------------------
:) :)
Все это, конечно, хорошо, но после очередного прерывания, если процесс слишком долгий, его надо "вырубить" - принцип разделения процессорного времени все же действует.
И, если не секрет, откуда такие сведения о TSS? Где можно об этом почитать подробнее?
news:alt.os.development - очень полезный ресурс :)
Если по алгоритму надо отдельную подпрограмму, создается процесс, вызывается специальная регистрирующая функция, в качестве аргумента в одном из регистров - адрес начала процесса. Если возникает потребность в ожидании вне специального процесса, вызывается та же функция, но со смещением следующей команды. Какие идеи?
Мда... бред... Учите теоретические вопрросы создания ОС!
Мда... бред... Учите теоретические вопрросы создания ОС!
Чтооо? Это чё, конкретный наезд? :D Ладно, если без шуток: Если что-то не понял - так и напиши. По-моему, все четко, но может, кому-то и покажется бредом...
Вот сделаю ядро в минимальном объёме, чтобы несколько задач и переключение в ткстовом режиме, тогда выложу исходники.
Всё же, кто знает как в З/Р ВЕСА запрограммировать, напишите, пожалуйста... буду благодарен неизмеримо.
Брось ты этот З/Р. гадость это, пользы нет один гимор.
Брось ты этот З/Р. гадость это, пользы нет один гимор.
Гыгыгы точно real mode forever :D
Брось ты этот З/Р. гадость это, пользы нет один гимор.
Ышшо один юморист? А то был тут один до тебя, говорил, что все процессоры совместимы %)
Ышшо один юморист? А то был тут один до тебя, говорил, что все процессоры совместимы %)
Действительно юморист, а что, хмм... Я - электронщик и сейчас разрабатываю новый тип процессора, для ххх. Так вот - в ядре камня(пока еще и камня то нету, только куски - прототипов модулей ядра), точнее в дешифраторе команд, есть одна фича, в кратце, а иначе и не выйдет - посредством загрузки программно в специальную память дешифратора таблиц перекодировки команд, процессор к примеру, сможет работать как любой иной любой иной фирмы... Однако только на уровне интерфейса комманд, на деле архитектура его этого пока не позволяет(работа над ним, стоит уйму денег, из-за этого в последнем квартале 2002 мы сорвали график работы), пока...
Mitja, я порылся в исходнике твоего "ядра" :) и вот что обнаружил (см. приаттаченный файл). Может поможет. Мои комментарии начинаются с ";*** ". Сильно не ругать если что не так - давно не асмовал.
Ничего, что я тоже поругаю? :)
;*** А в ss то что? Может там страшное что-то :)
;*** Вот ты в sp 0fffh загоняешь, а может ss где то в районе 6c0+ оказался,
;*** вот тебе стек код и перепишет. Хотя может и бред, но имхо ситуация реальная :)
;*** Исходя из этих причин есть маленькая вероятность, что следующие операции все порушат
Насчет стека замечание верное. До установки SS использовать стек - дело гиблое :)
; MOV EAX,CR0
;
;*** Здесь лучше использовать
; bts eax, 0
;
;*** вместо OR EAX,1
;*** bts жрет 4 байта, or - 5
;
Оптимизаторы, блин :) Вот как надо: or al, 1. Или inc al - обе команды занимают по два байта.
; MOV CR0,EAX ; собственно переход в защищенный режим
;
;*** А еще лучше (имхо):
mov ax, 1
lmsw ax
;*** В общем я надеюсь, этот вариант заработает везде :) Попробуй, у меня такого
;*** asm'а нету, скомпилить не могу.
Нет, это не лучше! Это отвратительно! :) Цитирую интеловское System Programming Guide: The LMSW and SMSW instructions operate on bits 0 through 15 of control register CR0. These instructions are provided for compatibility with the 16-bit intel 286 processor. Programs written to run on 32-bit IA-32 processors should not use these instructions. Instead, they should access the control register CR0 using the mov instruction.
Я бы прислушался к советам Intel :)
Ничего, что я тоже поругаю? :)
Ничего :)
Оптимизаторы, блин :) Вот как надо: or al, 1. Или inc al - обе команды занимают по два байта.
Ну можно и так :) Но mov ax, 1 лучше, т.к. не надо считывает значение cr0 (оно и не нужно в принципе)
Нет, это не лучше! Это отвратительно! :) Цитирую интеловское System Programming Guide: The LMSW and SMSW instructions operate on bits 0 through 15 of control register CR0. These instructions are provided for compatibility with the 16-bit intel 286 processor. Programs written to run on 32-bit IA-32 processors should not use these instructions. Instead, they should access the control register CR0 using the mov instruction.
Я бы прислушался к советам Intel :)
Да, я знаю что это только для совместимости с 286, но ведь - работает! :D Кстати Linux именно так в З/Р переходит :) И если эту команду в Intel оставили, то уже не уберут никогда. По сути сам реальный режим тоже присутствует из-за совместимости, и ничего, используем его :)
Оптимизаторы, блин :) Вот как надо: or al, 1. Или inc al - обе команды занимают по два байта.
Ну тогда уж inc ax - 1 байт :D
Ну тогда уж inc ax - 1 байт :D
Блин, такими темпами оптимизации мы скоро кернел в бутсектор запихнем :D
Да, я знаю что это только для совместимости с 286, но ведь - работает! :D Кстати Linux именно так в З/Р переходит :)
Да, я знаю, что Linux так переходит :) Наверно в 1991 году Linus еще всех тонкостей не знал, а потом лень было менять :) Но есть прблема - биты 6-15 регистра CR0 сейчас зарезервированы и помещать в них 0 - не очень хорошая идея.
Да, я знаю, что Linux так переходит :) Наверно в 1991 году Linus еще всех тонкостей не знал, а потом лень было менять :) Но есть прблема - биты 6-15 регистра CR0 сейчас зарезервированы и помещать в них 0 - не очень хорошая идея.
Хмм даже если Intel выпустит новый процессор в котором эти биты будут использоваться, заменить lmsw на mov дело двух секунд :) В Linux даже не надо заботиться о размере, потому как переход в з/р не в бутсекторе. Кстати, может заменить и Линусу патч отправить? Хмммм... :D
А про то, что LMSW и парную инструкцию лучше не использовать, я тоже слышал.
Вроде, как даже это не считается стандартом, т.е. в каком-то процессоре этой команды может не быть.
Про стек. Стек определяется еще в загрузчике. при переходе на ядро-то не меняется.
И еще: Во всех подобных ситуациях я обращаюсь к примеру MenuetOS - она у меня почти везде работает. И критичные инструкции я сравниваю с инструкциями Menuet.
Кажется, вырисовывается дотация :) на новый НЖМД для моего лаптопа, значит, разаработки разморозятся.
Смотри выше.
; mov ax, REALSTART-2 ; организуем стек
Да это все копирование. Случайно продублировал.
Точно в нужную, да и в оригинале она есть. А в "отладочном" варианте забыл.
Тогда где бы посмотреть на исходник загрузчика, может там что не так?
Уже нашел :) Copyright смешной :)))
Уже нашел :) Copyright смешной :)))
А это так... не серьезно. Основоное назначение - бирка.
Я попробовал в максимально усеченном варианте - и со старым, и с новым стеком работает. А полный и с cld, и без, с новым стеком, со старым - все равно не работает. По-моему, дело в другом.
Ах, да!
Я попробовал в максимально усеченном варианте - и со старым, и с новым стеком работает. А полный и с cld, и без, с новым стеком, со старым - все равно не работает. По-моему, дело в другом.
Выложи где нибудь максимально усеченный вариант и полный.
Пробовал IDT размещать в ядре, а смещения не из вспомогательной таблицы в сааамом низу текста запихивать, а оставлять равными IRQ0 и EXCDUMMY.
Теперь не перезагружается, а зависает. Прогресс не стоит на месте! :D
Все-все-все!
Подключайтесь к созданию новой мультизадачной операционной системы!
[email]gladkih@hot.ee[/email]
Тоже когда-то была мечта написать свою ОСь. Писал на асме. Была реализована тоже многозадачность, страничная адресация, ввод/вывод... Но Столкнулся с проблемой - всю ось на асме написать нереально. Советую переходить на С(или другой ЯВУ) и чем раньше, тем лучше. Ессесно с асм вставками. На этом моя ось остановилась.
Компилятор хороший нашел только djgpp/gcc.
Тоже когда-то была мечта написать свою ОСь. Писал на асме. Была реализована тоже многозадачность, страничная адресация, ввод/вывод... Но Столкнулся с проблемой - всю ось на асме написать нереально. Советую переходить на С(или другой ЯВУ) и чем раньше, тем лучше. Ессесно с асм вставками. На этом моя ось остановилась.
Компилятор хороший нашел только djgpp/gcc.
Ты его не убедишь, он ярый фанатик асма :)