OSDev http://osdev.su/ |
|
Создание образа дискеты и установка на него загрузчика http://osdev.su/viewtopic.php?f=12&t=334 |
Страница 1 из 2 |
Автор: | KIV [ 01 сен 2010, 20:44 ] |
Заголовок сообщения: | Создание образа дискеты и установка на него загрузчика |
Написал скриптик, который должен создать образ дискеты, отформатировать его в ext2 и записать на него загрузчик. Код: dd if=boot.bin of=disk.img bs=512 count=1 dd if=/dev/zero of=disk.img bs=512 count=2879 seek=1 mkfs -t ext2 disk.img Однако он не работает как надо. mkfs затирает начальный загрузчик нулями, а если поставить копирование загрузчика на образ после форматирования, то он обрезает образ до 512 байт и соответственно от ФС ничего не остаёться. Что делать? |
Автор: | phantom-84 [ 02 сен 2010, 19:38 ] |
Заголовок сообщения: | Re: Создание образа дискеты и установка на него загрузчика |
Если не получается записать загрузчик поверх пустого бутсектора, можешь попробовать его отсечь, а потом присоединить загрузчик. Лично я для формирования образов предпочитаю использовать fasm, но т.к. у меня пока нет кода, чтобы сразу сформировать структуру ext2, могу посоветовать сделать как-то так: Код: file "boot.bin",512 file "disk.img":512 А ты сам написал загрузчик для ext2 или взял готовый? |
Автор: | KIV [ 02 сен 2010, 21:05 ] |
Заголовок сообщения: | Re: Создание образа дискеты и установка на него загрузчика |
Цитата: А ты сам написал загрузчик для ext2 или взял готовый? Сначала хотел GRUB, но он не поместился на дискету (хочет 4 МБ). А загрузчик взял готовый с asmdev.narod.ru. Там одна из статей про то как написать. |
Автор: | phantom-84 [ 02 сен 2010, 22:00 ] |
Заголовок сообщения: | Re: Создание образа дискеты и установка на него загрузчика |
А почему именно ext2? Просто для дискет чаще всего используется формат raw и fat12. У меня есть код под fasm для формирования образа с fat12. И проработано размещение GRUB 0.90-1.90 внутри этого образа. Если нужно, могу поделиться. |
Автор: | Himik [ 02 сен 2010, 23:10 ] |
Заголовок сообщения: | Re: Создание образа дискеты и установка на него загрузчика |
Попробуй указать параметр -b, прописывающий файл для загрузочного сектора. Но не знаю, сработает или нет. mkfs -t ext2 -b boot.bin disk.img |
Автор: | KIV [ 02 сен 2010, 23:11 ] |
Заголовок сообщения: | Re: Создание образа дискеты и установка на него загрузчика |
Цитата: Если нужно, могу поделиться. Поделитесь пожалуйста. Буду благодарен. Хотя FAT мне не нравиться. Сейчас уж думаю опять вернуться на свою ФС построенную на двунаправленных связанных списках. С одной стороны работать с ней очень просто (по крайней мере чтение), с другой нет практически никаких ограничений ни на размер файла ни на их количество (ага. если допустить ошибку, то можно сделать каталог с бесконечным количеством файлов или файл бесконечной длины :-)). Сейчас написал утилиту на Си, которая из папки делает образ моей ФС. При этом можно указать его размер, а также откуда взять начальных загрузчик. |
Автор: | phantom-84 [ 03 сен 2010, 11:16 ] |
Заголовок сообщения: | Re: Создание образа дискеты и установка на него загрузчика |
Короче все по порядку. Суть в том, что я использую не программу для формирования образов, а что-то вроде скрипта, компиляция которого при помощи fasm'а приводит к появлению образа. Вот простейший пример такого исходника: Код: include "mkfloppy.inc" Подробное описание этого исходника, а также примеры того, как описывать вложенные каталоги и т.п., есть на форуме wasm.ru. Если возникнут дополнительные вопросы, спрашивай.file "bootstub.bin", 512 ; fat1 db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0 ; fat2 db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0 ; root dent fileid, "README TXT", FA_ARC ; ... rb 33*512-$ ; data stof fileid, "content/readme.txt" ; ... rb 2*80*18*512-$ Что касается GRUB'а, то я детально изучил технологию его загрузки (для определенных версий; там есть различия в структурах данных между разными версиями) и даже где-то выкладывал статью на эту тему. Вот пример полноценного размещения GRUB'а в образе флоппика: Код: ; include "getsum.inc" Стандартные для FAT поля загрузочной записи прописываются явно из-за того, что в оригинальном бинарнике stage1 они обнулены. Можно предварительно сформировать что-то вроде stage1x с наличием соответствующих значений, тогда текст этого исходника сократится и будет выглядеть элегантнее. Плюс GRUB предусматривает два пути загрузки на FAT-томах - с использованием stage1_5 и без использования - я предусмотрел оба варианта (можно изменить значение STAGE1_5 на тру). Плюс можно раскомментировать некоторые строки, чтобы иметь LFN для stage1_5, но этого не требуется т.к. данный модуль ВСЕГДА загружается не по имени, а по местоположению. Это имя даже можно произвольно менять. Что касается самого загружаемого GRUB'ом модуля (модулей), то в качестве примера можно использовать бинарник, созданный из такого исходника:include "mkfloppy.inc" STAGE1_5 equ 0 file "content/boot/grub/stage1", 3 db "MKFLOPPY" dw 512 db 1 dw 1 db 2 dw 14*512/32 dw 2*80*18 db 0F0h dw 9 dw 18 dw 2 dd 0 dd 0 db 0 db 0 db 29h dd 55555555h db "BOOTABLEDEV" db "FAT12", 32, 32, 32 file "content/boot/grub/stage1": $, 512-$ if STAGE1_5 kernel_address=2000h kernel_sector=fatstage_base/512 kernel_segment=200h else kernel_address=8000h kernel_sector=stage2_base/512 kernel_segment=800h end if ; store byte 0 at 40h ; boot_drive cell for GRUB 1.90 store word kernel_address at 42h ; for GRUB 1.90 store dword kernel_sector at 44h ; for GRUB 1.90 store word kernel_segment at 48h ; for GRUB 1.90 ; fat1 db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0 ; fat2 db 0F0h, 0FFh, 0FFh, 9*512-3 dup 0 ; root dent kernel, "KERNEL BIN", FA_ARC dent boot, "BOOT", FA_DIR ; ... rb 33*512-$ defdir boot { dent grub, "GRUB", FA_DIR } defdir grub { if STAGE1_5 ; getsum sum, "FAT_ST~1" ; db 41h, "f", 0, "a", 0, "t", 0, "_", 0, "s", 0, 0Fh, 0, sum, "t", 0 ; LFN for "fat_stage1_5" ; db "a", 0, "g", 0, "e", 0, "1", 0, "_", 0, 0, 0, "5", 0, 0, 0 dent fatstage, "FAT_ST~1", FA_ARC end if dent menu, "MENU LST", FA_ARC dent stage2, "STAGE2", FA_ARC } ; data stof kernel, "content/kernel.bin" stod boot, root stod grub, boot if STAGE1_5 stof fatstage, "content/boot/grub/fat_stage1_5" store dword fatstage_base/512+1 at fatstage_base+1F8h store word (fatstage_size+511)/512-1 at fatstage_base+1FCh store word 220h at fatstage_base+1FEh end if stof menu, "content/boot/grub/menu.lst" stof stage2, "content/boot/grub/stage2" store dword stage2_base/512+1 at stage2_base+1F8h store word (stage2_size+511)/512-1 at stage2_base+1FCh store word 820h at stage2_base+1FEh ; ... rb 2*80*18*512-$ Код: ; -------------------- ; Kernel stub for GRUB ; -------------------- MBH_MAGIC equ 0x1BADB002 MBH_FLAGS equ 0x10000 use32 org 0x100000 load_addr: header_addr: dd MBH_MAGIC dd MBH_FLAGS dd -MBH_MAGIC-MBH_FLAGS dd header_addr dd load_addr dd load_end_addr dd bss_end_addr dd entry_addr entry_addr: jmp $ load_end_addr: bss_end_addr: Я предлагаю два варианта его загрузки (menu.lst): Код: color light-gray/blue black/light-gray default 0 timeout 10 title Load kernel from floppy (variant 1) root (fd0) kernel /kernel.bin title Load kernel from floppy (variant 2) kernel (fd0)/kernel.bin Ссылки: mkfloppy.zip GrubOnFloppy.zip |
Автор: | phantom-84 [ 04 сен 2010, 11:23 ] |
Заголовок сообщения: | Re: Создание образа дискеты и установка на него загрузчика |
Вот еще пример. Код: include "floppy/mkfloppy.inc" Думаю, не нужно объяснять, что это такое.format binary as "ima" file "floppy/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______sys,"IO SYS",FA_ARC+FA_SYS+FA_HID+FA_RO dent autoexecbat,"AUTOEXECBAT",FA_ARC dent config__sys,"CONFIG SYS",FA_ARC dent setramd_bat,"SETRAMD BAT",FA_ARC dent readme__txt,"README TXT",FA_ARC dent findramdexe,"FINDRAMDEXE",FA_ARC dent ramdrivesys,"RAMDRIVESYS",FA_ARC dent aspi4dossys,"ASPI4DOSSYS",FA_ARC dent btcdrom_sys,"BTCDROM SYS",FA_ARC dent aspicd__sys,"ASPICD SYS",FA_ARC dent btdosm__sys,"BTDOSM SYS",FA_ARC dent aspi2dossys,"ASPI2DOSSYS",FA_ARC dent aspi8dossys,"ASPI8DOSSYS",FA_ARC dent aspi8u2_sys,"ASPI8U2 SYS",FA_ARC dent flashpt_sys,"FLASHPT SYS",FA_ARC dent extract_exe,"EXTRACT EXE",FA_ARC dent fdisk___exe,"FDISK EXE",FA_ARC dent drvspacebin,"DRVSPACEBIN",FA_ARC dent command_com,"COMMAND COM",FA_ARC dent himem___sys,"HIMEM SYS",FA_ARC dent oakcdromsys,"OAKCDROMSYS",FA_ARC dent ebd_____cab,"EBD CAB",FA_ARC dent display_sys,"DISPLAY SYS",FA_ARC dent country_sys,"COUNTRY SYS",FA_ARC dent ega3____cpi,"EGA3 CPI",FA_ARC dent mode____com,"MODE COM",FA_ARC dent msdos___sys,"MSDOS SYS",FA_ARC+FA_SYS+FA_HID+FA_RO dent ebd_____sys,"EBD SYS",FA_ARC+FA_SYS+FA_HID+FA_RO dent gcdrom__sys,"GCDROM SYS",FA_ARC dent bcdw_cl_com,"BCDW_CL COM",FA_ARC dent fdemuoffcom,"FDEMUOFFCOM",FA_ARC dent keyb____com,"KEYB COM",FA_ARC dent keybrd3_sys,"KEYBRD3 SYS",FA_ARC rb 33*512-$ ; data stof io______sys,"content/io.sys" stof autoexecbat,"4bcdw/autoexec.bat" stof config__sys,"4bcdw/config.sys" stof setramd_bat,"content/setramd.bat" stof readme__txt,"content/readme.txt" stof findramdexe,"content/findramd.exe" stof ramdrivesys,"content/ramdrive.sys" stof aspi4dossys,"content/aspi4dos.sys" stof btcdrom_sys,"content/btcdrom.sys" stof aspicd__sys,"content/aspicd.sys" stof btdosm__sys,"content/btdosm.sys" stof aspi2dossys,"content/aspi2dos.sys" stof aspi8dossys,"content/aspi8dos.sys" stof aspi8u2_sys,"content/aspi8u2.sys" stof flashpt_sys,"content/flashpt.sys" stof extract_exe,"content/extract.exe" stof fdisk___exe,"content/fdisk.exe" stof drvspacebin,"content/drvspace.bin" stof command_com,"content/command.com" stof himem___sys,"content/himem.sys" stof oakcdromsys,"content/oakcdrom.sys" stof ebd_____cab,"content/ebd.cab" stof display_sys,"content/display.sys" stof country_sys,"content/country.sys" stof ega3____cpi,"content/ega3.cpi" stof mode____com,"content/mode.com" stof msdos___sys,"content/msdos.sys" stof ebd_____sys,"content/ebd.sys" stof gcdrom__sys,"4bcdw/gcdrom.sys" stof bcdw_cl_com,"4bcdw/bcdw_cl.com" stof fdemuoffcom,"4bcdw/fdemuoff.com" stof keyb____com,"4bcdw/keyb.com" stof keybrd3_sys,"4bcdw/keybrd3.sys" times 2*80*18*512-$ db 0 Кстати, я кажется знаю, как можно решить первоначальную проблему. Цитата: Overwrite the first 512 bytes of a file with
null bytes: dd i f =/ de v / z e r o o f = pa t h / t o / f i l e b s = 5 1 2 c oun t = 1 c on v = no t r un c The no t r un c conversion option means do not truncate the output file — that is, if the output file already exists, just replace the specified bytes and leave the rest of the output file alone. Without this option, dd would create an output file 512 bytes long. |
Автор: | phantom-84 [ 06 сен 2010, 17:25 ] |
Заголовок сообщения: | Re: Создание образа дискеты и установка на него загрузчика |
Any comments? |
Автор: | KIV [ 06 сен 2010, 21:23 ] |
Заголовок сообщения: | Re: Создание образа дискеты и установка на него загрузчика |
Цитата: Any comments? Всё понятно. Спасибо. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |