Dobrý den,
chtěl bych načíst program a spouštět jej tak, aby pořád vládl kernel a mohl upravovat chování programu. Aby v něm mohly být různé rozšířené funkce atd. Mám jediný problém - nemůžu spustit náhodnou část programu, něco udělat v kernelu a spustit další, jelikož to mohu rozseknout uprostřed úlohy, anebo useknu část instrukce - třeba parametry... Tak se ptám - jak funguje multitasking?
Děkuji.
Fórum › Assembler
Přidržení programu - multitasking
Ptám se na to, jak se řeší přepínání programů v multitaskingu... Tedy ne int instrukce, ale přepínání - běh více procesů naráz...
aha, u x86_32: máš task switching mechanismus (koukni do dokumentace). u x86_64 musíš všechno udělat ručně, ale TSS je potřeba furt (pro switch stacku při interruptu == každá úroveň privilegovanosti vyžaduje jinej stack). Při přepnutí kontextu musíš uložit obsah registrů stávající úlohy, nahrát obsahy registrů nové úlohy, vložit novou kořenovou tabulku pro Paging do CR3, nahrát novej TSS do TR a pak skočit na přerušenou adresu. Pro vyvolávání handleru scheduleru použij timer (využij APIC jádra).
Já se ptám hlavně, jak vykonat část programu, aniž bych jej utnul uprostřed instrukce atp. Neřeším teď přímo multitasking - to je další bod v programu... :D
(Jak píši - chci mít kontrolu nad tím procesem (ne do něj tupě skočit - do adresy v RAM - chci jej vykonávat za pomoci/kontroly kernelu) - z toho pak udělám ten multitasking...)
Uprostřed instrukce ho prostě neutneš ... furt nechápu tvou otázku, dycky budeš muset tupě skočit na adresu v paměti. Jinak kontrolu asi nebudeš mít takovou jak si přeješ (a co ochrana paměti hmm ...) ... kernel není VM.
#6 Seph
Tak znovu - jak tedy spustit část jednoho programu, část dalšího,...? Na to se ptám - jak to právě nerozseknout uprostřed instrukce... Co píšeš nedává smysl - pokud opustím toho, co mi zařizuje multitasking, tak to přeci neskočí na další program...
obvykle se to dela casovacem, ktery vyvola preruseni... uprostred instrukce se prerusit neda, ale preruseni muze prerusit cokoliv neatomickeho (obvykle cokoliv, co se neda udelat jednou instrukci, nebo nezakaze preruseni)
a jak se to dela uz je tu zmineny...
dalsi zpusob je mit neco jako stavovy automat a vykonavat pokazde jednu akci (nesmi tam byt nic extremne dlouhyho nebo to aspon zaridit opakovanim stavu)
#9 KIIV
Ale to právě mám na mysli - jak zařídit, abych nepřerušil věc, co potřebuje více instrukcí? A hlavně si nedovedu představit, jak oddělit od sebe i jen 2/3 programy - když všechny mohou pracovat zrovna na jedné věci. Studuji MenuetOS a rozumím asi tak každé 5. věci... Doufal jsem, že se to dá nějak jednoduše vysvětlit... :D Snad se do toho nějak dostanu... :D
#11 Matěj Andrle
no jelikoz se task switching dela diky preruseni, ktery jen podvrhne jinou navratovou adresu (dalsi task) (puvodni si samozrejme musi ulozit), tak staci zabranit na ten moment preruseni (nez se vykona cast programu "atomicky")...
od sdílené paměti sou tady mutexy, kterejma si ji lockuješ. Rada, nepiš OS když neznáš pořádně funkci procesoru. Nastuduj oficiální dokumentaci k použité architektuře (asi x86 -> Intel má moc hezkou dokumentaci), a až pak něco tvoř, pokud bys tak udělal, bylo by ti to jasné.
Opravdu je ti jedno když přerušíš věc na více instrukcí, MÁŠ uloženej kontext procesu, takže můžeš kdykoli navázat znovu.
Pokud robíš na MP systému a máš aktivováno více jader, nastuduj taky paměťové bariéry (lfence,sfence,mfence) krom atomickejch instrukcí (prefix lock).
#15 Sefiros
Rozumím 86% MenuetOS na přijatelné úrovni. (kdybych se měl snažit pochopit každý krok - hledat každou instrukci - to bych u toho zestárl...) Bavil jsem se pouze a jen o multitaskingu... Tedy krom něj neznám moc dobře celkově vymoženosti chráněného režimu... Nemám problém s řadiči - sběrnicí - porty, segmenty/offsety atd. Ale chráněný režim - globální halda, stránkování paměti, swapování, multitasking atd. - to už je jiná káva.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Multitasking c# — založil Michal Š.
Preemptivní multitasking — založil anonym
Snímání a ošetření stisku/přidržení dvou kláves naráz — založil návštěvník
Úprava programu — založil Ondřej
Chyba v programu — založil choice_