Доброго времени суток ! Помогите пожалуйста вот с такой задачей: Место нахождения -> до загрузки ОС, т.е. можно сказать сразу после отработки BIOS Нужно пусть даже самое простое - загрузить с CD-диска первый (второй, третий, ... не важно) сектор. Читал мануал 'ATA для дZенствующих. Часть 1' и вторую часть её, но потестил и вроде как не применима метода к оптическим приводам (в том элементарном представленном виде). Хотя, честно говоря, видимо я просто не в курсе нюансов. Интересно, без драйвера можно обойтись ?!
А чего, INT 13 (или INT 40) - это слишком высокий уровень? Для того и БИОС,чтоб не морочится с драйверами.
Нет,драйверов не нужно, по крайней мере, когда я баловался в свое время таким же образом с флоппиком,насколько помню, никаких особо проблем не возникло..вот только код потерялся где-то в бардаке моем.. Вылаживай, что ты там тестил )) посмотрим)
Если загрузка идёт с CD после биоса, то происходит эмуляция floppy, т.е. к CD-rom можно обращаться как к дисководу А:. А загрузки c си-ди не было. Хотя если вы знаете реально работающую программку объясните хоть принцип с int'ами.
Со времени сообщения нарыл некоторую инфу и понял, что не годится то, что для винтов, поэтому ссылка на статью: (надеюсь это можно, т.к. ссылка на конечную статью, даже дипломную работу и информация в ней содержащаяся отсутствует на сайте): http://masters.donntu.edu.ua/2005/fvti/nikolaev/library/cd.htm Код (Text): ; - = Программа CD-Rom reading = - CDRom_read proc mov dx,3f6h ;Запретить прерывания, установить в 1 бит 1 регистра 3F6h mov al,2h out dx,al mov al,0A0h mov dx,01f6h ;Выбор устройства на канале. out dx,al mov dx,01f7h ;Ждем пока BSY=1, на случай если девайс занят m1: in al,dx test al,80h jnz m1 ;test al, 08h ;jnz m1 mov dx,1f4h mov al, 0 out dx,al mov al, 02h mov dx,1f5h out dx,al mov al, 0ECh mov dx, 01f7h out dx, al mov dx, 01f4h m5: in al, dx cmp al, 14h jnz m5 inc dx m6: in al, dx cmp al, 0EBh jnz m6 mov dx, 01f4h mov al, 01h out dx, al mov al, 00h inc dx out dx, al mov dx, 01f7h mov al, 0A0h out dx, al mov dx,01f7h m2: ;Ждем, DRQ=1 и BSY=0 in al,dx test al,80h jnz m2 test al,08h jz m2 mov dx, 01f0h mov al, 1bh out dx, al mov al, 00h out dx, al mov ax, 0000h out dx, ax mov al, 02h out dx, al mov al, 00h out dx, al mov ax, 0000h out dx, ax mov ax, 0000h out dx, ax mov ax, 0000h out dx, ax mov dx,3f6h ;Разрешить прерывания от устройства mov al,0 out dx,al ret CDRom_read endp Если не понятно, то могу написать с пояснениями (выложу файлом); да и в статье там всё расписано. Но код элементарный. Но не работает. Пока что. Хотел бы добавить, что это очень интересная тема про программирование оптических накопителей (IDE/ATAPI устройств). Информации маловато - или дизассемблируй драйверы или изучай исходники.
Это неправда. Даже если эмуляция флоппика используется, то ее можно отключить теми же функциями BIOS. А вообще лучше сразу сделать загрузочный CD без эмуляции флоппика/харда, тогда и отключать ничего не придется. В ситуации Место нахождения -> до загрузки ОС, т.е. можно сказать сразу после отработки BIOS целесообразнее использовать именно функции BIOS.
Так не нужно как раз отключать, но поскольку не происходит первоначальная загрузка с CD поэтому эмуляции флоппика не происходит (т.е. можно обращаться посредством того же int 13h как к флоппику, а он (флоппик) сдвигается как дисковод B. В том и дело, что проэмулировать я не знаю как под флоппик и пока ещё (только начал) не смог добиться работы через порты. А по поводу загрузочного CD (или дискеты) сразу отпадает. Прошу прощения, но лёгких путей не надо. Смысл в загрузке всего этого с винчестера (темы не касается). Хотелось бы понять, как реализовать или эмуляцию, или работы через порты. Подскажите каким образом. Пробовал ясное дело через int 13h, так читает дисковод. Примечательно, что в книгах ни слова о CD/DVD. Только работа c дисководами и более всего с HDD через вышеупомянутое прерывание. ... покой нам только снится ...
Объясняю, что посекторное чтение с CD лучше выполнять именно в режиме без эмуляции. В этом случае в коде загрузочной записи к примеру ты получаешь от BIOS именно номер CD, а не эмулируемого флоппика/харда. Этот номер вполне успешно может быть использован в функциях BIOS int 13h/4xh.
Каким образом и в каком коде ? Поподробнее. И если не сложно, то где можно глянуть о прервыниях int 4xh (40h) ?
Огромная благодарность за ссылку, но завести ничего не удалось. Прошу ваших разъяснений. Немного повторюсь: Укажите пожалуйста, где можно получить этот самый 'BIOS device number'. Даже так делал. Перебирал эти же номера на функции от 0 до 255 (вход для bios dev num) на наличие ошибки. Ошибки не было на 80h и F2h(?). В документе по EDD... указано, что стандартный номер для CD/DVD A0h. Но он не идёт ! ... Хоть натолкните на мысли. После прочтения сначала документа и попыток игры с функциями ничего не получилось и опять вернулся к портам I/O. Так вот там удалось прочитать по команде 03 строку из CD вместе с его названием. Но! Это просто команда. А когда дело доходит до ATAPI Packet (AP), то после команды A0 (ввод AP) вроде и шесть слов доправляю и BSY в 0 устанавливается, а DRQ не становится готовым, т.е. 1. Вообщем ещё раз: хоть как-нибудь возможен ли запуск CD/DVD вообще в реальном режиме (BIOS творит чудеса !!!) ??? И если можно, то как ???
Немного добавлю: прошу прощения, что пишу вообще не понятно как - без кода, как в тумане. По крайней мере вроде всё делаю как в описании. Если нужен код просто укажите. Не выкладываю т.к. куча закомментированных строк - постоянные безуспешные опыты ... ... Надеюсь на хоть какое-то продвижение ...
Наткнулся на документик http://wiki.osdev.org/ATAPI Так вот там всё то же о портах ввода-вывода, но после загрузки 6 слов в '16-битный' порт ждать не получится от DRQ=1 хотя бы, а указывается, что надо ждать IRQ. Вопрос ! Что значит ждать IRQ. В смысле, каким образом проверить, что прерывание (IRQ) выполнилось (пришло) ?
EDDspec30.pdf Ты сначала написал, что до спецификации не добрался, а сейчас ссылаешься на какой-то таинственный "документ по EDD"... Если можно, цитату, где написано, что номер CD/DVD - это A0h. Я вполне допускаю, что номером CD может быть F2h. Вообще я CD с помощью BIOS "со стороны" не читал. Вполне может быть, что эта возможность появляется лишь тогда, когда ты с этого CD загружаешься. Загрузчику, находящемуся на CD, номер диска передается BIOS в регистре DL при передаче ему управления. Я просто использовал это значение и проблем не возникало. Единственный момент, который нужно учитывать - в режиме без эмуляции размер сектора равен 2 кб. Напиши простейший загрузчик для CD, для начала выводящий номер диска из DL. Запиши загрузочный CD с этим загрузчиком в режиме без эмуляции... и будет тебе счастье. Чего тут непонятного. "Вешаешь" обработчик, запускаешь команду, ждешь прерывания или таймаута, при возникновении прерывания проверяешь, нет ли ошибки.
В простейшем случае заведи обнуляемый при отправке команды "флажок", который будет устанавливаться внутри обработчика прерывания. После отправки команды жди установки флажка или таймаута. Также желательно иметь "флажок" или переменную для отслеживания возникающих ошибок.
Я не писал, что не добрался, но: 1) ... И если не сложно, то где можно глянуть о прервыниях int 4xh (40h) ? и 2) ... Огромная благодарность за ссылку, но завести ничего не удалось ... - мой 3-ий пост снизу об EDD BIOS Specification на ... от cppasm - как раз четвёртую версию EDD нашёл и ясное дело, что сразу начал знакомиться, иначе бы не писал, что не заводиться ... ... не таинственный, а по совету cppasm Кстати немного не по теме, но есть также документ об устаревших (obsoleting) функциях int 13h (предложение об их перенесении в категорию устаревших и вообще удалении из обработчика) Из d2132r1-Enhanced_Disk_Drive_-_4_EDD-4.pdf - п. 7.2.3 No Emulation Boot -> ... The system BIOS shall assign the CD-ROM drive a device number. A common industry number is A0h ... Проверял я на нём, но ошибка та же. Ошибка в ah=01h. Из этого же документа - Invalid Command. Мой 4-ый пост сверху. Дело в том, что передача управления осуществляется после отработки boot loader'a на жёстком диске. Мне не нужно тем более делать загрузочный диск. Из сообщения - происходит как раз эмуляция флоппи-дисковода при загрузке (после BIOS) с CD/DVD-Rom. Мне надо либо САМОМУ эмулировать образ, либо читать без эмуляции, либо работа через порты. Также использовал команду terminate boot emulation (4Bh кажется) с параметром все (7fh), то опять ошибка. С чем ошибки могут быть связаны. Всё же более к портам склоняюсь. Я уже и под дос пытался отлаживать в AFD функцию 35h int 21h ))) За это благодарю. Ясно. Честно говоря как раз перед прочтением разбирался с прерываниями. Там у меня в посте про команду в порт для выдачи информации из драйва ошибка -> не 03, а A1h команда ...
Я имел в виду функции 4xh прерывания int 13h. Собственно они и описываются в спецификации EDD. С помощью традиционного дискового сервиса BIOS, естественно, к CD доступ ты не получишь, даже если у тебя будет в распоряжении подходящий номер диска. Если у меня получится прочитать CD "со стороны" с помощью BIOS, отпишусь.
Доброго времени суток ! Всех поздравляю с наступающим Новым Годом и Рождеством Господа нашего Иисуса Христа. Желаю сбыться всему самому доброму и хорошему ! С наступающими праздниками коллектив данного сайта и всех посетителей ! Откомпилируйте программу, код которой приведён ниже. Хочу узнать будет она работать или нет у меня. Я ставил прерывания уже и ... ничего. Очень жду. Заранее благодарю откликнувшихся ... Код (Text): /* The default and seemingly universal sector size for CD-ROMs. */ #define ATAPI_SECTOR_SIZE 2048 /* The default ISA IRQ numbers of the ATA controllers. */ #define ATA_IRQ_PRIMARY 0x0E #define ATA_IRQ_SECONDARY 0x0F /* The necessary I/O ports, indexed by "bus". */ #define ATA_DATA(x) (x) #define ATA_FEATURES(x) (x+1) #define ATA_SECTOR_COUNT(x) (x+2) #define ATA_ADDRESS1(x) (x+3) #define ATA_ADDRESS2(x) (x+4) #define ATA_ADDRESS3(x) (x+5) #define ATA_DRIVE_SELECT(x) (x+6) #define ATA_COMMAND(x) (x+7) #define ATA_DCR(x) (x+0x206) /* device control register */ /* valid values for "bus" */ #define ATA_BUS_PRIMARY 0x1F0 #define ATA_BUS_SECONDARY 0x170 /* valid values for "drive" */ #define ATA_DRIVE_MASTER 0xA0 #define ATA_DRIVE_SLAVE 0xB0 /* ATA specifies a 400ns delay after drive switching -- often * implemented as 4 Alternative Status queries. */ #define ATA_SELECT_DELAY(bus) \ {inb(ATA_DCR(bus));inb(ATA_DCR(bus));inb(ATA_DCR(bus));inb(ATA_DCR(bus));} /* Use the ATAPI protocol to read a single sector from the given * bus/drive into the buffer using logical block address lba. */ int atapi_drive_read_sector (uint32 bus, uint32 drive, uint32 lba, uint8 *buffer) { /* 0xA8 is READ SECTORS command byte. */ uint8 read_cmd[12] = { 0xA8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; uint8 status; int size; /* Tell the scheduler that this process is using the ATA subsystem. */ ata_grab (); /* Select drive (only the slave-bit is set) */ outb (drive & (1 << 4), ATA_DRIVE_SELECT (bus)); ATA_SELECT_DELAY (bus); /* 400ns delay */ outb (0x0, ATA_FEATURES (bus)); /* PIO mode */ outb (ATAPI_SECTOR_SIZE & 0xFF, ATA_ADDRESS2 (bus)); outb (ATAPI_SECTOR_SIZE >> 8, ATA_ADDRESS3 (bus)); outb (0xA0, ATA_COMMAND (bus)); /* ATA PACKET command */ while ((status = inb (ATA_COMMAND (bus))) & 0x80) /* BUSY */ asm volatile ("pause"); while (!((status = inb (ATA_COMMAND (bus))) & 0x8) && !(status & 0x1)) asm volatile ("pause"); /* DRQ or ERROR set */ if (status & 0x1) { size = -1; goto cleanup; } read_cmd[9] = 1; /* 1 sector */ read_cmd[2] = (lba >> 0x18) & 0xFF; /* most sig. byte of LBA */ read_cmd[3] = (lba >> 0x10) & 0xFF; read_cmd[4] = (lba >> 0x08) & 0xFF; read_cmd[5] = (lba >> 0x00) & 0xFF; /* least sig. byte of LBA */ /* Send ATAPI/SCSI command */ outsw (ATA_DATA (bus), (uint16 *) read_cmd, 6); /* Wait for IRQ that says the data is ready. */ schedule (); /* Read actual size */ size = (((int) inb (ATA_ADDRESS3 (bus))) << 8) | (int) (inb (ATA_ADDRESS2 (bus))); /* This example code only supports the case where the data transfer * of one sector is done in one step. */ ASSERT (size == ATAPI_SECTOR_SIZE); /* Read data. */ insw (ATA_DATA (bus), buffer, size / 2); /* The controller will send another IRQ even though we've read all * the data we want. Wait for it -- so it doesn't interfere with * subsequent operations: */ schedule (); /* Wait for BSY and DRQ to clear, indicating Command Finished */ while ((status = inb (ATA_COMMAND (bus))) & 0x88) asm volatile ("pause"); cleanup: /* Exit the ATA subsystem */ ata_release (); return size; }
Arounder http://wiki.osdev.org/ATAPI Там же написано : Будет работать в драйвере, т.е. плюс надо еще кучу инклюдов добавить. И естественно это драйвер какой-то ОС. То что ты спрашивал - это загрузчик. Вот и ищи инфу там. В конце концов найди исходники загрузчика из БИОС.