OSDev http://osdev.su/ |
|
Загрузка с флешки http://osdev.su/viewtopic.php?f=6&t=455 |
Страница 5 из 13 |
Автор: | phantom-84 [ 21 ноя 2011, 10:17 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Предыдущий вариант пакета был правильный, просто нужно было использовать номер сектора 1, а не 2. Размера 18 нет вообще. Кроме 16 есть размеры 18h, 1Сh и 20h, но тебе их использовать не нужно. Также в этот раз ты допустил ошибку в указателе: когда ты явно разделяешь указатель на два слова, то смещение находится в первом слове, а сегментный адрес во втором. Правильные варианты: 1) dd 8200h 2) dd 0:8200h 3) dw 8200h,0 Что касается номера сектора, то это поле всегда 64-разрядное, но если логически ты работаешь только с 32-разрядными номерами, то можно обнулить старшее двойное слово и больше его не менять, т.е. твой вариант подходит: lba dd ?,0 ; в первое двойное слово записываешь нужный номер сектора |
Автор: | Станислав [ 22 ноя 2011, 06:09 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
спосибо за мподсказку, всёровно не грузится, работаю пока в загрузчике, зато с весой и зашишеным режимом получается узнаю LFB и другое, устанавливаю режим, перехожу в зашишеный режим, адрес LFB причем не смешается закрашиваю фон, зацыкливаю на проверку клавиатуры. Подскажите правильно ли я обхожусь с клавиатурой, нельзя перехватить вектор клавиатуры и как бы мне ешё мышку добавить через порты, у нее бывает и 5 кнопок, олесики, это с каждой в отдельности надо разбираться? И еще подскажите, в ПМ режиме никак уже нельзя вызвать функции биус int10, int13 org 0x7C00 use16 start: xor ax,ax mov ds,ax mov es,ax mov ss,ax mov sp,0x7C00 mov bx,4112h mov ax,4f01h ;узнаем LFB режима 640:480:4 mov di,Mode_Info mov cx,bx int 10h mov ax,4f02h ;установим режим int 10h cli lgdt [gdtr] mov eax, cr0 or al,0x1 mov cr0,eax jmp 0x10: protected use32 protected: mov ax,0x8 mov ds,ax mov es,ax mov ss,ax mov esp,0x7C00 cmp byte[ModeInfo_BitsPerPixel],32 jne ErrorStop mov ebx,[clTeal] call fill_screen .wait: in al, 64h ;считываем состояние test al, 1h ;если 1 то нажата клавиша jz .wait in al, 60h ;скан-код нажатия получаем из порта 60 cmp al, 05h ;скан-код je .fin cmp al, 0bh ;скан-код je .one cmp al, 0ah ;скан-код je .one cmp al, 04h ;скан-код je .one jmp .wait .fin: mov ebx,[clLime] call fill_screen mov al,0 jmp .wait .one: mov ebx,[clFuchsia] call fill_screen mov al,0 jmp .wait fill_screen: mov edi,[ModeInfo_PhysBasePtr] mov ecx,640*480 .next: mov dword[edi],ebx add edi,4 loop .next ret ErrorStop: hlt jmp $ gdt: dw 0x0000, 0x0000, 0x0000, 0x0000 sys_data: dw 0xFFFF, 0x0000, 0x9200, 0x00CF sys_code: dw 0xFFFF, 0x0000, 0x9800, 0x00CF gdt_end: gdtr: dw gdt_end - gdt - 1 dd gdt clFuchsia dd 00FF11FFh clTeal dd 00888800h clLime dd 0006FF06h times 510- ($-start) db 0 dw 0xaa55 |
Автор: | pavia [ 22 ноя 2011, 18:47 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Цитата: И еще подскажите, в ПМ режиме никак уже нельзя вызвать функции биус int10, int13 Пока эмулятор реального режима не напишешь никак. Цитата: спосибо за мподсказку, всёровно не грузится, Сделай вывод значений регистров которые передаёт биос при запуске MBR. И покажи результаты. Во вторых сделай чтение следующего сектора после MBR. И передай туда управление. Надеюсь ты читаешь сектор не в видео память? Код чтения приложи на форум. Цитата: Подскажите правильно ли я обхожусь с клавиатурой, нельзя перехватить вектор клавиатуры и как бы мне ешё мышку добавить через порты, у нее бывает и 5 кнопок, олесики, это с каждой в отдельности надо разбираться? Клавиатуру не смотрел, но вот процедуры ты оформляешь неправильно. Прочитай про соглашения при вызовах процедур. Надо сохранять значения регистров, а ты это не делаешь. Параметры передаёшь не обще принятым способом. Потом запутаешься и ошибки будут. Во вторых не бойся использовать стек и делать много процедур. По поводу мышек. Их много разных и с каждой надо в отдельности. Но можно выделить два больших класса. PS/2 совместимые с майкрософт или IBM. И USB мыши. У USB протокол богатый, там одного драйвера хватит чтобы охватить всё разнообразие мышей в том числе и 5 кнопочных. |
Автор: | Станислав [ 23 ноя 2011, 05:28 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
pavia писал(а): Сделай вывод значений регистров которые передаёт биос при запуске MBR. И покажи результаты. Как pavia писал(а): Во вторых сделай чтение следующего сектора после MBR. И передай туда управление. Надеюсь ты читаешь сектор не в видео память? Код чтения приложи на форум. Я уже как только не читал. Сейчас думаю, а если перебрать значения dl диска и посмотреть функции получения информации о дисках и попробывать их прочитать, может они читаются? Мнебы считать в память картинку фон закрасить, иконки, файлы шрифтов, библиотеки. А как кстати заполнить память из реального режима которая после 1 метра. Встречал пример заполнения из большова реального режима там доступны ф-и биус. И пример чтения ATA через порты, кстати может после перехода в зашишеный режим читать винчестер через порты? Если есть код по мышкам на асме, или определения дисков поделитесь, а то итак инет каждый день рою. Khalizev@eml.ru Или сбору векторов прерываний, с шин, портов, клавиатур, ... В инете нашел исходники загрузчика который читает fat32!!! В заголовках информации fat32 подставил данные своей флешки и он запустил файл на ней по указанному адресу Сам файл был моим он выводил слово на экран. Это слово высветилось. Я рад, буду в нем разбираться. Использует ф-ю чтения 42h |
Автор: | Станислав [ 23 ноя 2011, 08:27 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
реализавал проверку 10 дисков после 80h функцией INT 13 48h занес в si, буфер Info и вывел на экран из него со смешением на 24h (там ASCIZ имя главной шины и ASCIZ имя-тип интерфейса) результат был вывод двух дисков, флешки и один винт все правильно pci usb pci sata может просто флешка заблокирована, есть функция INT 13 – IBM/MS INT 13 Extensions – Блокировка/Разблокировка диска AH = 45h AL = операция 00h средства блокировки в диске 01h средство разблокировки 02h проверка статуса блокировки DL = номер диск проверить не получается на блокировку, в ah не 0 о круто я прочитал сектор с диска 81h, с винта, а флешка видемо заблокирована на другом ноутбуке пишет pci usb pci ata pci usb Я туда еше флешку вставил помимо загрузочной |
Автор: | phantom-84 [ 23 ноя 2011, 15:00 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Станислав писал(а): В инете нашел исходники загрузчика который читает fat32!!! Чего и следовало ожидать, т.е. нету никакой мнимой блокировки, а просто ты допускаешь какую-то ошибку при чтении. Если дашь ссылку на загрузчик, я смогу прокомментировать его качество.
В заголовках информации fat32 подставил данные своей флешки и он запустил файл на ней по указанному адресу Сам файл был моим он выводил слово на экран. Это слово высветилось. Я рад, буду в нем разбираться. Использует ф-ю чтения 42h |
Автор: | Станислав [ 23 ноя 2011, 15:14 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
phantom-84 писал(а): Чего и следовало ожидать, т.е. нету никакой мнимой блокировки, а просто ты допускаешь какую-то ошибку при чтении. Если дашь ссылку на загрузчик, я смогу прокомментировать его качество. В помоши его разбора не откажусь. Почему таже функция у меня не работает а у них работает???? Как бы мне выцепить работающую функцию чтения сектора от туда, вернее ф-я таже но почему она работает? Мне нужно просто без файловой системы. http://staskhalizev.narod.ru/BOOTF32.ASM код чтения сектора в загрузчике код поиска файла находится на втором секторе, т.е. он сначало его загружает а потом ишет файл. Кстати после заполнения первых трёх секторов бинарником, флешка сразу становится форматированой Копируем туда файл ggg (имя я уже подправил). Он будет запускаться в 0:600 |
Автор: | phantom-84 [ 23 ноя 2011, 18:11 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Станислав писал(а): В помоши его разбора не откажусь. Почему таже функция у меня не работает а у них работает???? Я тебе примерный алгоритм привел. В приведенном загрузчике делается то же самое. Только мне больше нравится использование самомодифицируемого кода для вызова одной из двух процедур чтения/подготовки параметров для чтения (readchs или readlba). Попробую собрать функцию чтения на основе кода моих загрузчиков. Или написать с нуля.Как бы мне выцепить работающую функцию чтения сектора от туда, вернее ф-я таже но почему она работает? Мне нужно просто без файловой системы. Цитата: Кстати после заполнения первых трёх секторов бинарником, флешка сразу становится форматированой НЕ ДЕЛАЙ ТАК. Правильный вариант такой: сначала форматируешь флешку, потом записываешь код загрузчика, оставив служебные поля BS такими, какими они были после форматирования (при необходимости откорректировав ссылку на FSInfo, см. далее). В приведенном загрузчике структура FSInfo описывается как часть загрузчика и размещается в третьем секторе раздела, но правильнее, когда эта структура остается в оригинальном виде, и наиболее типично, когда она размещается во втором секторе раздела (хотя лично мне тоже нравится вариант, когда код загрузчика размещается в первых двух секторах, а FSInfo - в третьем секторе). Но оставим пока FAT32.
|
Автор: | phantom-84 [ 23 ноя 2011, 19:24 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Код: include "edd.inc"
org 7C00h xor bx,bx cli mov ss,bx mov sp,$$ sti mov ds,bx jmp 0:@f @@: label drive byte at $$-2 push dx mov ah,41h mov bx,55AAh int 13h jc short @f cmp bx,0AA55h jne short @f shr cx,1 jc short lba @@: mov word [after-2],readchs-after mov ah,8 pop dx push dx int 13h jc short error and cx,3Fh label spt word at $$-4 push cx mov cl,dh inc cx label heads word at $$-6 push cx lba: mov ax,7E0h mov es,ax mov ax,1 xor bx,bx call read @@: hlt jmp short @b ; ax:bx - lba ; es - bufseg read: mov dl,[drive] mov dh,5 @@: push bx push ax push dx call readlba after: pop dx jc short reset pop ax pop bx ret reset: push dx mov ah,0 int 13h pop dx pop ax pop bx dec dh ja short @b error: hlt jmp short error ; input: ax:bx - devident, bp - divisor ; output: ax:bx - quotient, dx - remainder divide: xor dx,dx xchg ax,bx div bp xchg ax,bx div bp ret ; ax:bx - lba ; dl - drivenumber readchs: mov ch,dl mov bp,[spt] call divide inc dx mov cl,dl mov bp,[heads] call divide and bx,bx jnz short error cmp ah,4 jae short error mov dh,dl mov dl,ch mov ch,al ror ah,1 ror ah,1 or cl,ah mov ax,201h int 13h ret ; ax:bx - lba ; dl - drivenumber readlba: xor cx,cx pop bp push cx push cx push bx push ax push es push cx mov cl,1 push cx mov cl,DAPACK_SIZE push cx mov si,sp mov ah,42h push bp int 13h ret DAPACK_SIZE db 440-($-$$) dup 0 |
Автор: | Станислав [ 24 ноя 2011, 05:58 ] |
Заголовок сообщения: | Re: Загрузка с флешки |
Блин вся ошибка заключалась в том, что первый номер сектора указывается со смешением 64 Из за этой фигни я столько времяни потерял блииииииииииииииииииииииииннннннннннннннннн disk_address_packet: db 16, 0 dw 1 dw next_stage, 0 dq 64 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!это был первый Я в коде увидел когда пакет заполняется в номер первого сектора сначало идет какойто hidden_sectors потом к нему добавляют номет первого. Чертовы скрытые сектора в сатавском диске их небыло, а в аташном помоему есть Сейчас думаю перейти в длинный реальный режим и скопировать пару сотен секторов в верхнюю память Из реального режима этого не сделать ни как? |
Страница 5 из 13 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |