LINUX.ORG.RU

Запустить FreeDOS из Linux 2.6 через kexec()


0

0

Собственно хочется сделать subj.

Если говорить чуть более детально, то из Linux 2.6 нужно запустить MS-DOS (FreeDOS) из образа дискеты в ram-fs, с полным замещением работающего ядра Linux. Т.е. запуск на виртуальном x86 не подойдет. Идеи есть? Или может готовое решение?

Зачем это нужно? Есть загрузочный CD-ROM с диагностическими программами для различного оборудования. Большинство diag-ов работает в Linux, но есть пара старых написанных еще для DOS. Вот и хотелось бы их тоже запускать. Делать multiboot CD с системой меню - не лучшее решение, так как уже сделано работающее в Linux меню со всякой всячиной.


Хмм, сомнительно про kexec и DOS. Вариант:
- при загрузке linux тот модифицирует /dev/nvram (ну например включает-выключает дисковод A: 1.44, только не забудьте про контрольную сумму);
- загрузчик на CD-ROM читает CMOS и принимает решение что грузить.

saper ★★★★★
()

Если бы вы загружали Linux с flash-диска, было бы гораздо проще.

saper ★★★★★
()

Можно попробовать через machine_real_restart() 

arch/i386/kernel/reboot.c:

/*
 * Switch to real mode and then execute the code
 * specified by the code and length parameters.
 * We assume that length will aways be less that 100!
 */
void machine_real_restart(unsigned char *code, int length)

Только проблема осложняется тем, что образ дискеты лежит в памяти.
Если бы нужно было грузиться с реального девайса, то достаточно 
просто вызвать machine_real_restart(), передав ей код, который считывает
бут-сектор с нужного девайса в память и передает ему управление.
А тут... Сначала образ дискетки придется как-то поместить в нижние 640 Кб,
откусить этот кусок памяти, чтобы ДОС туда не лезла (как это делали
загрузочные вирусы). Потом написать для реального режима свой обработчик Int13,
который будет эмулировать дискетку из образа....

bigbit ★★★★★
()
Ответ на: комментарий от bigbit

Я примерно так и думал делать.

Заместить int13 и сделать виртуальный флоп - не сложно. Можно включить так называемый "unreal mode". Это когда процессор в реальном режиме, но разрешена 32-битная адресация (через префикс). При этом образ floppy можно держать выше 1 Mбайт, а откусить память только для кода int13.

Но настоящая проблема в другом. После переключения в real-mode никто не гарантирует, что состояние системы (вектора прерываний, сегмент данных BIOS, аппаратура) позволит работать 16-битной DOS-like среде. По-хорошему нужно выполнить код инициализации BIOS. Но тогда непонятно как заставить BIOS после этого перейти на мой код.

ly
() автор топика
Ответ на: комментарий от ly

Вот чего нашел у Ральфа Брауна:
----------------------------------------
MEM 0040h:0067h - RESET RESTART ADDRESS
Size:   DWORD
Desc:   this address stores the address at which to resume execution after a
          CPU reset (or jump to F000h:FFF0h) when certain magic values are
          stored at 0040h:0072h or in CMOS RAM location 0Fh
SeeAlso: MEM 0040h:0072h,MEM F000h:FFF0h,CMOS 0Fh,INT 19
----------------------------------------
Т.е. нужно делать так:
1) 0:472h := 1234h
2) 0:467h := адрес своего кода, куда BIOS передаст управление
3) jmp f000:ffff0

Но работает ли это на практике, я не знаю. Пробовать надо...

bigbit ★★★★★
()
Ответ на: комментарий от bigbit

Спасибо. У меня что-то оставалось в памяти на эту тему, но собственный архив погиб вместе с CD-ROM. От Брайна у меня есть справочник по PC-прерываниям (я его ужа достал из кладовки), но там про 0040h:0067h ничего нет.

Способ похоже будет работать. Ключевой момент в CMOS 0Fh, я уже нагуглил.

В комплекте syslinux есть memdisk, это bzImage с псевдо-ядром, которое при запуске делает электронный диск из initrd, т.е. велосипед уже сделан и ездит. Осталось добавить окучивание 0040h:0067h в исходники memdisk, или лучше в код kexec ядра Linux.

Нетерпится попробовать, а дома вот не могу. Должна получиться полезная штука, например можно будет обновлять BIOS (перепрограммировать flash) не трогая дискеты и/или конфигурацию основного загрузчика.

ly
() автор топика
Ответ на: комментарий от ly

А ведь и вправду полезная и интересная штука может получиться :-) Еще бы suspend как-нибудь прикрутить, чтобы linux уснул, вызвал kexec, загрузился DOS, сделал какие-либо дела и обратно в linux, resume ;-) Хотя после обновления BIOS это может навредить, а вот провести плановое тестирование на промышленном дублируемом сервере из-под DOS вполне.

saper ★★★★★
()
Ответ на: комментарий от ly

Вот попробовал...

Сегодня дошли руки. Решил начать с простого - запустить штатный memdisk через kexec без каких-либо доработок.

Ничего не вышло. Тулза kexec не желала считать memdisk валидным bzImage. Поправил, контроль bz-образов требовал размера больше 32К.

Дальше всё равно плохо. kexec почему-то неверно (насколько я понимаю) разбирает elf и в результате считает, что базовый адрес 32-битной части не 0x100000 (что прописано в makefile и видно через objdump на memdisk.elf), а 0x9f000. Соответственно не находится подходящего места для размещения секции...

Похоже, что kexec-tool нужно править. Разобраться в том, что там не так c elf-оф очевидно гораздо проще автору. Попытаюсь его (Eric Biederman) достать.

ly
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.