Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

bootloader + qemu

20K
29 сентября 2006 года
once
11 / / 29.09.2006
Я взял bootloader следующего содержания:
[ORG 0x7C00]

start:

cli
mov ax, cs
mov ds, ax
mov ss, ax
mov sp, start

sti

mov si, msg
call kputs

cli
hlt
jmp short $

kputs:
.loop:
lodsb
test al, al
jz .quit
mov ah, 0x0E
int 0x10
jmp short .loop
.quit:
ret

msg: db "Hello from the world of real programming!",0x0A,0x0D,0
times 510-($-$$) db 0
db 0xAA, 0x55
Скомпилировал этот загрузчик с помощью nasm:
$ nasm -fbin start.asm -o start.bin
И вот я пытаюсь запустить данный загрузчик на qemu:
$ qemu -fda ./start.bin -boot a
В итоге получаем:
Boot from Floppy 0 failed
FATAL: Not a bootable disk
Что хотелось бы добавить. Вообще эта процедура описывалась не для qemu, а для VMWare, но надо бы попытаться запустить на qemu.

А теперь вопросик, я наверно что нить не так делаю, что именно? )
14K
30 сентября 2006 года
shoorick
48 / / 07.06.2006
неясно: ты пытаешься подсунуть 512 байт как образ дискеты 1.44? нужно хотя-бы дорастить до нормального размера (может, с реальной машиной это и пройдет, хотя дискета будет нечитаемой)

вот два пути, которые я пробовал, хотя они и на фасме. образ проверял как-раз на qemu.
20K
30 сентября 2006 года
once
11 / / 29.09.2006
Яяясно, я подозревал что там не все чисто. Спасибо. Если не влом напиши как ты собираешь эти образики и наращиваешь их, но это если не влом, а так сам посижу подумаю (типа совсем обленился).
14K
30 сентября 2006 года
shoorick
48 / / 07.06.2006
это шаблоны для winasm studio + fasm add-in ( http://www.winasm.net )
если все настроено, то собирается по ctrl+enter, а запускается командой "выполнить". если собирать их из winasm studio, то надстройку fasm нужно брать последнюю с форума (в закачки еще не добавлена, так как не завершена). если будут проблемы в начале - могу проконсультировать.
20K
02 октября 2006 года
once
11 / / 29.09.2006
Ну что можно сказать, после нескольких часов извращения был получен следующий загрузчик:

org 7C00h

start:
mov ax,cs
mov ds,ax
mov ss,ax
cli
mov sp,start
sti
mov cx,count
mov si,hello
mov ah,0Eh
printf:
lodsb
int 10h
loop printf
xor ah,ah
int 16h
int 19h

hello db "Real coding shcoding!",0x0a,0x0d
count equ $-hello

times 510-($-$$) db 0
db 055h,0AAh


Соответственно компиляция:
$ nasm -fbin bootn.asm -o bootn.bin

Соответственно запуск:
$ qemu ./bootn.bin
или:
$ qemu -fda bootn.bin -boot a

На размер вообщемто ему пофиг )) (типа можно подсовывать и 512b). В реальных условиях не проверял, т.к. нет flop'ика но чутье подсказывает что будет все ок. Чет у меня там было наворочено в исходники, че именно не понял ). Ща с помощью твоего исходника все прояснил и составил свой понятный исходник.
20K
02 октября 2006 года
once
11 / / 29.09.2006
А у тебя хотел спросить, че за заголовок, вообщем для чего он:
db "HE-HE OS"; ; 8
dw _bs ; b/s
db 1 ; s/c
dw 1 ; rs
db 2 ; fats
dw 224 ; rde
dw 2880 ; as
db 0F0h ; media
dw 9 ; s/fat
dw _st ; s/t
dw _hd ; h
dd 0 ; hs
dd 0 ; --
db 0 ; drv
db 0 ; --
db 29h ; ebr
dd 0 ; sn
db "NO NAME "; ; 11
db "FAT12 "; ; 8

Что он делает? Вот это хотелось бы прояснить. А файл fat12.inc к чему, там мощно всего наворочено? Это типа к таблице fat'овской?
14K
02 октября 2006 года
shoorick
48 / / 07.06.2006
шаблон с fat.inc:
при ассемблировании boot_fat.asm создается не только код загрузочного сектора, но и полная структура диска с файловой системой фат12 (образ), при этом в этот образ автоматически добавляются указанные файлы:
fat12 \
"A TXT","a.txt",ff0,\
"B TXT","b.txt",ff1,\
"KERNEL BIN","kernel.bin",ff2

"KERNEL BIN" - имя файла в образе (обязательно 8+3 символа)
"kernel.bin" - имя исходного файла на диске
ff2 - "очередная метка" (ну не сделал автоматически :)

файлов может быть максимум - см. емкость корневого каталога. подкаталоги не поддерживаются. также длина файла выравнивается на два сектора, так что могут быть пустые промежутки между файлами в 512 байт (но они не теряются, просто макрос не может их заполнить)
на счет переполнения образа не проверял (надеюсь на совесть :)

на диске в бут-секторе идет произвольный текст по смещению + 3 (8 байт), а за ним - заголовок BPB (Bios parameter block), в котором указываются параметры диска. если его опустить - машина может загрузится (я так пробовал), но диск не будет видим из под дос даже если вся остальная структура сохранена.

выражаясь проще: fasm boot_fat.asm сформирует образ дискеты с загрузочным сектором, включив в него также указанные файлы. вот.
14K
02 октября 2006 года
shoorick
48 / / 07.06.2006
mov ss,ax
cli
mov sp,start
sti
===
я читал в литературе, что если mov ss/mov sp идут подряд, то прерывания между ними запрещены, то есть в данном случае cli/sti не нужны.
14K
02 октября 2006 года
shoorick
48 / / 07.06.2006
dw _bs ; bytes per sector
db 1 ; sectors per cluster
dw 1 ; boot reserved sectors
db 2 ; count of fats
dw 224 ; root directory entries count
dw 2880 ; total sectors
db 0F0h ; media type
dw 9 ; sectors per fat
dw _st ; sectors per track
dw _hd ; heads count
dd 0 ; hidden sectors
dd 0 ; --
db 0 ; drv
db 0 ; --
db 29h ; extended boot record
dd 0 ; drive serial number
db "NO NAME "; ; 11 disk label
db "FAT12 "; ; 8 file system id
20K
02 октября 2006 года
once
11 / / 29.09.2006
С прерываниями разберусь. Просто мне чето попадалось типа того что при изменение указателя стека(sp) надо отключать прерывания. А вот эти переменный они для чего нужны. Ты их расшифровал, а где ты их используешь?
349
02 октября 2006 года
Phantom-84
656 / / 27.10.2005
По поводу запрета прерываний вы оба правы. Один прав когда говорит, что после загрузки регистра SS прерывания запрещаются до выполнения след. команды. Другой прав, когда по прежнему использует инструкции cli/sti, т.к. это делает его код совместимым с очень древними процами, в которых автоматический запрет не выполнялся, только я не понял, почему в коде идет запрет прерываний только на выполнение загрузки SP, вообще это делается так:

cli
mov ss,ax
mov sp,start
sti
14K
03 октября 2006 года
shoorick
48 / / 07.06.2006
я их использую в макросе, формирующем фат. но они не для меня, а для операционной системы, чтобы она знала геометрию диска. в реальной жизни они заполняются при форматировании, когда, например, указываешь, сколько дорожек, секторов на дорожку и т.п., а не по умолчанию. возьми любую дискету и посмотри бут-сектор - полезно ;)
14K
03 октября 2006 года
shoorick
48 / / 07.06.2006
насчет древних процов (не увидел сразу ответ) - я как раз читал об этом в нашей кгижке о 1810ВМ86
20K
03 октября 2006 года
once
11 / / 29.09.2006
Вообще я думал на регист ss не распространяется, а распространяется на sp. Видимо был не прав. А может и нет. Смотри phantom ты написал "Один прав когда говорит, что после загрузки регистра SS прерывания запрещаются до выполнения след. команды.". Может я неправильно читаю, но это же аналогично:

mov ss,ax
cli
mov sp,start
sti

Тока явно, т.к. из твоей фразы(повторюсь) я понял следующее:

mov ss,ax
[прерывания отключаются на одну команда] - автоматическм
... (любая команда)
[прерывания включаются] - автоматически

Я непраильно понял?
20K
03 октября 2006 года
once
11 / / 29.09.2006
boot-сектор посмотреть? Если ты мне подскажешь как это сделать, то очень облегчишь мне задачу, а я за это скажу большое спасибо. Но в принципе уже и так большое спасибо ).
20K
03 октября 2006 года
once
11 / / 29.09.2006
По поводу посмотреть boot на дискете, это типа сделать ее образ и посмотреть данный образ под "микроскопом", так штоль?
14K
04 октября 2006 года
shoorick
48 / / 07.06.2006
1.насчет прерываний: нашёл еще одну древнюю книжку о 1810ВМ86/88. там написано: после загрузки любого сегметного регистра через mov или pop запрещаются прерывания до выполнения следующей команды. проверить возможности у меня нет :) но два байта в бут-секторе - деньги.

2.конечно, нужно смотреть бут-сектора, чтобы видеть, как оно сделано. самый простой способ - debug. вот скриншот одной команды:
load L [адрес] [диск] [превый_сектор] [число]
l 100 0 0 1 загрузит 1 сектор, начиная с 0 (boot), с диска 0 (А) по адресу 100. затем можно его смотреть через d 100 в шестнадцатиричном виде, либо через u дизассемблировать. Если в бут-секторе используются 286+ команды - можно попробовать grdb.
есть другие, более удобные способы: например, дисковый редактор DOS Navigator, или различные другие редакторы вроде WinHex, и т.п. - все возможное сложно перечислить, но работать вслепую - неэффективно.
14K
04 октября 2006 года
shoorick
48 / / 07.06.2006
кстати, 1-й нерабочий вариант:
Цитата:
times 510-($-$$) db 0
db 0xAA, 0x55


2-й рабочий вариант:

Цитата:
times 510-($-$$) db 0
db 055h,0AAh


разница заметна, а это - важная сигнатура

20K
04 октября 2006 года
once
11 / / 29.09.2006
О, shoorick, это не просто важная сигнатура, это очень важная сигнатура, спасибо. В принципе это и есть ответ на мой самый первый вопрос )), т.к. после исправления все работает как надо! Так держать.
20K
04 октября 2006 года
once
11 / / 29.09.2006
[QUOTE=shoorick]
2.конечно, нужно смотреть бут-сектора, чтобы видеть, как оно сделано. самый простой способ - debug. вот скриншот одной команды:
load L [адрес] [диск] [превый_сектор] [число]
l 100 0 0 1 загрузит 1 сектор, начиная с 0 (boot), с диска 0 (А) по адресу 100. затем можно его смотреть через d 100 в шестнадцатиричном виде, либо через u дизассемблировать. Если в бут-секторе используются 286+ команды - можно попробовать grdb.
есть другие, более удобные способы: например, дисковый редактор DOS Navigator, или различные другие редакторы вроде WinHex, и т.п. - все возможное сложно перечислить, но работать вслепую - неэффективно.[/QUOTE]
Че за команда load? Это команда в какомто дебаггере, если не сложно говори по понятней: типа че за дебаггер. И ваще я понял ты винду используешь. Так что мне не плохо было бы понять общую технологию, типа не команда load, а чтонить типа берем сымаем образ с дискеты залезаем hex-editer'ом. А что это за d 100? u? ты не подумай что я тут тебя засираю, просто мне реально не понятно что это значит. Единственное что я понял, что нужен некий дисковый редактор.
14K
04 октября 2006 года
shoorick
48 / / 07.06.2006
debug.exe - консольный простейший отладчик, поставляется с операционными системами микрософт. понимает только команды 8086. набери в командной строке debug - и будет счастье ;) справку о командах выводит команда -?, выход -q. но если у тебя нет дисковода, то дисковый редактор тебе и не нужен. играться с винтом без опыта опасно :) можно просто брать образы дискет и смотреть первые 512 байт. также, если на машине стоят одновременно хр/2000 и 98, то на загрузочном диске должен быть файл "bootsect.dos", который ntloader подсовывает если выбрана 98 или мс дос.
а вообще посмотри здесь: http://board.flatassembler.net/forum.php?f=11 - там много чего
20K
04 октября 2006 года
once
11 / / 29.09.2006
Вот теперь я все понял, что ты хотел сказать )). Мне это нужно для того чтоб я спроецировал на себя (о как ))! ). У меня просто винда отсутствует, поэтому я и просил чисто в абстракциях на пальцах или еще как нить объяснить, теперь я все понял.
360
30 января 2008 года
P*t*
474 / / 15.02.2007
У меня такая же проблема, как у автора темы -
есть программа, грузящаяся с дискеты.
хочу запустить её через qemu.

Как создать образ дискеты из бинарного файла программы?

Я эту тему прочитал и так и не понял, как это сделать.
1.6K
30 января 2008 года
Vov4ick
476 / / 01.02.2007
rawrite, diskdupe?
Не понял до конца вопрос...
360
30 января 2008 года
P*t*
474 / / 15.02.2007
Я не очень хорошо написал.
Вопрос можно сформулировать так:
1)В каком формате должен быть файл, чтобы qemu могла загрузить с него, как с дискеты.
2)Как получить файл в таком формате.

Погуглив по запросу diskdupe я выяснил, что бывает формат .ddi и получить его можно с помощью diskdupe.exe

Проблема в том, что diskdupe под винду, а у меня линукс.
1.6K
30 января 2008 года
Vov4ick
476 / / 01.02.2007
Хм.. Всю жизнь думал, что diskdupe под DOS ;-)
У пингвинов есть утилита dd. Помнится она для того же.
Ещё есть dosemu/wine
360
30 января 2008 года
P*t*
474 / / 15.02.2007
Цитата: Vov4ick
Хм.. Всю жизнь думал, что diskdupe под DOS ;-)


Ой. Просто у меня .exe сразу ассоциируется с windows...

Цитата: Vov4ick
У пингвинов есть утилита dd. Помнится она для того же.
Ещё есть dosemu/wine


Сейчас посмотрел man по dd. Ничего про образ дискеты там не написано...

А самому это образ дискеты сделать можно? Что он должен из себя представлять? Где можно найти документацию?

1.8K
30 января 2008 года
Evgeni
188 / / 14.06.2006
Вообщето обычный бинарник или ваще любой файл можно вставить в vmware. И все работает отлично.
391
30 января 2008 года
Archie
562 / / 03.02.2005
http://www.chrysocome.net/dd

dd if=\\.\a: of=c:\temp\disk1.img bs=1440k

А можно делать образ сразу (не через дискету), используя mtools, например.
349
31 января 2008 года
Phantom-84
656 / / 27.10.2005
Кто хочет делать образы дискет путем компиляции fasm'ом, обращайтесь! Вот вам пример исходника:
Код:
include "mkfloppy.inc"

file "bootcode.bin", 512

; fat1
db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0

; fat2
db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0

; root
dent io,        "IO      SYS", FA_RO or FA_HID or FA_SYS or FA_ARC
dent msdos,     "MSDOS   SYS", FA_RO or FA_HID or FA_SYS or FA_ARC
dent command,   "COMMAND COM", FA_ARC
dent drvspace,  "DRVSPACEBIN", FA_RO or FA_HID or FA_SYS or FA_ARC
dent autoexec,  "AUTOEXECBAT", FA_ARC
dent command2,  "COMMAND",     FA_DIR
rb 33*512-$

; data
stof io,        "content/IO.SYS"
stof msdos,     "content/MSDOS.SYS"
stof command,   "content/COMMAND.COM"
stof drvspace,  "content/DRVSPACE.BIN"
stof autoexec,  "content/AUTOEXEC.BAT"

defdir command2
{
dent fdisk,     "FDISK   EXE", FA_ARC
dent format,    "FORMAT  COM", FA_ARC
dent sys,       "SYS     COM", FA_ARC
dent defrag,    "DEFRAG  EXE", FA_ARC
dent scandisk1, "SCANDISKEXE", FA_ARC
dent scandisk2, "SCANDISKINI", FA_ARC
dent keyrus,    "KEYRUS  COM", FA_ARC
}

stod command2,  root
stof fdisk,     "content/COMMAND/FDISK.EXE"
stof format,    "content/COMMAND/FORMAT.COM"
stof sys,       "content/COMMAND/SYS.COM"
stof defrag,    "content/COMMAND/DEFRAG.EXE"
stof scandisk1, "content/COMMAND/SCANDISK.EXE"
stof scandisk2, "content/COMMAND/SCANDISK.INI"
stof keyrus,    "content/COMMAND/KEYRUS.COM"
rb 2*80*18*512-$
360
04 февраля 2008 года
P*t*
474 / / 15.02.2007
я дорастил свой загрузчик до 512байт и он благополучно загрузился.
это странно, потому что когда я доращивал до 1440кб не работало...

Осталась такая проблема: в дискете где-то записано, загрузочная она или нет, а где - непонятно: qemu считает, что моя дискета не загрузочная, и запускает её только если дать ему параметр -no-fd-bootchk

как сделать дискету загрузочной?
1.6K
04 февраля 2008 года
Vov4ick
476 / / 01.02.2007
Признак загрузочного сектора - "Uк" (55h, 0aah) в его конце присутствует?
360
05 февраля 2008 года
P*t*
474 / / 15.02.2007
в конце - это 511-ый и 512-ый байт?
или в конце кода?

я вставил в конце кода, но не работает.
261
05 февраля 2008 года
ahilles
1.5K / / 03.11.2005
должно быть в конце т.е. 511 и 512 байты
360
06 февраля 2008 года
P*t*
474 / / 15.02.2007
Спасибо, всё работает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог