Многозадачность
Никак не получается реализовать многозадачность...
В общем суть такова что при инициализации всего этого хозяйства я писал стото вроде этого:
mov ax, 0x20
ltr ax
за этим идет код выводящий графику в левую часть экрана - зацыклено... код первой задачи...
таймер должен переключать задачи... дальним переходом на селектор 0х28, но что то работает не так... не хватает ума...
короче не получается у меня переключаться с задачи на задачу... хотя все остальное работает превосходно....
люди - кто программировал ОС на ассемблере - подскажите плиз на примере... буду очень благодарен...
И вопрос на засыпку - можно реализовать многозадачность без использования TSS дескрипторов
Люди, помогите плиз!!!
Никак не получается реализовать многозадачность...
Один пример переключения задач я разместил у себя
на сайте.
Можно. Но это сложнее.
Люди, помогите плиз!!!
Никак не получается реализовать многозадачность...
Могу сказать одно: зайди на сайт Менуэт ОС:
menuet.narod.ru
От туда скачай исходники оси и гляди, сколько влезет. :) Там очень, ОЧЕНЬ много всего полезного. Исходники не плохие.
Могу сказать одно: зайди на сайт Менуэт ОС:
menuet.narod.ru
От туда скачай исходники оси и гляди, сколько влезет. :) Там очень, ОЧЕНЬ много всего полезного. Исходники не плохие.
Исходник Менуэта копал перекопал, много ценного для себя оттуда изъял... :) но у меня не получилось реализовать многозадачность все равно... толи в дескрипторах TSS, толи в еще в чем то... может оно не хочет работать без реализации страничной памяти...
Найти бы хотя бы маленьки пример на асме - где существует к примеру две задачи которые переключаются по таймеру...
А поповоду Менуэта - мне не нравится как она реализована... хотя можно от туда взять много полезных вещей...
В менуэте может быть, судя по коду - 120 процесов/задач
тока взять =) но ни как полезного от всей оси нету
>В менуэте может быть, судя по коду - 120 процесов/задач
нехера.. до 7.6 было так
0x90000 - Сюда загружается файл
Заголовок файла
+0 -24 db 'MENUET00' ; 8 byte id
+8 -20 dd 38 ; required os (место загрузки в память)
+12 -16 dd START ; program start (смещение START)
+16 -12 dd I_END ; program image end (смещение I_END)
+20 -8 dd 0x100000 ; reguired amount of memory
+24 -4 dd 0x00000000 ; reserved=no extended header
+28 -0 START:
Стартовая область програм начинается с 0x800000 С адреса 0xfb00 область в 256 байт ответственная каждым байтом за запущеный процесс, вход в область начинается с 8 (Почему так не знаю)
Если имеем два процесса запущенных в системе один за другим, то:
0xfb08 01 (Указывает что процесс уже занимает область памяти c 0x800000)
0xfb09 01 (Указывает что процесс уже занимает область памяти c 0x800000+0x100000)
0xfb0a 00 Область памяти 0x800000+0x200000 свободна
Нетрудно догадаться что на каждый процесс отводится по 1 Мб памяти начиная с области 0x800000, т.е. 8Мб, при достижении 27Мб новые процессы в системе запускаться не будут ;-(
Таким образом всего (27-8)= 19 процессов максимум
Задача грузится в область памяти вместе с заголовком поэтому простой способ получить доступ к абсолютному адресу загрузки - mov eax, START-20
...
Нетрудно догадаться что на каждый процесс отводится по 1 Мб памяти начиная с области 0x800000, т.е. 8Мб, при достижении 27Мб новые процессы в системе запускаться не будут ;-(
Таким образом всего (27-8)= 19 процессов максимум
...
Да откуда ты взял, что при достижении 27 метров новы процессы в системе запускаться не будут... из вышенаписанного я этого не понял...