OSDev

для всех
Текущее время: 18 апр 2024, 09:54

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 01 сен 2010, 20:44 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Написал скриптик, который должен создать образ дискеты, отформатировать его в 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 байт и соответственно от ФС ничего не остаёться. Что делать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 сен 2010, 19:38 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Если не получается записать загрузчик поверх пустого бутсектора, можешь попробовать его отсечь, а потом присоединить загрузчик. Лично я для формирования образов предпочитаю использовать fasm, но т.к. у меня пока нет кода, чтобы сразу сформировать структуру ext2, могу посоветовать сделать как-то так:
Код:
file "boot.bin",512
file "disk.img":512


А ты сам написал загрузчик для ext2 или взял готовый?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 сен 2010, 21:05 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Цитата:
А ты сам написал загрузчик для ext2 или взял готовый?

Сначала хотел GRUB, но он не поместился на дискету (хочет 4 МБ). А загрузчик взял готовый с asmdev.narod.ru. Там одна из статей про то как написать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 сен 2010, 22:00 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
А почему именно ext2? Просто для дискет чаще всего используется формат raw и fat12. У меня есть код под fasm для формирования образа с fat12. И проработано размещение GRUB 0.90-1.90 внутри этого образа. Если нужно, могу поделиться.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 сен 2010, 23:10 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Попробуй указать параметр -b, прописывающий файл для загрузочного сектора. Но не знаю, сработает или нет.
mkfs -t ext2 -b boot.bin disk.img


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 сен 2010, 23:11 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Цитата:
Если нужно, могу поделиться.

Поделитесь пожалуйста. Буду благодарен. Хотя FAT мне не нравиться. Сейчас уж думаю опять вернуться на свою ФС построенную на двунаправленных связанных списках. С одной стороны работать с ней очень просто (по крайней мере чтение), с другой нет практически никаких ограничений ни на размер файла ни на их количество (ага. если допустить ошибку, то можно сделать каталог с бесконечным количеством файлов или файл бесконечной длины :-)). Сейчас написал утилиту на Си, которая из папки делает образ моей ФС. При этом можно указать его размер, а также откуда взять начальных загрузчик.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 сен 2010, 11:16 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Короче все по порядку. Суть в том, что я использую не программу для формирования образов, а что-то вроде скрипта, компиляция которого при помощи fasm'а приводит к появлению образа. Вот простейший пример такого исходника:
Код:
include "mkfloppy.inc"

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-$
Подробное описание этого исходника, а также примеры того, как описывать вложенные каталоги и т.п., есть на форуме wasm.ru. Если возникнут дополнительные вопросы, спрашивай.

Что касается GRUB'а, то я детально изучил технологию его загрузки (для определенных версий; там есть различия в структурах данных между разными версиями) и даже где-то выкладывал статью на эту тему. Вот пример полноценного размещения GRUB'а в образе флоппика:
Код:
; include "getsum.inc"
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-$
Стандартные для FAT поля загрузочной записи прописываются явно из-за того, что в оригинальном бинарнике stage1 они обнулены. Можно предварительно сформировать что-то вроде stage1x с наличием соответствующих значений, тогда текст этого исходника сократится и будет выглядеть элегантнее. Плюс GRUB предусматривает два пути загрузки на FAT-томах - с использованием stage1_5 и без использования - я предусмотрел оба варианта (можно изменить значение STAGE1_5 на тру). Плюс можно раскомментировать некоторые строки, чтобы иметь LFN для stage1_5, но этого не требуется т.к. данный модуль ВСЕГДА загружается не по имени, а по местоположению. Это имя даже можно произвольно менять. Что касается самого загружаемого GRUB'ом модуля (модулей), то в качестве примера можно использовать бинарник, созданный из такого исходника:
Код:
; --------------------
; 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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 сен 2010, 11:23 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Вот еще пример.
Код:
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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 сен 2010, 17:25 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Any comments?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 сен 2010, 21:23 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Цитата:
Any comments?

Всё понятно. Спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB