OSDev

для всех
Текущее время: 01 июл 2025, 16:30

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 9  След.
Автор Сообщение
СообщениеДобавлено: 28 дек 2010, 20:02 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Опа, блин! Это что получается, что за один вызов функции 0x02 прерывания 0x10 с одни сектором, мне вернётся 2048 байт?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 дек 2010, 21:25 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Так эта табличка ошибочная или я на самом деле за один раз могу получить минимум 2048 байт? Сколько байт минимум можно получить?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 дек 2010, 23:37 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Объясните, пожалуйста функцию 0x42 прерывания BIOS 0x13 - Extended Read. Вот её формат:

Цитата:
AH = 0x42
DL = Drive number
DS:SI -> Disk address packet

Как я понимаю, она используется для чтения секторов в режиме LBA с жёстких дисков и компакт-дисков (CD/DVD). Следовательно в регистр DL нужно указывать значение не меньше 0x80. Так?

А вот указатель DS:SI, будет указывать на область в оперативной памяти где содержится линейный адрес сектора на устройстве или куда должны будут скопированы секторы с устройства? Не понятно следующее:

- если DS:SI указывает на память, где содержится информация об линейном адресе сектора, тогда где указывается информация об участке памяти, куда нужно скопировать сектора (и наоборот);

- где указывается количество считываемых секторов.

Я вижу только один выход - DS:SI указывают на область памяти, где описано всё что мне нужно. Надеюсь я прав.

Пока писал это, переключался между страничками и кое что нашёл. Действительно, DS:SI указывает на область памяти, где должна располагаться структура:

Изображение

Тут мне всё понятно, кроме одного: transferBuffer занимает 4 байта. То есть это 32-битный адрес. Но я ведь нахожусь в режиме реальных адресов, тут сегментные регистры рулят. И если мне нужно чтобы сектор был записан по адресу 0x0000:0x7E00, что мне нужно в этом поле указать?

Ещё один важный вопрос, который касается именно CD-ROM. Где я не искал, получается что на CD в одном секторе 2048 байт. Так если я использую функцию 0x42 прерывания BIOS 0x13 для CD-ROM, именно укажу, что мне нужен один сектор. Тогда сколько байт мне придёт?

Представим что действительно будет приходить по 2048 байт на сектор. Тогда как же получается, что на диске в 650 МБ находится 333000 секторов, и занимают они 681984000 байт. Тут всё сходится, но никак не вписывается загрузочный сектор в 512 байт. Он что, не в учёт или я что-то не понимаю?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 дек 2010, 09:47 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1449
Написано -- 32-разрядный, значит, именно такой. Расширенные дисковые функции не используют формат сегмент:смещение, а как они это делают -- это уже забота разработчиков БИОС.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 дек 2010, 09:55 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Это сегмент:смещение реального режима. См. EDD Spec.

Размер загрузчика CD/DVD обычно равен 2 кб (1 сектор), но в принципе ограничен только размером базовой памяти. См. El'torito Spec.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 дек 2010, 10:51 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Я тут перерыл весь интернет. Накачал разных стандартов ECMA. В общем прочитал, что на CD-диск можно записать образа дискет и жёстких дисков. А потом через BIOS выбирать что именно грузить (какую загрузочную запись). Думаю что для меня это совсем не нужно.

Стандарты - это хорошо. Но если обойтись без них, тогда мне будут доступны все 333000 секторов по 2048 байт на CD-диске в 650 МБ? Я смогу сам распорядиться какой сектор для чего использовать?

Если это так, то какой именно сектор загружает BIOS когда определяет что в приводе вставлен мультизагрузочный диск? Или тут без жёсткого стандарта не обойтись и в моём распоряжении не будет так как я хотел?

Не хотел я изучать существующие файловые системы на дисках, хотел сделать своё. Чтобы загружался загрузочный сектор.

Так как происходит на самом деле загрузка мультизагрузочного диска средствами BIOS и сколько байт он копирует по адресу 0x00007C00? А то мне так кажется, что сам BIOS только в режиме совместительства с floppy-дискетами работает и загружает только 512 байт от какого-то сектора CD-диска. Но ведь не от какого-то на бум. Мне бы знать конкретно что да как, чтобы можно было спланировать свою файловую систему.

Идеальный вариант, когда он грузил бы эти 512 или 2048 байт по адресу 0x00007C00 прямо с самого первого сектора CD-диска. А дальше уже программа определяла файловую систему (мою файловую систему), в режиме LBA считывала сектора с каталогами файлов. искала файл загрузчика, копировала бы его в память и передавала ему управление. Но так нельзя?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 дек 2010, 16:12 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
Если кратко, то так нельзя. BIOS при загрузке с CD/DVD использует El'torito Spec. и следовательно учитывает структуру ФС. Ты можешь только расширить ISO9660, как это делалось неоднократно до тебя.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 дек 2010, 17:22 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
В общем понятно...

Я тут подумал, а зачем мне CD-диск?! Разве у меня будет такая огромная система?! Думаю что "Нет"! Поэтому решил всё таки вернуться к дискетам. И решил серьёзно за них взяться. В связи с этим хочу задать несколько вопросов:

1. Можно ли через BIOS грузить дискеты в режиме LBA (ну чтобы он сам преобразовывал цилиндры-головки-сектора в линейный адрес сектора)? Думаю что нельзя, но мало ли.

2. Так как дискеты бывают с разным количеством головок (1 или 2), с разным количеством цилиндров на головке и с разным количеством секторов в цилиндре, то получается полная не разбериха. Я даже не понимаю как тогда правильно эмуляторы работают, когда я им подсовываю не дискету, а образ дискеты, где нет ничего, чтобы указывало на количество головок, цилиндров и секторов. Как же тогда всё это работает?

3. Возможно стоит написать программу под Windows (31 числа мне принесут floppy-дисковод и пару дискет), которая бы определяла сколько головок на дискете, сколько цилиндров на каждой головке и сколько секторов на каждом цилиндре каждой головки. Форматировала бы дискету в мою файловую систему и в специальные поля вносила бы информацию о количестве головок, количестве цилиндров на головках и секторов на головке. Может так стоит делать?

4. Если первый сектор дискеты (головка 0, цилиндр 0, сектор 1) повреждён, то такая дискета считается уже не пригодной как загрузочной или же загрузчик будет в этом случае грузить следующий сектор и так до тех пор пока не найдёт без ошибок?

5. Если действительно переменной количестве секторов на цилиндре и цилиндров на головке, так же как и количество головок, то тогда не возможно же будет перевести всё это в LBA, который бы значит номер сектора последовательно от начала до конца?

Я просто сейчас описываю файловую систему свою, которая сохраняет абсолютный номер сектора. Может быть это я зря, раз тут от дискеты к дискете переменчивое количество головок, цилиндров и секторов? Может мне нужно это дело сохранять в виде головка-цилиндр-сектор?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 дек 2010, 20:52 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1209
s3dworld писал(а):
Я тут подумал, а зачем мне CD-диск?! Разве у меня будет такая огромная система?! Думаю что "Нет"! Поэтому решил всё таки вернуться к дискетам.
Дискеты устарели. CD/DVD - единственный вид современных сменных носителей, поддержку которых можно реализовать в приемлемые сроки. К тому же именно на CD/DVD обычно распространяются дистрибутивы.

s3dworld писал(а):
1. Можно ли через BIOS грузить дискеты в режиме LBA (ну чтобы он сам преобразовывал цилиндры-головки-сектора в линейный адрес сектора)? Думаю что нельзя, но мало ли.
Подпрограмму пересчета написать элементарно. Ни одна современная ФС не размечается на уровне CHS, т.е. пересчет CHS-LBA и обратно не зависит от ФС, хотя мог бы.

s3dworld писал(а):
2. Так как дискеты бывают с разным количеством головок (1 или 2), с разным количеством цилиндров на головке и с разным количеством секторов в цилиндре, то получается полная не разбериха. Я даже не понимаю как тогда правильно эмуляторы работают, когда я им подсовываю не дискету, а образ дискеты, где нет ничего, чтобы указывало на количество головок, цилиндров и секторов. Как же тогда всё это работает?
Можешь поддерживать не все форматы. Для начала 2х80х18 будет достаточно. В эмуляторах формат дискеты обычно указывается явно (в конфиг. файлах). В боксе например так: floppya: 1_44="floppy.bin", status=inserted

s3dworld писал(а):
3. Возможно стоит написать программу под Windows (31 числа мне принесут floppy-дисковод и пару дискет), которая бы определяла сколько головок на дискете, сколько цилиндров на каждой головке и сколько секторов на каждом цилиндре каждой головки. Форматировала бы дискету в мою файловую систему и в специальные поля вносила бы информацию о количестве головок, количестве цилиндров на головках и секторов на головке. Может так стоит делать?
В FAT12 в бутсекторе есть поля для хранения кол-ва головок и кол-ва секторов на дорожке.

s3dworld писал(а):
4. Если первый сектор дискеты (головка 0, цилиндр 0, сектор 1) повреждён, то такая дискета считается уже не пригодной как загрузочной или же загрузчик будет в этом случае грузить следующий сектор и так до тех пор пока не найдёт без ошибок?
А сам как думаешь?

s3dworld писал(а):
5. Если действительно переменной количестве секторов на цилиндре и цилиндров на головке, так же как и количество головок, то тогда не возможно же будет перевести всё это в LBA, который бы значит номер сектора последовательно от начала до конца?

Я просто сейчас описываю файловую систему свою, которая сохраняет абсолютный номер сектора. Может быть это я зря, раз тут от дискеты к дискете переменчивое количество головок, цилиндров и секторов? Может мне нужно это дело сохранять в виде головка-цилиндр-сектор?
Не нужно! Обращение посредством CHS - это самый низкий уровень. Повторяю, пересчет CHS-LBA и наоборот выполняется элементарно. Достаточно знать значения SPT и Heads.


Последний раз редактировалось phantom-84 29 дек 2010, 21:02, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 дек 2010, 21:02 

Зарегистрирован: 22 окт 2010, 13:22
Сообщения: 92
Откуда: Ртищево
Цитата:
Можешь поддерживать не все форматы. Для начала 2х80х18 будет достаточно. В эмуляторах формат дискеты обычно указывается явно (в конфиг. файлах). В боксе например так: floppya: 1_44="floppy.bin", status=inserted

То есть если дискета 3.5' двойной плотности на 2880 секторов, то на ней 100% будет 2 головки, по 80 цилиндров на каждой головке и по 18 секторов на каждом цилиндре?

_________________
Изучаю процессор...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 88 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 9  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB