Здраствуйте кодеры, у меня два вопроса: 1) как можно определить все HDD в системе, используя тока порты или может в памяти чтото есть записано о них? 2) как найти все логические диски? я знаю что искать основные можна считав MBR и посмотреть в структуре дисков, а как найти дригие? (основных может быть тока 4) Зарание благодарен
вся информация о разбивке лежит в MBR. Там можно записать более чем 4. Читай описание MBR. Ну в данных BIOS'a AFAIR это есть.
Наскока я знаю, то в MBR может быть описано 4 основных раздела. Я ето читал на многих сайтах, а другие типы разделов - както по другому знаходят. В системе может быть много самых разделов, но тока 4 основных! можеш поточнее?
Ну да. максимум 4 основных раздела. А всего разделов может быть достаточно много. И все они описаны в MBR.
Вполне возможно, но где? можеш дать присер или алгоритм?а то я невидел там описаных дисков, так как там места на 4 записи
n0name СПАСИБО ТЕБЕ ОГРОМНОЕ! Я розобрался в етом вопросе, если можеш помоги ищо в втором, ты говорил что: можеш дать инфу по етому?
Можешь почитать "Программирование на аппоратном уровне" Владимер Кулакова . Лично я пока придерживаюсь такой схемы, полученна из изучения мануэлов. Поиск дисков не только HDD но и оптических. Для начала нам нужно найти все контролеры дисков, затем получить от них диапазоны портов для каждого из каналов. После чего на каждом из каналов нужно будет выставить диск мастер или подчиненный. Выполнить команду сброса RESRET =08h подождать 2 миллисекунды и проверить BSY. Если он выставлен в 1, то устройства нет. Если он выставлен в 0, то устройство присутствует. Далее вызывать команду для получения параметров жестких дисков IDENTIFY DEVICE=ECh. Если к контролеру подключен оптический дисковод, то после RESET должна выставиться сигнатура поддержки пакетных устройств Sector Count 01h Sector Number 01h Cylinder Low 14h Cylinder High EBh После вызова IDENTIFY DEVICE=ECh контролер сообщит об ошибки, что команда не поддерживается, но сигнатуру не затрет. Поэтому если есть сигнатура, то следует вызвать команду IDENTIFY PACKET DEVICE=A1h для получения параметра дисковода. Если SATA(нашел это в документации на сата диски) контролер вернул в регистр статуса 7Fh, а в других FFh то устройство не позволяет записывать в регистры. То есть устройство отсутствует. Еще нужно учитывать что контролер SATA не различает диск мастер или подчиненный.
Pavia можеш дать о SATA больше инфы? буду очень благодарен, так как у меня есть етот тип диска и хотел бы ищо с ним роботать. Зачем? можна использовать стандартные порты: 0х1f0 (и дальше) для первого канала и 0х170(и дальше) для второго. Я так делал - всьо работает, ищо осталось найти логические диски =). Пожалуста дай больше инфы об SATA
Дело в том что в системе может быть несколько контролеров встроенных и подключенных в качестве плат расширения. Так что в системе помима двух базовых каналов 1f0h, 170h могут существовать и др. Работа с SATA дисками почти не отличается от работы с обыкновеными ATA/IDE дисками. У SATA контролера бывает режим в которым он полностью идентичен ATA. Так как SATA(I и II) всетаки отличается от ATA, то возникают проблеммы. Какие именно не знаю.
Если не тежело можеш дать кусок кода по алгоритму что ты предлогал в 20:39:15, и ищо посмотри код: Код (Text): find_hdd: push edx push es xor dx, dx mov es, dx mov edx, [es:0x46] mov [time], edx shl si, 0x01 mov dx, [base_port_addr+si] mov [port], dx add dx, 0x07 f_bsy1: mov eax, [es:0x46c] sub eax, [time] cmp eax, wait_time ja error1 in al, dx test al, 0x80 jnz f_bsy1 mov dx, [port] add dx, 0x06 mov al, 0xe0 out dx, al mov dx, [port] add dx, 0x07 f_bsy_drdy1: mov eax, [es:0x46c] sub eax, [time] cmp eax, wait_time ja error1 in al, dx test al, 0x80 jnz f_bsy_drdy1 test al, 0x40 jz f_bsy_drdy1 mov dx, [port] add dx, 0x07 mov al, 0xec out dx, al jmp g_exit ................. error1: mov ax, 0x01 jmp exit error2: mov ax, 0x02 g_exit: mov ax, 0x00 exit: pop es pop edx ret .......... time dd 0x00 base_port_addr dw 0x1f0, 0x170 port dw 0x00 wait_time = 0x02 что в ньом нетак? у меня всьо время на всех каналах (канал 1 и 2, Master и Slave) ax=0001, но почему? у меня 1 HDD на IDE, поетому должен быть найденым - но нет, почему? P.S: у тебя есть icq?
Полезно по форуму искать, однако http://www.wasm.ru/forum//viewtopic.php?id=16740 http://www.wasm.ru/forum//viewtopic.php?id=16109
VaStaNi интересные обсуждения, а ты бы немогу поделиться кодом (если у тебя он есть)или хоть точной что куда пхать чтобы работало? буду очень благодарен, так как давно хотел поюзать SATA
ну что нашел ктото ошыбку в моем коде? если да - то напишыте пожалуста где она, буду очень благодарен
AntiB Код не было время потестировать. А ошибка в 5 строчке mov edx, [es:0x46] Не из той ячейки читаем. Зато свой протестировал. Да, оказываеться есть ряд случиев, которые я не учел. Определяет все, но в некоторых случаех находит лишнее.
я исправил свой код и додал ищо проверку в конце на BSY и DRQ, но результатов ноль - тоесть у меня al = 0x00 даже если ХДД нету на етом канале, может есть ищо ошыбки?
Pavia - можеш выложыть ту часть кода, которая отвечает за нахождения HDD, хочу узнать что я делаю нетак
Ладно, я уже сам разобрался в определения HDD, а как узнать или ето HDD или CD-привод? и может ктото может помоч с SATA? А то я непонимаю до конца что и как делать