Subversion Repositories Kolibri OS

Rev

Rev 2465 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2465 Rev 3555
Line 22... Line 22...
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
;*****************************************************************************
Line 26... Line 26...
26
 
26
 
27
						Íåò ïîâåñòè ïå÷àëüíåå íà ñâåòå,
27
						Нет повести печальнее на свете,
Line 28... Line 28...
28
						×åì ïîâåñòü î çàêëèíèâøåì Reset'å...
28
						Чем повесть о заклинившем Reset'е...
29
 
29
 
Line 30... Line 30...
30
Çàãðóç÷èê äëÿ FAT- è NTFS-òîìîâ äëÿ ñëó÷àåâ, êîãäà îñíîâíîé áóòñåêòîð çàãðóæàåò
30
Загрузчик для FAT- и NTFS-томов для случаев, когда основной бутсектор загружает
Line 31... Line 31...
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 свободной базовой памяти.
Line 39... Line 39...
39
4) Ïóòè ê èñïîëüçóåìûì ôàéëàì íå äîëæíû ñîäåðæàòü ñèìâîëè÷åñêèõ ññûëîê NTFS
39
4) Пути к используемым файлам не должны содержать символических ссылок NTFS
Line 40... Line 40...
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
Line 54... Line 54...
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
Line 55... Line 55...
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
Line 88... Line 88...
88
	80000-90000	òåêóùèé ðàññìàòðèâàåìûé êëàñòåð
88
	80000-90000	текущий рассматриваемый кластер
Line 195... Line 195...
195
	(ïîñëåäóþùèå øàãè); ïðè âñòðå÷å ñ ðàçäåëîì, òèï êîòîðîãî óêàçûâàåò
195
	(последующие шаги); при встрече с разделом, тип которого указывает
196
	íà ðàñøèðåííîñòü (5 èëè 0xF), êîä çàïîìèíàåò íà÷àëî ýòîãî ðàçäåëà
196
	на расширенность (5 или 0xF), код запоминает начало этого раздела
197
	(â ãëàâíîé çàãðóçî÷íîé çàïèñè òàêîé òèï îçíà÷àåò ðàñøèðåííûé ðàçäåë,
197
	(в главной загрузочной записи такой тип означает расширенный раздел,
198
	â ðàñøèðåííîé - òîëüêî óêàçàòåëü íà ñëåäóþùóþ ðàñøèðåííóþ çàïèñü,
198
	в расширенной - только указатель на следующую расширенную запись,
199
	â îáîèõ ñëó÷àÿõ îí ìîæåò âñòðåòèòüñÿ òîëüêî îäèí ðàç â äàííîé çàïèñè);
199
	в обоих случаях он может встретиться только один раз в данной записи);
200
	êîãäà êîä äîõîäèò äî êîíöà ñïèñêà, âñå íîðìàëüíûå ðàçäåëû, îïèñûâàåìûå
200
	когда код доходит до конца списка, все нормальные разделы, описываемые
201
	â ýòîé çàïèñè, óæå ïðîñìîòðåíû, òàê ÷òî êîä ñ ÷èñòîé ñîâåñòüþ ïåðåõîäèò
201
	в этой записи, уже просмотрены, так что код с чистой совестью переходит
202
	ê ñëåäóþùåé ðàñøèðåííîé çàïèñè. Åñëè îí å¸ íå âñòðåòèë, çíà÷èò, óæå
202
	к следующей расширенной записи. Если он её не встретил, значит, уже
203
	âñå ëîãè÷åñêèå ðàçäåëû áûëè ïîäâåðãíóòû ïîïûòêàì çàãðóçèòüñÿ, è âñå
203
	все логические разделы были подвергнуты попыткам загрузиться, и все
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.
Line 348... Line 348...
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 = искомое значение