Rev 1962 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1962 | Rev 3539 | ||
---|---|---|---|
1 | ; Copyright (c) 2008-2009, diamond |
1 | ; Copyright (c) 2008-2009, diamond |
2 | ; All rights reserved. |
2 | ; All rights reserved. |
3 | ; |
3 | ; |
4 | ; Redistribution and use in source and binary forms, with or without |
4 | ; Redistribution and use in source and binary forms, with or without |
5 | ; modification, are permitted provided that the following conditions are met: |
5 | ; modification, are permitted provided that the following conditions are met: |
6 | ; * Redistributions of source code must retain the above copyright |
6 | ; * Redistributions of source code must retain the above copyright |
7 | ; notice, this list of conditions and the following disclaimer. |
7 | ; notice, this list of conditions and the following disclaimer. |
8 | ; * Redistributions in binary form must reproduce the above copyright |
8 | ; * Redistributions in binary form must reproduce the above copyright |
9 | ; notice, this list of conditions and the following disclaimer in the |
9 | ; notice, this list of conditions and the following disclaimer in the |
10 | ; documentation and/or other materials provided with the distribution. |
10 | ; documentation and/or other materials provided with the distribution. |
11 | ; * Neither the name of the |
11 | ; * Neither the name of the |
12 | ; names of its contributors may be used to endorse or promote products |
12 | ; names of its contributors may be used to endorse or promote products |
13 | ; derived from this software without specific prior written permission. |
13 | ; derived from this software without specific prior written permission. |
14 | ; |
14 | ; |
15 | ; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka |
15 | ; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka |
16 | ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
16 | ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
17 | ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
17 | ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
18 | ; DISCLAIMED. IN NO EVENT SHALL |
18 | ; DISCLAIMED. IN NO EVENT SHALL |
19 | ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
19 | ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
20 | ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
20 | ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
21 | ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
21 | ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
22 | ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
22 | ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
23 | ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
23 | ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
24 | ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 | ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
25 | ;***************************************************************************** |
25 | ;***************************************************************************** |
26 | 26 | ||
27 | Íåò ïîâåñòè ïå÷àëüíåå íà ñâåòå, |
27 | Нет повести печальнее на свете, |
28 | ×åì ïîâåñòü î çàêëèíèâøåì Reset'å... |
28 | Чем повесть о заклинившем Reset'е... |
29 | 29 | ||
30 | Çàãðóç÷èê äëÿ FAT- è NTFS-òîìîâ äëÿ ñëó÷àåâ, êîãäà îñíîâíîé áóòñåêòîð çàãðóæàåò |
30 | Загрузчик для FAT- и NTFS-томов для случаев, когда основной бутсектор загружает |
31 | Windows, äëÿ íîñèòåëåé ñ ðàçìåðîì ñåêòîðà 512 áàéò. |
31 | Windows, для носителей с размером сектора 512 байт. |
32 | 32 | ||
33 | ===================================================================== |
33 | ===================================================================== |
34 | 34 | ||
35 | Òðåáîâàíèÿ äëÿ ðàáîòû: |
35 | Требования для работы: |
36 | 1) Âñå èñïîëüçóåìûå ôàéëû äîëæíû áûòü ÷èòàáåëüíû. |
36 | 1) Все используемые файлы должны быть читабельны. |
37 | 2) Ìèíèìàëüíûé ïðîöåññîð - 80386. |
37 | 2) Минимальный процессор - 80386. |
38 | 3) Â ñèñòåìå äîëæíî áûòü êàê ìèíèìóì 592K ñâîáîäíîé áàçîâîé ïàìÿòè. |
38 | 3) В системе должно быть как минимум 592K свободной базовой памяти. |
39 | 4) Ïóòè ê èñïîëüçóåìûì ôàéëàì íå äîëæíû ñîäåðæàòü ñèìâîëè÷åñêèõ ññûëîê NTFS |
39 | 4) Пути к используемым файлам не должны содержать символических ссылок NTFS |
40 | (æ¸ñòêèå ññûëêè äîïóñêàþòñÿ). |
40 | (жёсткие ссылки допускаются). |
41 | 5) Èñïîëüçóåìûå ôàéëû íå äîëæíû áûòü ñæàòûìè èëè ðàçðåæåííûìè ôàéëàìè |
41 | 5) Используемые файлы не должны быть сжатыми или разреженными файлами |
42 | (àêòóàëüíî äëÿ NTFS, äëÿ FAT âûïîëíåíî àâòîìàòè÷åñêè). |
42 | (актуально для NTFS, для FAT выполнено автоматически). |
43 | 43 | ||
44 | ===================================================================== |
44 | ===================================================================== |
45 | 45 | ||
46 | Äîêóìåíòàöèÿ â òåìó (ññûëêè ïðîâåðÿëèñü íà âàëèäíîñòü 08.08.2008): |
46 | Документация в тему (ссылки проверялись на валидность 08.08.2008): |
47 | îôèöèàëüíàÿ ñïåöèôèêàöèÿ FAT: http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx |
47 | официальная спецификация FAT: http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx |
48 | â ôîðìàòå PDF: http://staff.washington.edu/dittrich/misc/fatgen103.pdf |
48 | в формате PDF: http://staff.washington.edu/dittrich/misc/fatgen103.pdf |
49 | ðóññêèé ïåðåâîä: http://wasm.ru/docs/11/fatgen103-rus.zip |
49 | русский перевод: http://wasm.ru/docs/11/fatgen103-rus.zip |
50 | ñïåöèôèêàöèÿ NTFS: file://C:/windows/system32/drivers/ntfs.sys |
50 | спецификация NTFS: file://C:/windows/system32/drivers/ntfs.sys |
51 | è file://C:/ntldr ëèáî file://C:/bootmgr |
51 | и file://C:/ntldr либо file://C:/bootmgr |
52 | íåîôèöèàëüíîå îïèñàíèå NTFS: http://sourceforge.net/project/showfiles.php?group_id=13956&package_id=16543 |
52 | неофициальное описание NTFS: http://sourceforge.net/project/showfiles.php?group_id=13956&package_id=16543 |
53 | îôèöèàëüíàÿ ñïåöèôèêàöèÿ ðàñøèðåíèÿ EDD BIOS 3.0: http://www.phoenix.com/NR/rdonlyres/19FEBD17-DB40-413C-A0B1-1F3F560E222F/0/specsedd30.pdf |
53 | официальная спецификация расширения EDD BIOS 3.0: http://www.phoenix.com/NR/rdonlyres/19FEBD17-DB40-413C-A0B1-1F3F560E222F/0/specsedd30.pdf |
54 | òî æå, âåðñèÿ 1.1: http://www.phoenix.com/NR/rdonlyres/9BEDED98-6B3F-4DAC-BBB7-FA89FA5C30F0/0/specsedd11.pdf |
54 | то же, версия 1.1: http://www.phoenix.com/NR/rdonlyres/9BEDED98-6B3F-4DAC-BBB7-FA89FA5C30F0/0/specsedd11.pdf |
55 | îïèñàíèå ôóíêöèé BIOS: Interrupt List by Ralf Brown: http://www.cs.cmu.edu/~ralf/files.html |
55 | описание функций BIOS: Interrupt List by Ralf Brown: http://www.cs.cmu.edu/~ralf/files.html |
56 | îôèöèàëüíàÿ ñïåöèôèêàöèÿ Boot BIOS: http://www.phoenix.com/NR/rdonlyres/56E38DE2-3E6F-4743-835F-B4A53726ABED/0/specsbbs101.pdf |
56 | официальная спецификация Boot BIOS: http://www.phoenix.com/NR/rdonlyres/56E38DE2-3E6F-4743-835F-B4A53726ABED/0/specsbbs101.pdf |
57 | îôèöèàëüíîå îïèñàíèå bcdedit äëÿ Vista: http://www.microsoft.com/whdc/system/platform/firmware/bcdedit_reff.mspx |
57 | официальное описание bcdedit для Vista: http://www.microsoft.com/whdc/system/platform/firmware/bcdedit_reff.mspx |
58 | îôèöèàëüíîå îïèñàíèå ðàáîòû ñ áàçîé äàííûõ çàãðóç÷èêà Vista: http://www.microsoft.com/whdc/system/platform/firmware/bcd.mspx |
58 | официальное описание работы с базой данных загрузчика Vista: http://www.microsoft.com/whdc/system/platform/firmware/bcd.mspx |
59 | ôîðìàò òàáëèöû ðàçäåëîâ æ¸ñòêîãî äèñêà: http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/prork/prcb_dis_qxql.mspx |
59 | формат таблицы разделов жёсткого диска: http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/prork/prcb_dis_qxql.mspx |
60 | 60 | ||
61 | ===================================================================== |
61 | ===================================================================== |
62 | 62 | ||
63 | Ñõåìà èñïîëüçóåìîé ïàìÿòè: |
63 | Схема используемой памяти: |
64 | 600-2000 êîä çàãðóç÷èêà (è äàííûå) |
64 | 600-2000 код загрузчика (и данные) |
65 | 2000-3000 ñòåê |
65 | 2000-3000 стек |
66 | 3000-3200 ñåêòîð MBR |
66 | 3000-3200 сектор MBR |
67 | 3200-3400 áóòñåêòîð ëîãè÷åñêîãî äèñêà |
67 | 3200-3400 бутсектор логического диска |
68 | 3400-3C00 èíôîðìàöèÿ î êýøå äëÿ òàáëèö FAT16/FAT32: |
68 | 3400-3C00 информация о кэше для таблиц FAT16/FAT32: |
69 | äëÿ FAT16 - ìàññèâ íà 0x100 áàéò, êàæäûé áàéò ðàâåí |
69 | для FAT16 - массив на 0x100 байт, каждый байт равен |
70 | 0 èëè 1 â çàâèñèìîñòè îò òîãî, çàãðóæåí ëè |
70 | 0 или 1 в зависимости от того, загружен ли |
71 | ñîîòâåòñòâóþùèé ñåêòîð òàáëèöû FAT16; |
71 | соответствующий сектор таблицы FAT16; |
72 | äëÿ FAT32 - 100h âõîäîâ ïî 8 áàéò: 4 áàéòà |
72 | для FAT32 - 100h входов по 8 байт: 4 байта |
73 | (äâå ññûëêè - âïåð¸ä è íàçàä) äëÿ îðãàíèçàöèè L2-ñïèñêà |
73 | (две ссылки - вперёд и назад) для организации L2-списка |
74 | âñåõ ïðî÷èòàííûõ ñåêòîðîâ â ïîðÿäêå âîçðàñòàíèÿ |
74 | всех прочитанных секторов в порядке возрастания |
75 | ïîñëåäíåãî âðåìåíè èñïîëüçîâàíèÿ + 4 áàéòà äëÿ íîìåðà |
75 | последнего времени использования + 4 байта для номера |
76 | ñåêòîðà; ïðè ïåðåïîëíåíèè êýøà âûêèäûâàåòñÿ ýëåìåíò èç |
76 | сектора; при переполнении кэша выкидывается элемент из |
77 | ãîëîâû ñïèñêà, òî åñòü òîò, ê êîòîðîìó äîëüøå âñåõ |
77 | головы списка, то есть тот, к которому дольше всех |
78 | íå áûëî îáðàùåíèé |
78 | не было обращений |
79 | 3400-3440 èíôîðìàöèÿ î êýøå äëÿ ôàéëîâûõ çàïèñåé NTFS â |
79 | 3400-3440 информация о кэше для файловых записей NTFS в |
80 | òàêîì æå ôîðìàòå, êàê è êýø äëÿ FAT32, íî íà 8 âõîäîâ |
80 | таком же формате, как и кэш для FAT32, но на 8 входов |
81 | 3480-34C0 çàãîëîâêè äëÿ êýøåé çàïèñåé èíäåêñà NTFS |
81 | 3480-34C0 заголовки для кэшей записей индекса NTFS |
82 | 3500-3D00 èíôîðìàöèÿ î êýøàõ çàïèñåé èíäåêñà NTFS: ñ êàæäîé |
82 | 3500-3D00 информация о кэшах записей индекса NTFS: с каждой |
83 | ôàéëîâîé çàïèñüþ ñâÿçàí ñâîé êýø äëÿ |
83 | файловой записью связан свой кэш для |
84 | ñîîòâåòñòâóþùåãî èíäåêñà |
84 | соответствующего индекса |
85 | 4000-8000 ìåñòî äëÿ èíôîðìàöèè îá àòðèáóòàõ äëÿ NTFS |
85 | 4000-8000 место для информации об атрибутах для NTFS |
86 | 60000-80000 òàáëèöà FAT12 / ìåñòî ïîä òàáëèöó FAT16 / |
86 | 60000-80000 таблица FAT12 / место под таблицу FAT16 / |
87 | êýø äëÿ òàáëèöû FAT32 / êýø äëÿ ñòðóêòóð NTFS |
87 | кэш для таблицы FAT32 / кэш для структур NTFS |
88 | 80000-90000 òåêóùèé ðàññìàòðèâàåìûé êëàñòåð |
88 | 80000-90000 текущий рассматриваемый кластер |
89 | 90000-92000 FAT: êýø äëÿ êîðíåâîé ïàïêè |
89 | 90000-92000 FAT: кэш для корневой папки |
90 | 92000-... FAT: êýø äëÿ íåêîðíåâûõ ïàïîê (êàæäîé ïàïêå îòâîäèòñÿ |
90 | 92000-... FAT: кэш для некорневых папок (каждой папке отводится |
91 | 2000h áàéò = 100h âõîäîâ, îäíîâðåìåííî â êýøå |
91 | 2000h байт = 100h входов, одновременно в кэше |
92 | ìîæåò íàõîäèòüñÿ íå áîëåå 7 ïàïîê; |
92 | может находиться не более 7 папок; |
93 | òî÷íûé ðàçìåð îïðåäåëÿåòñÿ ðàçìåðîì äîñòóïíîé |
93 | точный размер определяется размером доступной |
94 | ôèçè÷åñêîé ïàìÿòè - êàê ïðàâèëî, íåïîñðåäñòâåííî |
94 | физической памяти - как правило, непосредственно |
95 | ïåðåä A0000 ðàçìåùàåòñÿ EBDA, Extended BIOS Data Area) |
95 | перед A0000 размещается EBDA, Extended BIOS Data Area) |
96 | 96 | ||
97 | ===================================================================== |
97 | ===================================================================== |
204 | áåçðåçóëüòàòíî, òàê ÷òî âûâîäèòñÿ ðóãàòåëüñòâî è ðàáîòà îñòàíàâëèâàåòñÿ |
204 | безрезультатно, так что выводится ругательство и работа останавливается |
205 | (jmp $). |
205 | (jmp $). |
206 | Ìîæåò âîçíèêíóòü âîïðîñ, çà÷åì íóæíà òàêàÿ ñëîæíàÿ ñõåìà è ïî÷åìó |
206 | Может возникнуть вопрос, зачем нужна такая сложная схема и почему |
207 | íåëüçÿ óçíàòü íóæíûé ëîãè÷åñêèé äèñê çàðàíåå èëè õîòÿ áû îãðàíè÷èòüñÿ |
207 | нельзя узнать нужный логический диск заранее или хотя бы ограничиться |
208 | ïåðâûì ïîïàâøèìñÿ ëîãè÷åñêèì äèñêîì, íå êðóòÿ öèêë. Òàê âîò, âàðèàíò |
208 | первым попавшимся логическим диском, не крутя цикл. Так вот, вариант |
209 | ñ ïðåäâàðèòåëüíûì îïðåäåëåíèåì íóæíîãî ðàçäåëà â äàííîì ñëó÷àå íå |
209 | с предварительным определением нужного раздела в данном случае не |
210 | èñïîëüçóåòñÿ, ïîñêîëüêó ïîâë¸ê áû çà ñîáîé íåòðèâèàëüíûå ëèøíèå |
210 | используется, поскольку повлёк бы за собой нетривиальные лишние |
211 | äåéñòâèÿ ïî óñòàíîâêå (â òåêóùåì âèäå óñòàíîâêó ìîæíî ïðîâåñòè âðó÷íóþ, |
211 | действия по установке (в текущем виде установку можно провести вручную, |
212 | è îíà ñâîäèòñÿ ê óêàçàíèþ ñèñòåìíîìó çàãðóç÷èêó íà ñóùåñòâîâàíèå |
212 | и она сводится к указанию системному загрузчику на существование |
213 | kordldr); êñòàòè, â àëüòåðíàòèâíîé âåðñèè çàãðóçêè ïîñëå |
213 | kordldr); кстати, в альтернативной версии загрузки после |
214 | Windows-çàãðóç÷èêà, êîãäà óñòàíîâêà îñóùåñòâëÿåòñÿ íå âðó÷íóþ, à |
214 | Windows-загрузчика, когда установка осуществляется не вручную, а |
215 | ñïåöèàëüíîé ïðîãðàììîé ïîä Windows, èñïîëüçóåòñÿ ìîäèôèöèðîâàííàÿ |
215 | специальной программой под Windows, используется модифицированная |
216 | âåðñèÿ, â êîòîðîé êàê ðàç íà÷àëüíûé ôèçè÷åñêèé ñåêòîð íóæíîãî ðàçäåëà |
216 | версия, в которой как раз начальный физический сектор нужного раздела |
217 | ïðîïèñûâàåòñÿ óñòàíîâùèêîì. Ñàì kordldr íå ìîæåò óñòàíîâèòü, ñ êàêîãî |
217 | прописывается установщиком. Сам kordldr не может установить, с какого |
218 | ðàçäåëà åãî çàãðóçèë Windows-çàãðóç÷èê (è âîîáùå ïîä NT/2000/XP îáÿçàí |
218 | раздела его загрузил Windows-загрузчик (и вообще под NT/2000/XP обязан |
219 | áûòü ôàéëîì íà äèñêå C:\). Âàðèàíò ñ ïåðâûì ïîïàâøèìñÿ ëîãè÷åñêèì |
219 | быть файлом на диске C:\). Вариант с первым попавшимся логическим |
220 | äèñêîì áûë ðåàëèçîâàí â ïåðâîé âåðñèè çàãðóç÷èêà, íî ïî õîäó äåëà |
220 | диском был реализован в первой версии загрузчика, но по ходу дела |
221 | îáíàðóæèëîñü, ÷òî òàêè íóæíî êðóòèòü öèêë: âî-âòîðûõ, ìîæåò áûòü |
221 | обнаружилось, что таки нужно крутить цикл: во-вторых, может быть |
222 | ïðèÿòíûì, ÷òî ñàìà ñèñòåìà ìîæåò ñòîÿòü âîâñå íå íà ñèñòåìíîì C:\, à è |
222 | приятным, что сама система может стоять вовсе не на системном C:\, а и |
223 | íà äðóãèõ äèñêàõ; âî-ïåðâûõ, äèñê C: ìîæåò è íå áûòü ïåðâûì ëîãè÷åñêèì |
223 | на других дисках; во-первых, диск C: может и не быть первым логическим |
224 | ðàçäåëîì - Vista ëþáèò ñîçäàâàòü ñêðûòûé ïåðâè÷íûé ðàçäåë ïåðåä |
224 | разделом - Vista любит создавать скрытый первичный раздел перед |
225 | ñèñòåìíûì, è òîãäà äèñê C: ñòàíîâèòñÿ âòîðûì ëîãè÷åñêèì. |
225 | системным, и тогда диск C: становится вторым логическим. |
226 | 6. Èçâåùàåò ïîëüçîâàòåëÿ î òîì, ÷òî ïðîèñõîäèò ïîïûòêà çàãðóçêè ñ î÷åðåäíîãî |
226 | 6. Извещает пользователя о том, что происходит попытка загрузки с очередного |
227 | ëîãè÷åñêîãî äèñêà. |
227 | логического диска. |
228 | 7. ×èòàåò ïåðâûé ñåêòîð ëîãè÷åñêîãî äèñêà è îïðåäåëÿåò ôàéëîâóþ ñèñòåìó. |
228 | 7. Читает первый сектор логического диска и определяет файловую систему. |
229 | È â FAT, è â NTFS ïîëå ñî ñìåùåíèåì +11 ñîäåðæèò ÷èñëî áàéò â ñåêòîðå |
229 | И в FAT, и в NTFS поле со смещением +11 содержит число байт в секторе |
230 | è äîëæíî ñîâïàäàòü ñ õàðàêòåðèñòèêîé ôèçè÷åñêîãî íîñèòåëÿ, òî åñòü |
230 | и должно совпадать с характеристикой физического носителя, то есть |
231 | 200h áàéò. È â FAT, è â NTFS ïîëå ñî ñìåùåíèåì +13 ñîäåðæèò ÷èñëî |
231 | 200h байт. И в FAT, и в NTFS поле со смещением +13 содержит число |
232 | ñåêòîðîâ â êëàñòåðå è äîëæíî áûòü ñòåïåíüþ äâîéêè. |
232 | секторов в кластере и должно быть степенью двойки. |
233 | Êðèòåðèé NTFS: ïîëå ñî ñìåùåíèåì +3 ñîäåðæèò ñòðîêó NTFS è ïîëå ñî |
233 | Критерий NTFS: поле со смещением +3 содержит строку NTFS и поле со |
234 | ñìåùåíèåì +16 íóëåâîå (â FAT îíî ñîäåðæèò ÷èñëî òàáëèö FAT è îáÿçàíî |
234 | смещением +16 нулевое (в FAT оно содержит число таблиц FAT и обязано |
235 | áûòü íåíóëåâûì). |
235 | быть ненулевым). |
236 | Êðèòåðèé FAT: çàãðóç÷èê âû÷èñëÿåò ÷èñëî êëàñòåðîâ, îïðåäåëÿåò |
236 | Критерий FAT: загрузчик вычисляет число кластеров, определяет |
237 | ïðåäïîëîæèòåëüíûé òèï (FAT12/FAT16/FAT32) è ïðîâåðÿåò áàéò ïî ñìåùåíèþ |
237 | предположительный тип (FAT12/FAT16/FAT32) и проверяет байт по смещению |
238 | +38 äëÿ FAT12/16, +66 äëÿ FAT32 (îí äîëæåí áûòü ðàâåí 0x29). |
238 | +38 для FAT12/16, +66 для FAT32 (он должен быть равен 0x29). |
239 | Ïîñëå îïðåäåëåíèÿ òèïà ôàéëîâîé ñèñòåìû èçâåùàåò ïîëüçîâàòåëÿ îá |
239 | После определения типа файловой системы извещает пользователя об |
240 | îïðåäåë¸ííîì òèïå. Åñëè ôàéëîâàÿ ñèñòåìà íå ðàñïîçíàíà, âûäà¸ò |
240 | определённом типе. Если файловая система не распознана, выдаёт |
241 | ñîîòâåòñòâóþùåå ñîîáùåíèå è ïåðåõîäèò ê ñëåäóþùåìó ëîãè÷åñêîìó äèñêó. |
241 | соответствующее сообщение и переходит к следующему логическому диску. |
242 | 8a. Äëÿ FAT12-òîìîâ: çàñîâûâàåò â ñòåê èäåíòèôèêàòîð ôàéëîâîé ñèñòåìû - |
242 | 8a. Для FAT12-томов: засовывает в стек идентификатор файловой системы - |
243 | êîíñòàíòó '12'; óñòàíàâëèâàåò óêàçàòåëü íà ôóíêöèþ ïîëó÷åíèÿ ñëåäóþùåãî |
243 | константу '12'; устанавливает указатель на функцию получения следующего |
244 | â öåïî÷êå FAT êëàñòåðà íà FAT12-îáðàáîò÷èê; ñ÷èòûâàåò â ïàìÿòü âñþ |
244 | в цепочке FAT кластера на FAT12-обработчик; считывает в память всю |
245 | òàáëèöó FAT12 (îíà íå ïðåâîñõîäèò 0x1800 áàéò = 6 Êá), ïðè îøèáêå |
245 | таблицу FAT12 (она не превосходит 0x1800 байт = 6 Кб), при ошибке |
246 | ÷òåíèÿ ïûòàåòñÿ èñïîëüçîâàòü äðóãèå êîïèè FAT. |
246 | чтения пытается использовать другие копии FAT. |
247 | 8á. Äëÿ FAT16-òîìîâ: çàñîâûâàåò â ñòåê èäåíòèôèêàòîð ôàéëîâîé ñèñòåìû - |
247 | 8б. Для FAT16-томов: засовывает в стек идентификатор файловой системы - |
248 | êîíñòàíòó '16'; óñòàíàâëèâàåò óêàçàòåëü íà ôóíêöèþ ïîëó÷åíèÿ ñëåäóþùåãî |
248 | константу '16'; устанавливает указатель на функцию получения следующего |
249 | â öåïî÷êå FAT êëàñòåðà íà FAT16-îáðàáîò÷èê; èíèöèàëèçèðóåò èíôîðìàöèþ |
249 | в цепочке FAT кластера на FAT16-обработчик; инициализирует информацию |
250 | î êýøå ñåêòîðîâ FAT (ìàññèâ áàéò ñ âîçìîæíûìè çíà÷åíèÿìè 0 è 1, |
250 | о кэше секторов FAT (массив байт с возможными значениями 0 и 1, |
251 | îçíà÷àþùèìè, áûë ëè óæå çàãðóæåí ñîîòâåòñòâóþùèé ñåêòîð - âñåãî â |
251 | означающими, был ли уже загружен соответствующий сектор - всего в |
252 | òàáëèöå FAT16 íå áîëåå 0x100 ñåêòîðîâ) - íè îäèí ñåêòîð åù¸ íå |
252 | таблице FAT16 не более 0x100 секторов) - ни один сектор ещё не |
253 | çàãðóæåí, âñå áàéòû íóëåâûå. |
253 | загружен, все байты нулевые. |
254 | 8â. Äëÿ FAT32-òîìîâ: çàñîâûâàåò â ñòåê èäåíòèôèêàòîð ôàéëîâîé ñèñòåìû - |
254 | 8в. Для FAT32-томов: засовывает в стек идентификатор файловой системы - |
255 | êîíñòàíòó '32'; óñòàíàâëèâàåò óêàçàòåëü íà ôóíêöèþ ïîëó÷åíèÿ ñëåäóþùåãî |
255 | константу '32'; устанавливает указатель на функцию получения следующего |
256 | â öåïî÷êå FAT êëàñòåðà íà FAT16-îáðàáîò÷èê; èíèöèàëèçèðóåò èíôîðìàöèþ |
256 | в цепочке FAT кластера на FAT16-обработчик; инициализирует информацию |
257 | î êýøå ñåêòîðîâ FAT (ôîðìàò èíôîðìàöèè îïèñàí âûøå, â ðàñïðåäåëåíèè |
257 | о кэше секторов FAT (формат информации описан выше, в распределении |
258 | èñïîëüçóåìîé çàãðóç÷èêîì ïàìÿòè) - íè îäèí ñåêòîð åù¸ íå çàãðóæåí. |
258 | используемой загрузчиком памяти) - ни один сектор ещё не загружен. |
259 | 8ã. Îáùåå äëÿ FAT-òîìîâ: îïðåäåëÿåò çíà÷åíèÿ ñëóæåáíûõ ïåðåìåííûõ |
259 | 8г. Общее для FAT-томов: определяет значения служебных переменных |
260 | root_start (ïåðâûé ñåêòîð êîðíåâîãî êàòàëîãà â FAT12/16, èãíîðèðóåòñÿ |
260 | root_start (первый сектор корневого каталога в FAT12/16, игнорируется |
261 | ïðè îáðàáîòêå FAT32-òîìîâ), data_start (íà÷àëî äàííûõ ñ ïîïðàâêîé, |
261 | при обработке FAT32-томов), data_start (начало данных с поправкой, |
262 | ââîäèìîé äëÿ òîãî, ÷òîáû êëàñòåð N íà÷èíàëñÿ ñ ñåêòîðà |
262 | вводимой для того, чтобы кластер N начинался с сектора |
263 | N*sectors_per_cluster+data_start), root_clus (ïåðâûé êëàñòåð êîðíåâîãî |
263 | N*sectors_per_cluster+data_start), root_clus (первый кластер корневого |
264 | êàòàëîãà â FAT32, 0 â FAT12/16); óñòàíàâëèâàåò óêàçàòåëü íà ôóíêöèþ |
264 | каталога в FAT32, 0 в FAT12/16); устанавливает указатель на функцию |
265 | çàãðóçêè ôàéëà íà FAT-îáðàáîò÷èê. |
265 | загрузки файла на FAT-обработчик. |
266 | 8ä. Äëÿ NTFS-òîìîâ: çàñîâûâàåò â ñòåê èäåíòèôèêàòîð ôàéëîâîé ñèñòåìû - |
266 | 8д. Для NTFS-томов: засовывает в стек идентификатор файловой системы - |
267 | êîíñòàíòó 'nt'; îïðåäåëÿåò çíà÷åíèå ñëóæåáíîé ïåðåìåííîé frs_size |
267 | константу 'nt'; определяет значение служебной переменной frs_size |
268 | (ðàçìåð â áàéòàõ ôàéëîâîé çàïèñè, File Record Segment), äëÿ ïîëíîé |
268 | (размер в байтах файловой записи, File Record Segment), для полной |
269 | êîððåêòíîñòè ïðîâåðÿåò, ÷òî ýòî çíà÷åíèå (ðàâíîå 0x400 áàéò íà âñåõ |
269 | корректности проверяет, что это значение (равное 0x400 байт на всех |
270 | ðåàëüíûõ NTFS-òîìàõ - åäèíñòâåííûé ñïîñîá èçìåíèòü åãî çàêëþ÷àåòñÿ |
270 | реальных NTFS-томах - единственный способ изменить его заключается |
271 | â ïåðåñîçäàíèè âñåõ ñèñòåìíûõ ñòðóêòóð âðó÷íóþ) íå ïðåâîñõîäèò 0x1000 |
271 | в пересоздании всех системных структур вручную) не превосходит 0x1000 |
272 | è êðàòíî ðàçìåðó ñåêòîðà 0x200 áàéò; èíèöèàëèçèðóåò êýø ôàéëîâûõ |
272 | и кратно размеру сектора 0x200 байт; инициализирует кэш файловых |
273 | çàïèñåé - íè÷åãî åù¸ íå çàãðóæåíî; ñ÷èòûâàåò ïåðâûé êëàñòåð $MFT |
273 | записей - ничего ещё не загружено; считывает первый кластер $MFT |
274 | è çàãðóæàåò èíôîðìàöèþ î ðàñïîëîæåíèè íà äèñêå âñåé òàáëèöû $MFT |
274 | и загружает информацию о расположении на диске всей таблицы $MFT |
275 | (àòðèáóò 0x80, $Data); óñòàíàâëèâàåò óêàçàòåëü íà ôóíêöèþ çàãðóçêè |
275 | (атрибут 0x80, $Data); устанавливает указатель на функцию загрузки |
276 | ôàéëà íà NTFS-îáðàáîò÷èê. |
276 | файла на NTFS-обработчик. |
277 | 9. (ìåòêà load_secondary) Âûçûâàåò ôóíêöèþ çàãðóçêè ôàéëà äëÿ ôàéëà âòîðè÷íîãî |
277 | 9. (метка load_secondary) Вызывает функцию загрузки файла для файла вторичного |
278 | çàãðóç÷èêà. Ïðè îáíàðóæåíèè îøèáêè ïåðåõîäèò íà îáðàáîò÷èê îøèáîê ñ |
278 | загрузчика. При обнаружении ошибки переходит на обработчик ошибок с |
279 | ñîîòâåòñòâóþùèì ñîîáùåíèåì. |
279 | соответствующим сообщением. |
280 | 10. Óñòàíàâëèâàåò ðåãèñòðû äëÿ âòîðè÷íîãî çàãðóç÷èêà: al='h' (æ¸ñòêèé äèñê), |
280 | 10. Устанавливает регистры для вторичного загрузчика: al='h' (жёсткий диск), |
281 | ah=íîìåð äèñêà (äëÿ ãîòîâîãî áèíàðíèêà - 0 (BIOS-èäåíòèôèêàòîð 80h), |
281 | ah=номер диска (для готового бинарника - 0 (BIOS-идентификатор 80h), |
282 | ìîæåò áûòü èçìåí¸í ïóò¸ì ìîäèôèêàöèè êîíñòàíòû â èñõîäíèêå èëè |
282 | может быть изменён путём модификации константы в исходнике или |
283 | ñïåöèàëüíûì óñòàíîâùèêîì), bx=èäåíòèôèêàòîð ôàéëîâîé ñèñòåìû (áåð¸òñÿ |
283 | специальным установщиком), bx=идентификатор файловой системы (берётся |
284 | èç ñòåêà, êóäà ðàíåå áûë çàñóíóò íà øàãå 8), ds:si=óêàçàòåëü íà |
284 | из стека, куда ранее был засунут на шаге 8), ds:si=указатель на |
285 | callback-ôóíêöèþ. |
285 | callback-функцию. |
286 | 11. Ïåðåäà¸ò óïðàâëåíèå âòîðè÷íîìó çàãðóç÷èêó äàëüíèì ïåðåõîäîì íà 1000:0000. |
286 | 11. Передаёт управление вторичному загрузчику дальним переходом на 1000:0000. |
287 | 287 | ||
288 | Ôóíêöèÿ îáðàòíîãî âûçîâà äëÿ âòîðè÷íîãî çàãðóç÷èêà: |
288 | Функция обратного вызова для вторичного загрузчика: |
289 | ïðåäîñòàâëÿåò âîçìîæíîñòü ÷òåíèÿ ôàéëà. |
289 | предоставляет возможность чтения файла. |
290 | Âõîä è âûõîä îïèñàíû â ñïåöèôèêàöèè íà çàãðóç÷èê. |
290 | Вход и выход описаны в спецификации на загрузчик. |
291 | ×òåíèå ôàéëà: |
291 | Чтение файла: |
292 | 1. Ñîõðàíÿåò ñòåê âûçûâàþùåãî êîäà è óñòàíàâëèâàåò ñâîé ñòåê: |
292 | 1. Сохраняет стек вызывающего кода и устанавливает свой стек: |
293 | ss:sp = 0:3000, bp=dat: ïàðà ss:bp ïðè ðàáîòå ñ îñòàëüíûì |
293 | ss:sp = 0:3000, bp=dat: пара ss:bp при работе с остальным |
294 | êîäîì äîëæíà óêàçûâàòü íà 0:dat. |
294 | кодом должна указывать на 0:dat. |
295 | 2. Ðàçáèðàåò ïåðåäàííûå ïàðàìåòðû è âûçûâàåò ïðîöåäóðó çàãðóçêè ôàéëà. |
295 | 2. Разбирает переданные параметры и вызывает процедуру загрузки файла. |
296 | 3. Âîññòàíàâëèâàåò ñòåê âûçûâàþùåãî êîäà è âîçâðàùàåò óïðàâëåíèå. |
296 | 3. Восстанавливает стек вызывающего кода и возвращает управление. |
297 | 297 | ||
298 | Âñïîìîãàòåëüíûå ïðîöåäóðû. |
298 | Вспомогательные процедуры. |
299 | Ïðîöåäóðà ÷òåíèÿ ñåêòîðîâ (read): |
299 | Процедура чтения секторов (read): |
300 | íà âõîäå äîëæíî áûòü óñòàíîâëåíî: |
300 | на входе должно быть установлено: |
301 | ss:bp = 0:dat |
301 | ss:bp = 0:dat |
302 | es:bx = óêàçàòåëü íà íà÷àëî áóôåðà, êóäà áóäóò ïðî÷èòàíû äàííûå |
302 | es:bx = указатель на начало буфера, куда будут прочитаны данные |
303 | eax = ñòàðòîâûé ñåêòîð (îòíîñèòåëüíî íà÷àëà ëîãè÷åñêîãî äèñêà) |
303 | eax = стартовый сектор (относительно начала логического диска) |
304 | cx = ÷èñëî ñåêòîðîâ (äîëæíî áûòü áîëüøå íóëÿ) |
304 | cx = число секторов (должно быть больше нуля) |
305 | íà âûõîäå: es:bx óêàçûâàåò íà êîíåö áóôåðà, â êîòîðûé áûëè ïðî÷èòàíû äàííûå, |
305 | на выходе: es:bx указывает на конец буфера, в который были прочитаны данные, |
306 | ôëàã CF óñòàíîâëåí, åñëè âîçíèêëà îøèáêà ÷òåíèÿ |
306 | флаг CF установлен, если возникла ошибка чтения |
307 | 1. Ïåðåâîäèò ñòàðòîâûé ñåêòîð (îòñ÷èòûâàåìûé îò íà÷àëà òîìà) â ñåêòîð íà |
307 | 1. Переводит стартовый сектор (отсчитываемый от начала тома) в сектор на |
308 | óñòðîéñòâå, ïðèáàâëÿÿ íîìåð ïåðâîãî ñåêòîðà ëîãè÷åñêîãî äèñêà, |
308 | устройстве, прибавляя номер первого сектора логического диска, |
309 | íàéäåííûé ïðè ïåðåáîðå äèñêîâ. |
309 | найденный при переборе дисков. |
310 | 2.  öèêëå (øàãè 3-6) ÷èòàåò ñåêòîðû, ñëåäèò çà òåì, ÷òîáû íà êàæäîé èòåðàöèè |
310 | 2. В цикле (шаги 3-6) читает секторы, следит за тем, чтобы на каждой итерации |
311 | CHS-âåðñèÿ: âñå ÷èòàåìûå ñåêòîðû áûëè íà îäíîé äîðîæêå. |
311 | CHS-версия: все читаемые секторы были на одной дорожке. |
312 | LBA-âåðñèÿ: ÷èñëî ÷èòàåìûõ ñåêòîðîâ íå ïðåâîñõîäèëî 7Fh (òðåáîâàíèå |
312 | LBA-версия: число читаемых секторов не превосходило 7Fh (требование |
313 | ñïåöèôèêàöèè EDD BIOS). |
313 | спецификации EDD BIOS). |
314 | CHS-âåðñèÿ: |
314 | CHS-версия: |
315 | 3. Ïåðåâîäèò àáñîëþòíûé íîìåð ñåêòîðà â CHS-ñèñòåìó: ñåêòîð ðàññ÷èòûâàåòñÿ êàê |
315 | 3. Переводит абсолютный номер сектора в CHS-систему: сектор рассчитывается как |
316 | åäèíèöà ïëþñ îñòàòîê îò äåëåíèÿ àáñîëþòíîãî íîìåðà íà ÷èñëî ñåêòîðîâ |
316 | единица плюс остаток от деления абсолютного номера на число секторов |
317 | íà äîðîæêå; äîðîæêà ðàññ÷èòûâàåòñÿ êàê îñòàòîê îò äåëåíèÿ ÷àñòíîãî, |
317 | на дорожке; дорожка рассчитывается как остаток от деления частного, |
318 | ïîëó÷åííîãî íà ïðåäûäóùåì øàãå, íà ÷èñëî äîðîæåê, à öèëèíäð - êàê |
318 | полученного на предыдущем шаге, на число дорожек, а цилиндр - как |
319 | ÷àñòíîå îò ýòîãî æå äåëåíèÿ. Åñëè ÷èñëî ñåêòîðîâ äëÿ ÷òåíèÿ áîëüøå, |
319 | частное от этого же деления. Если число секторов для чтения больше, |
320 | ÷åì ÷èñëî ñåêòîðîâ äî êîíöà äîðîæêè, óìåíüøàåò ÷èñëî ñåêòîðîâ äëÿ |
320 | чем число секторов до конца дорожки, уменьшает число секторов для |
321 | ÷òåíèÿ. |
321 | чтения. |
322 | 4. Ôîðìèðóåò äàííûå äëÿ âûçîâà int 13h (ah=2 - ÷òåíèå, al=÷èñëî ñåêòîðîâ, |
322 | 4. Формирует данные для вызова int 13h (ah=2 - чтение, al=число секторов, |
323 | dh=ãîëîâêà, (ìëàäøèå 6 áèò cl)=ñåêòîð, |
323 | dh=головка, (младшие 6 бит cl)=сектор, |
324 | (ñòàðøèå 2 áèòà cl è âåñü ch)=äîðîæêà, dl=äèñê, es:bx->áóôåð). |
324 | (старшие 2 бита cl и весь ch)=дорожка, dl=диск, es:bx->буфер). |
325 | 5. Âûçûâàåò BIOS. Åñëè BIOS ðàïîðòóåò îá îøèáêå, âûïîëíÿåò ñáðîñ äèñêà |
325 | 5. Вызывает BIOS. Если BIOS рапортует об ошибке, выполняет сброс диска |
326 | è ïîâòîðÿåò ïîïûòêó ÷òåíèÿ, âñåãî äåëàåòñÿ íå áîëåå òð¸õ ïîïûòîê |
326 | и повторяет попытку чтения, всего делается не более трёх попыток |
327 | (íåñêîëüêî ïîïûòîê íóæíî â ñëó÷àå äèñêåòû äëÿ ãàðàíòèè òîãî, ÷òî |
327 | (несколько попыток нужно в случае дискеты для гарантии того, что |
328 | ìîòîð ðàñêðóòèëñÿ). Åñëè âñå òðè ðàçà ïðîèñõîäèò îøèáêà ÷òåíèÿ, |
328 | мотор раскрутился). Если все три раза происходит ошибка чтения, |
329 | ïåðåõîäèò íà êîä îáðàáîòêè îøèáîê ñ ñîîáùåíèåì "Read error". |
329 | переходит на код обработки ошибок с сообщением "Read error". |
330 | 6.  ñîîòâåòñòâèè ñ ÷èñëîì ïðî÷èòàííûõ íà òåêóùåé èòåðàöèè ñåêòîðîâ |
330 | 6. В соответствии с числом прочитанных на текущей итерации секторов |
331 | êîððåêòèðóåò òåêóùèé ñåêòîð, ÷èñëî îñòàâøèõñÿ ñåêòîðîâ è óêàçàòåëü íà |
331 | корректирует текущий сектор, число оставшихся секторов и указатель на |
332 | áóôåð (â ïàðå es:bx êîððåêòèðóåòñÿ es). Åñëè âñ¸ ïðî÷èòàíî, çàêàí÷èâàåò |
332 | буфер (в паре es:bx корректируется es). Если всё прочитано, заканчивает |
333 | ðàáîòó, èíà÷å âîçâðàùàåòñÿ íà øàã 3. |
333 | работу, иначе возвращается на шаг 3. |
334 | LBA-âåðñèÿ: |
334 | LBA-версия: |
335 | 3. Åñëè ÷èñëî ñåêòîðîâ äëÿ ÷òåíèÿ áîëüøå 7Fh, óìåíüøàåò åãî (äëÿ òåêóùåé |
335 | 3. Если число секторов для чтения больше 7Fh, уменьшает его (для текущей |
336 | èòåðàöèè) äî 7Fh. |
336 | итерации) до 7Fh. |
337 | 4. Ôîðìèðóåò â ñòåêå ïàêåò äëÿ int 13h (êëàä¸ò âñå íóæíûå äàííûå êîìàíäàìè |
337 | 4. Формирует в стеке пакет для int 13h (кладёт все нужные данные командами |
338 | push, ïðè÷¸ì â îáðàòíîì ïîðÿäêå: ñòåê - ñòðóêòóðà LIFO, è äàííûå â |
338 | push, причём в обратном порядке: стек - структура LIFO, и данные в |
339 | ñòåêå õðàíÿòñÿ â îáðàòíîì ïîðÿäêå ïî îòíîøåíèþ ê òîìó, êàê èõ òóäà |
339 | стеке хранятся в обратном порядке по отношению к тому, как их туда |
340 | êëàëè). |
340 | клали). |
341 | 5. Âûçûâàåò BIOS. Åñëè BIOS ðàïîðòóåò îá îøèáêå, ïåðåõîäèò íà êîä îáðàáîòêè |
341 | 5. Вызывает BIOS. Если BIOS рапортует об ошибке, переходит на код обработки |
342 | îøèáîê ñ ñîîáùåíèåì "Read error". Î÷èùàåò ñòåê îò ïàêåòà, |
342 | ошибок с сообщением "Read error". Очищает стек от пакета, |
343 | ñôîðìèðîâàííîãî íà ïðåäûäóùåì øàãå. |
343 | сформированного на предыдущем шаге. |
344 | 6.  ñîîòâåòñòâèè ñ ÷èñëîì ïðî÷èòàííûõ íà òåêóùåé èòåðàöèè ñåêòîðîâ |
344 | 6. В соответствии с числом прочитанных на текущей итерации секторов |
345 | êîððåêòèðóåò òåêóùèé ñåêòîð, ÷èñëî îñòàâøèõñÿ ñåêòîðîâ è óêàçàòåëü íà |
345 | корректирует текущий сектор, число оставшихся секторов и указатель на |
346 | áóôåð (â ïàðå es:bx êîððåêòèðóåòñÿ es). Åñëè âñ¸ ïðî÷èòàíî, çàêàí÷èâàåò |
346 | буфер (в паре es:bx корректируется es). Если всё прочитано, заканчивает |
347 | ðàáîòó, èíà÷å âîçâðàùàåòñÿ íà øàã 3. |
347 | работу, иначе возвращается на шаг 3. |
348 | 348 | ||
349 | Ïðîöåäóðà îáðàáîòêè îøèáîê (find_error_si è find_error_sp): |
349 | Процедура обработки ошибок (find_error_si и find_error_sp): |
350 | íà âõîäå: óêàçàòåëü íà ñîîáùåíèå îá îøèáêå â si ëèáî íà âåðõóøêå ñòåêà |
350 | на входе: указатель на сообщение об ошибке в si либо на верхушке стека |
351 | 0. Åñëè âûçûâàåòñÿ find_error_si, îíà ïîìåùàåò ïåðåäàííûé óêàçàòåëü â ñòåê. |
351 | 0. Если вызывается find_error_si, она помещает переданный указатель в стек. |
352 | 1. Åñëè îøèáêà ïðîèçîøëà â ïðîöåññå ðàáîòû callback-ôóíêöèè, òî |
352 | 1. Если ошибка произошла в процессе работы callback-функции, то |
353 | (ìåòêà error_in_callback) îáðàáîò÷èê ïðîñòî âîçâðàùàåò óïðàâëåíèå |
353 | (метка error_in_callback) обработчик просто возвращает управление |
354 | âûçâàâøåìó êîäó, ðàïîðòóÿ î íåíàéäåííîì ôàéëå. |
354 | вызвавшему коду, рапортуя о ненайденном файле. |
355 | 2. Åñëè æå îøèáêà ïðîèçîøëà äî ïåðåäà÷è óïðàâëåíèÿ âòîðè÷íîìó çàãðóç÷èêó, |
355 | 2. Если же ошибка произошла до передачи управления вторичному загрузчику, |
356 | îáðàáîò÷èê âûâîäèò ñîîáùåíèå òèïà "Error: <òåêóùèé îáúåêò>: <îøèáêà>" |
356 | обработчик выводит сообщение типа "Error: <текущий объект>: <ошибка>" |
357 | è (âîññòàíîâèâ ñòåê) ïåðåõîäèò ê ñëåäóþùåìó ëîãè÷åñêîìó äèñêó. |
357 | и (восстановив стек) переходит к следующему логическому диску. |
358 | 358 | ||
359 | Ïðîöåäóðà ÷òåíèÿ ôàéëà/àòðèáóòà ïî èçâåñòíîìó ðàçìåùåíèþ íà äèñêå |
359 | Процедура чтения файла/атрибута по известному размещению на диске |
360 | (read_file_chunk): |
360 | (read_file_chunk): |
361 | íà âõîäå äîëæíî áûòü óñòàíîâëåíî: |
361 | на входе должно быть установлено: |
362 | ds:si = óêàçàòåëü íà èíôîðìàöèþ î ðàçìåùåíèè |
362 | ds:si = указатель на информацию о размещении |
363 | es:bx = óêàçàòåëü íà íà÷àëî áóôåðà, êóäà áóäóò ïðî÷èòàíû äàííûå |
363 | es:bx = указатель на начало буфера, куда будут прочитаны данные |
364 | ecx = ëèìèò ÷èñëà ñåêòîðîâ äëÿ ÷òåíèÿ, ñòàðøåå ñëîâî äîëæíî áûòü 0 |
364 | ecx = лимит числа секторов для чтения, старшее слово должно быть 0 |
365 | íà âûõîäå: es:bx óêàçûâàåò íà êîíåö áóôåðà, â êîòîðûé áûëè ïðî÷èòàíû äàííûå, |
365 | на выходе: es:bx указывает на конец буфера, в который были прочитаны данные, |
366 | ôëàã CF óñòàíîâëåí, åñëè âîçíèêëà îøèáêà ÷òåíèÿ |
366 | флаг CF установлен, если возникла ошибка чтения |
367 | 1. Îïðåäåëÿåò, ÿâëÿåòñÿ ëè àòðèáóò ðåçèäåíòíûì (âîçìîæíî òîëüêî â NTFS |
367 | 1. Определяет, является ли атрибут резидентным (возможно только в NTFS |
368 | è îçíà÷àåò, ÷òî äàííûå ôàéëà/àòðèáóòà óæå áûëè öåëèêîì ïðî÷èòàíû ïðè |
368 | и означает, что данные файла/атрибута уже были целиком прочитаны при |
369 | îáðàáîòêå èíôîðìàöèè î ôàéëå) èëè íåðåçèäåíòíûì (îçíà÷àåò, ÷òî äàííûå |
369 | обработке информации о файле) или нерезидентным (означает, что данные |
370 | õðàíÿòñÿ ãäå-òî íà äèñêå, è èìååòñÿ èíôîðìàöèÿ î òîì, ãäå èìåííî). |
370 | хранятся где-то на диске, и имеется информация о том, где именно). |
371 | 2. Äëÿ ðåçèäåíòíûõ àòðèáóòîâ (ìåòêà read_file_chunk.resident) ïðîñòî êîïèðóåò |
371 | 2. Для резидентных атрибутов (метка read_file_chunk.resident) просто копирует |
372 | äàííûå ïî ìåñòó íàçíà÷åíèÿ (ñ ó÷¸òîì óêàçàííîãî ëèìèòà). |
372 | данные по месту назначения (с учётом указанного лимита). |
373 | 3. Äëÿ íåðåçèäåíòíûõ àòðèáóòîâ èíôîðìàöèÿ ñîñòîèò èç ïàð <ðàçìåð î÷åðåäíîãî |
373 | 3. Для нерезидентных атрибутов информация состоит из пар <размер очередного |
374 | ôðàãìåíòà ôàéëà â êëàñòåðàõ, ñòàðòîâûé êëàñòåð ôðàãìåíòà>; ïðîöåäóðà |
374 | фрагмента файла в кластерах, стартовый кластер фрагмента>; процедура |
375 | ÷èòàåò ôðàãìåíòû, ïîêà ôàéë íå çàêîí÷èòñÿ èëè ïîêà íå áóäåò äîñòèãíóò |
375 | читает фрагменты, пока файл не закончится или пока не будет достигнут |
376 | óêàçàííûé ëèìèò. |
376 | указанный лимит. |
377 | 377 | ||
378 | Ïðîöåäóðà ïðîñìîòðà êýøà (cache_lookup): |
378 | Процедура просмотра кэша (cache_lookup): |
379 | íà âõîäå äîëæíî áûòü óñòàíîâëåíî: |
379 | на входе должно быть установлено: |
380 | eax = èñêîìîå çíà÷åíèå |
380 | eax = искомое значение |
381 | ss:si = óêàçàòåëü íà ñòðóêòóðó-çàãîëîâîê êýøà |
381 | ss:si = указатель на структуру-заголовок кэша |
382 | íà âûõîäå: ss:di = óêàçàòåëü íà âõîä â êýøå; ôëàã CF óñòàíîâëåí, åñëè çíà÷åíèå |
382 | на выходе: ss:di = указатель на вход в кэше; флаг CF установлен, если значение |
383 | áûëî òîëüêî ÷òî äîáàâëåíî, è ñáðîøåí, åñëè îíî óæå áûëî â êýøå. |
383 | было только что добавлено, и сброшен, если оно уже было в кэше. |
384 | 1. Ïðîñìàòðèâàåò êýø â ïîèñêàõ óêàçàííîãî çíà÷åíèÿ. Åñëè çíà÷åíèå íàéäåíî |
384 | 1. Просматривает кэш в поисках указанного значения. Если значение найдено |
385 | (ïðè ýòîì ôëàã CF îêàçûâàåòñÿ ñáðîøåííûì), ïåðåõîäèò ê øàãó 4. |
385 | (при этом флаг CF оказывается сброшенным), переходит к шагу 4. |
386 | 2. Åñëè êýø óæå çàïîëíåí, óäàëÿåò èç êýøà ñàìûé ñòàðûé âõîä (îí íàõîäèòñÿ â |
386 | 2. Если кэш уже заполнен, удаляет из кэша самый старый вход (он находится в |
387 | ãîëîâå äâóñâÿçíîãî ñïèñêà), èíà÷å äîáàâëÿåò ê êýøó åù¸ îäèí âõîä. |
387 | голове двусвязного списка), иначе добавляет к кэшу ещё один вход. |
388 | 3. Óñòàíàâëèâàåò â ïîëó÷åííîì âõîäå óêàçàííîå çíà÷åíèå. Óñòàíàâëèâàåò ôëàã |
388 | 3. Устанавливает в полученном входе указанное значение. Устанавливает флаг |
389 | CF, ïîñëåäóþùèå øàãè íå ìåíÿþò ñîñòîÿíèÿ ôëàãîâ. Ïåðåõîäèò ê øàãó 5. |
389 | CF, последующие шаги не меняют состояния флагов. Переходит к шагу 5. |
390 | 4. Óäàëÿåò âõîä èç ñïèñêà. |
390 | 4. Удаляет вход из списка. |
391 | 5. Äîáàâëÿåò ñåêòîð â êîíåö ñïèñêà (ñàìûé íîâûé âõîä).ðàçìåð>îøèáêà>òåêóùèé> |
391 | 5. Добавляет сектор в конец списка (самый новый вход).размер>ошибка>текущий> |