Ëåêöèÿ 13

BIOS

AMI, Phoenix, Insyde
Ïåðâûé BIOS áûë ðàçðàáîòàí îäíîé èç ýòèõ êîìïàíèé.
Çàòåì äðóãàÿ êîìïàíèÿ ðàçðàáîòàëà òî÷íî òàêîé æå BIOS (ñ òî÷íî òàêèì æå èíòåðôåéñîì).
Intel - ïðè ðàçðàáîòêå ïëàòôîðìû ðàçðàáàòûâàåò ñâîé âíóòðåííèé BIOS (äëÿ îòëàäêè æåëåçà, òàêæå äëÿ ýòîãî ðàçðàáàòûâàåòñÿ SV OS).
Ïàðàëëåëüíî:
- Ðàçðàáîòêà Hardware ïëàòôîðìû -> ñïåöèôèêàöèè -> êîä -> (DFM) layout -> (DFM) Physical Verification (Cadence Design Systems, Calibra, ...) -> Manufacturing
- Ðàçðàáîòêà âíóòðåííåãî BIOS
- Ðàçðàáîòêà SV ñêðèïòîâ
- Ðàçðàáîòêà ôóíêöèîíàëüíîãî ñèìóëÿòîðà (â ñîîòâåòñòâèè ñî ñïåöèôèêàöèÿìè æåëåçà)

AMI - ðàçðàáîòàëà êîíñòðóêòîð äëÿ ðàçðàáîòêè BIOSîâ (AMI BIOS)
Phoenix - Òàéáåé (Taipei) (Òàéâàíü)

Îòëàäêà BIOS'à - ñ óñòðîéñòâîì ITP (In-Target Probe), îòëàä÷èê ITP.
Òî÷êè îñòàíîâà: hardware (àäðåñà òî÷åê îñòàíîâà - â òàáëèöå, ïðè âûïîëíåíèè êàæäîé èíñòðóêöèè åå àäðåñ ñðàâíèâàåòñÿ ñ àäðåñàìè â òàáëèöå) è software (èíñòðóêöèè â òî÷êàõ îñòàíîâà çàìåíÿþòñÿ íà èíñòðóêöèþ, âûçûâàþùóþ SW ïðåðûâàíèå, à ïðè îñòàíîâå ïåðåä âèçóàëèçàöèåé â îòëàä÷èêå èíñòðóêöèÿ âîññòàíàâëèâàåòñÿ).
HW òî÷êè îñòàíîâà ñèëüíî çàìåäëÿþò âûïîëíåíèå ïðîãðàììû ïîä îòëàä÷èêîì.
Hardware òî÷êè îñòàíîâà íóæíû, êîãäà îïåðàòèâíàÿ ïàìÿòü íå èíèöèàëèçèðîâàíà, òî åñòü êîãäà çàïèñü âìåñòî èíñòðóêöèè äðóãîé èíñòðóêöèè (à èìåííî, èíñòðóêöèè SWI) íåâîçìîæíà.

Êàê ïðîèñõîäèò îòëàäêà BIOS:
- çàïóñêàåòñÿ
- åñëè äîëãî í÷åãî íå ïðîèñõîäèò - ïðîâåðÿåòñÿ, ÷òî îí âûïîëíÿåò
- åñëè âûïîëíÿåòñÿ deadloop - èññëåäóåòñÿ, ÷òî ïðèâåëî ê åãî âûçîâó. Äëÿ ýòîãî âûïîëíåíèå çàïóñêàåòñÿ ñíà÷àëà ñ îïðåäåëåííûì êîëè÷åñòâîì øàãîâ (èíñòðóêöèè). Ïîñëå  âûïîëíåíèÿ ýòèõ øàãîâ ïðîâåðÿåòñÿ, ìû óæå â deadloop èëè íåò. Çàòåì ñíîâà ïðîèñõîäèò ëèáî çàïóñê ñíà÷àëà, ëèáî âûïîëíåíèå ïðîäîëæàåòñÿ (òîæå ñ îïðåäåëåííûì êîëè÷åñòâîì øàãîâ). Òàê ëîêàëèçóåòñÿ èíñòðóêöèÿ, ïðèâåäøàÿ â deadloop.


Ëåêöèÿ 14

Îïåðàöèîííûå ñèñòåìû.

Íàçíà÷åíèå ÎÑ - âûïîëíåíèå ïðèêëàäíûõ ïðîãðàìì.
Äâà ðåæèìà ïðîöåññîðà: ïîëüçîâàòåëüñêèé (äëÿ ïðèêëàäíûõ ïðîãðàìì) è ïðèâèëåãèðîâàííûé.

ÎÑ - ïðîãðàììà, ðàáîòàþùàÿ íà àïïàðàòóðå. Äîïîëíÿåò, èñïðàâëÿåò åå, ïðèñïîñîáëåíà ê íåé. Ïîçâîëÿåò ïðèêëàäíîé ïðîãðàììå áûòü ìàøèííî-íåçàâèñèìîé.

Ïðèìåðû îòëè÷èé ÎÑ, íåäîñòàòêè.
a)
Cadence Design Systems (DFM) - ÏÎ, ðàáîòàþùåå íà ðàçëè÷íûõ ÎÑ.
NC SIM - ñèìóëÿòîð ñåòåâîé êàðòû (Network Card).
Solaris â 3 ðàçà ìåäëåííåå Linux: íà Solaris EEPROM òåñò øåë 24 ÷àñà, íà Linux - 8 ÷àñîâ.
b)
Ó Windows íåò ðåàëüíîãî òàéìèíãà.
Íàïðèìåð, íóæíî ñèìóëèðîâàòü WiFi ñåòü. Èñïîëüçóåì äðàéâåð TUN/TAP (ñèìóëèðóåò íàëè÷èå ñåòåâîé êàðòî÷êè ó êîìïüþòåðà). Åñëè íóæíû òî÷íûå òàéìèíãè (strict timing sumulation), òî Windows íå ïîäõîäèò.
Linux - ñèñòåìà ðåàëüíîãî âðåìåíè => íà ýòîé ÎÑ ìîæíî ðåàëèçîâàòü strict timing simulation.

Îñíîâíîå ïîíÿòèå ÎÑ - ïðîöåññ. Ýòî ýêçåìïëÿð âûïîëíÿåìîé ïðîãðàììû, âêëþ÷àÿ òåê.çíà÷åíèÿ ðåãèñòðîâ è ïåðåìåííûõ.
Ó ïðîöåññà åñòü ïðîãðàììà, âõîäíûå äàííûå è ñîñòîÿíèå.
Àëãîðèòì ïëàíèðîâàíèÿ ïðîöåññîâ.

Ñîáûòèÿ, ïðèâîäÿùèå ê ñîçäàíèþ ïðîöåññîâ:
1. Èíèöèàëèçàöèÿ ñèñòåìû
2. Âûïîëíåíèå ðàáîòàþùèì ïðîöåññîì ñèñòåìíîãî âûçîâà, ïðåäíàçíà÷åíííîãî äëÿ ñîçäàíèÿ ïðîöåññà
3. Çàïðîñ ïîëüçîâàòåëÿ íà ñîçäàíèå íîâîãî ïðîöåññà
4. Èíèöèàöèÿ ïàêåòíîãî çàäàíèÿ

Çàâåðøåíèå ïðîöåññà:
1. Îáû÷íûé âûõîä (äîáðîâîëüíî)
2. Âûõîä ïðè âîçíèêíîâåíèè îøèáêè (äîáðîâîëüíî)
3. Âîçíèêíîâåíèå ôàòàëüíîé îøèáêè (ïðèíóäèòåëüíî)
4. Óíè÷òîæåíèå äðóãèì ïðîöåññîì (ïðèíóäèòåëüíî)

Ñîñòîÿíèÿ ïðîöåññîâ:
1. âûïîëíÿåìûé
2. ãîòîâûé (ïðèîñòàíîâëåííûé, ÷òîáû äàòü âîçì-òü âûïîëíåíèÿ äðóãîìó ïðîöåññó)
3. çàáëîêèðîâàííûé (íåñïîñîáíûé âûïîëíÿòüñÿ, ïîêà íå âîçíèêíåò êàêîå-íèáóäü âíåøíåå ñîáûòèå).
Ìåæäó ýòèìè ñîñòîÿíèÿìè - ÷åòûðå ïåðåõîäà: 1->2, 1->3, 3->2, 2->1.

Ïðîöåññû ïîòðåáëÿþò ðåñóðñû. Ïðîöåññ ìîæåò áûòü çàáëîêèðîâàí òåì, ÷òî çàïðîñèë äîñòóï ê ðåñóðñó, êîòîðûé íå ìîæåò áûòü ïðåäîñòàâëåí.
Åñëè âñå ïðîöåññû çàáëîêèðîâàíû, òî òàêàÿ ñèòóàöèÿ íàçûâàåòñÿ deadlock.

Ïðèìåð. Îáåäàþùèå ôèëîñîôû. Åñëè êàæäûé âçÿë ïàëî÷êó ñïðàâà (ðåñóðñ), òî ïàëî÷êà ñëåâà îêàæåòñÿ íåäîñòóïíà è âñå ïðîöåññû (ôèëîñîôû) îêàæóòñÿ çàáëîêèðîâàííûìè.


  
Çàäà÷à 1. Êàê îòñëåäèòü, ÷òî â ÎÑ âîçíèêëà ñèòóàöèÿ deadlock. Äåéêñòðà ðåøèë ýòó çàäà÷ó. Îáîçíà÷èì ñòðåëî÷êîé îò ðåñóðñà ê ïðîöåññó ñèòóàöèþ, êîãäà ðåñóðñ çàõâà÷åí ïðîöåññîì, à ñòðåëî÷êîé îò ïðîöåññà ê ðåñóðñó - êîãäà ðåñóðñ çàòðåáîâàí ïðîöåñîì. Åñëè â ýòîì ãðàôå (ãäå óçëû - ýòî ïðîöåññû è ðåñóðñû) åñòü çàìêíóòûé öèêë - òî äèàãíîñòèðóåòñÿ deadlock. Çàäà÷à 2. Êàê ðàçðåøèòü (ïðåîäîëåòü) deadlock. Ðåøåíèå Äåéêñòðû: îäèí èç ïðîöåññîâ îñâîáîæäàåò çàõâà÷åííûé ðåñóðñ. Íàïðèìåð, îäèí èç ôèëîñîôîâ êëàäåò ïàëî÷êó íà ñòîë (ñïðàâà).  ðåçóëüòàòå ñèäÿùèé ñïðàâà îò íåãî (òîò, êòî çàòðåáîâàë ýòîò ðåñóðñ) ñìîæåò âûïîëíÿòüñÿ (îáåäàòü).  ðåçóëüòàòå âûïîëíåíèÿ ýòîò ïðîöåññ îñâîáîæäàåò çàõâà÷åííûå ðåñóðñû (îáå ïàëî÷êè) è äðóãèå ïðîöåññû ñìîãóò èõ çàõâàòèòü (ñîñåäè ñïðàâà è ñëåâà îò çàêîí÷èâøåãî îáåä).  ÎÑ åñòü òàáëèöà ïðîöåññîâ. Òàáëèöà ïðîöåññîâ ñîäåðæèò: - òåêóùåå ñîñòîÿíèå ðåãèñòðà ñ÷åò÷èêà êîìàíä - òåêóùåå ñîñòîÿíèå ðåãèñòðà óêàçàòåëü ñòåêà - ðàñïðåäåëåíèå ïàìÿòè - ñîñòîÿíèå îòêðûòûõ ôàéëîâ - ó÷åòíàÿ è ïëàíèðîâî÷íàÿ èíôîðìàöèÿ - âñå îñòàëüíîå, ÷òî ä.á. ñîõðàíåíî Threads (íèòè, ïîòîêè). Ïðèìåð: òåñòîâûé ðåäàêòîð, ôîíîâûå ïðîöåññû. Ïîòîêè ïîçâîëÿþò ðàñïàðàëëåëèâàòü ðàáîòó, ñîõðàíèâ èäåþ ïîñëåäîâàòåëüíûõ ïðîöåññîâ, îñóùåñòâëÿþøèõ áëîêèðóþùèå ñèñòåìíûå âûçîâû. Ïðèìåð èñïîëüçîâàíèÿ íèòåé. Òðè ñïîñîáà ðåàëèçàöèè ñåðâåðà: 1. Ïîòîêè - ïàðàëëåëüíàÿ ðàáîòà, áëîêèðóþùèå ñèñòåìíûå âûçîâû 2. Îäíîïîòî÷íûé ïðîöåññ - îòñóòñòâèå ïàðàëëåëüíîé ðàáîòû, áëîêèðóþùèå ñèñòåìíûå âûçîâû 3. Ìàøèíà ñ êîíå÷íûì ÷èñëîì ñîñòîÿíèé - ïàðàëëåëüíàÿ ðàáîòà, íåáëîêèðóþùèå ñèñòåìíûå âûçîâû, ïðåðûâàíèÿ Ïàðàëëåëüíûå ïðîöåññû (è íèòè) òðåáóþò ñèíõðîíèçàöèè äîñòóïà ê ðàçäåëÿåìûì (îáùèì) ðåñóðñàì. Ðàçäåëÿåìûå ðåñóðñû ó ïðîöåññîâ: 1) Ôàéëû 2) Óñòðîéñòâà ââîäà/âûâîäà 3) Shared memory ... Ó íèòåé ðàçäåëÿåìûå ðåñóðñû: 1) Ôàéëû 2) Óñòðîéñòâà ââîäà/âûâîäà 3) Ãëîáàëüíûå ïåðåìåííûå - òàê êàê ó íèõ îáùèé êîä è îáùàÿ îáëàñòü îïåðàòèâíîé ïàìÿòè. Linux, ñòàíäàðò POSIX: int num = 0; int main(void) { pthread_create(..., ..., func, &x); pthread_create(..., ..., func, &x); } void func(void *arg) { while (1) { if (...) ++num; } } ++: LDR R0, &num (R0 := 0) --> LDR R0, &num (R0 := 0) INC R0 (R0 := 1) -- INC R0 (R0 := 1) Ïåðåäàåòñÿ óïðàâëåíèå âòîðîé íèòè STR R0, &num (num := 1) <---- STR R0, &num (num := 1)  ðåçóëüòàòå num == 1 âìåñòî 2 Äëÿ èñêëþ÷åíèÿ òàêèõ îøèáîê òðåáóåòñÿ ñèíõðîíèçàöèÿ äîñòóïà ê ðàçäåëÿåìûì ðåñóðñàì Îïåðàöèÿ ïî èçìåíåíèþ çíà÷åíèÿ ïåðåìåííîé äîëæíà àòîìàðíîé îïåðàöèåé (òî åñòü åå íåëüçÿ ïðåðâàòü). Êðèòè÷åñêàÿ ñåêöèÿ - êîä, âûïîëíåíèå êîòîðîãî íå äîëæåí áûòü ïðåðâàíî ïåðåêëþ÷åíèåì íà âûïîëíåíèå äðóãîé íèòè.