Как написать загрузчик для формата жесткого диска Oracle (файлы VDI) [дублировать]

int a = new Integer(5) 

В этом случае создается новое целое число. Здесь Integer является не примитивным типом, а значение внутри него преобразуется (в int) и присваивается int 'a'.

SomeObject s1 = new SomeObject("first");  
SomeObject s2 = s1;

В этом случае оба s1 и s2 являются ссылочными типами. Они не созданы, чтобы содержать значение, подобное примитивным типам, скорее они содержат ссылку на некоторый объект. Для понимания мы можем рассматривать ссылку как ссылку, которая указывает, где я могу найти ссылку на объект.

Здесь ссылка s1 сообщает нам, где мы можем найти значение «first» (которое на самом деле хранится в памяти компьютера в экземпляре SomeObject). В других словах s1 - это адрес объекта класса «SomeObject». Следующим присваиванием -

SomeObject s2 = s1;

мы просто копируем значение, хранящееся в s1-s2, и теперь мы знаем, что s1 содержит адрес строки «первым». После этого экземпляра println () создает тот же результат, потому что оба s1 и s2 переопределяют один и тот же объект.

Наряду с конструктором копирования вы можете скопировать объект с помощью метода clone (), если вы пользователь java. Клон можно использовать следующим образом:

SomeObject s3 = s1.clone(); 

Для получения дополнительной информации о clone () это полезная ссылка http://en.wikipedia.org/wiki/Clone_%28Java_method% 29

1
задан Michael Petch 23 April 2017 в 03:21
поделиться

1 ответ

Вы не предоставляете минимальный полный проверяемый пример, показывающий загрузчик и как его получить в VDI. Но, как минимум, вам нужно разместить 0xAA55 в последних двух байтах основной загрузочной записи. В приведенном ниже примере создается простой загрузчик; создает исходное изображение 2MiB; помещает загрузчик в необработанное изображение; и преобразует необработанное изображение в VDI.

boot.asm:

BITS 16
ORG 0x7C00

    xor ax, ax
    mov ds, ax
    mov ss, ax       ; Stack below bootloader
    mov sp, 0x7c00

    mov ax, 0xb800   ; Video segment b800
    mov es, ax

    ; Print Hello with white on light magenta
    mov word [es:0x0], 0x57 << 8 | 'H'
    mov word [es:0x2], 0x57 << 8 | 'e'
    mov word [es:0x4], 0x57 << 8 | 'l'
    mov word [es:0x6], 0x57 << 8 | 'l'
    mov word [es:0x8], 0x57 << 8 | 'o'

    ; End with infinite loop
    cli
endloop:
    hlt
    jmp endloop

; Fill out to 510 bytes and add boot signature
times 510 - ($ - $$) db 0
dw 0xAA55            ; add boot signature at the end of bootloader

Затем я использую эту команду для создания файла загрузчика boot.bin:

nasm -f bin boot.asm -o boot.bin

Создайте файл образа диска 2MiB 1.raw:

dd if=/dev/zero of=1.raw bs=1024 count=2048

Поместите загрузчик boot.bin в начало файла 1.raw, не обрезая остальную часть файла:

dd if=boot.bin of=1.raw conv=notrunc

Создайте изображение VDI с именем 1.vdi из 1.raw:

rm -f 1.vdi
VBoxManage convertfromraw 1.raw 1.vdi --format VDI

При добавлении в виртуальную машину в VirtualBox я получаю это на дисплее:


Ваш файл VDI

В прилагаемом файле изображения 1.vdi я заметил это, когда сделал hexdump:

< blockquote>
00200000  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
*
002004c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
*
00300000

Этот вывод подсказывает мне, что вы отменили байты начальной загрузки в вашем файле. Он должен быть 0x55, за которым следует 0xaa. 0xaa55 как WORD хранится с байтами, которые были отменены.

Допустимый загрузочный носитель может быть больше, чем правильное получение начальной подписи. Некоторые BIOS могут искать определенные инструкции в первых байтах, которые обычно находятся в загрузчиках. Несоблюдение таких инструкций (примеры часто включают такие вещи, как JMP , XOR , CLI , MOV ) могут привести к его думать, что это не допустимый загрузочный носитель.

Один из способов проверить, достаточно ли 0xAA55 в конце, я использовал hexedit и изменил ваш файл 1.vdi, чтобы выглядеть так:

00200000  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
00200010  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
*
002001f0  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 55 aa <-- Corrected signature
                                                               at 1fe & 1ff
00200200  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
*
002004c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
*
00300000

Выполнение этого изменения не помогло. Затем я использовал hexedit и поместил код операции CLI (0xFA) в качестве первого байта сектора. Результирующий файл теперь выглядит следующим образом:

           v-- CLI instruction
00200000  fa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
00200010  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
*
002001f0  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 55 aa
00200200  aa 55 aa 55 aa 55 aa 55  aa 55 aa 55 aa 55 aa 55
*
002004c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
*
00300000

Я поместил fa в качестве первого байта в загрузчик. Теперь, когда я использую ваше изображение, ошибка Не найден загрузочный носитель! Системная остановка больше не отображается. Это говорит о том, что VirtualBox ищет больше, чем загрузочную подпись, и делает какую-то проверку здравомыслия, чтобы определить, является ли начало загрузчика исполняемыми инструкциями. Это не редкость для BIOS. Некоторые могут сделать такую ​​проверку, а некоторые - нет. В это время я не просматривал исходный код VirtualBox, чтобы определить точные проверки, которые он выполняет, чтобы определить его.

4
ответ дан Michael Petch 15 August 2018 в 17:32
поделиться
  • 1
    У вас когда-нибудь возникает ощущение, что вы пишете один и тот же ответ все время? :-) – Cody Gray♦ 23 April 2017 в 09:51
  • 2
    @CodyGray: есть сходство с ответом на ответ. В этом случае я не знал о существующем ответе, который касался Virtual Box и формата VDI, поэтому я решил поднять ответ lol. – Michael Petch 23 April 2017 в 13:13
  • 3
    Серьезно, учитывая, насколько популярно это программирование, похоже, вы можете просто перенести этот ответ в Documentation, а затем привязать его к бесконечности. Пока они заставляют Документацию сжиматься, мы могли бы также выяснить, как это стоит того. Или, может быть, было бы целесообразно создать каноническое Q & amp; A о том, чтобы начать создавать загрузчик, а также советы по устранению неполадок из другого ответа, тогда мы можем закрыть вопросы как обманщики. В ваших ответах есть много отличного вступительного материала, но его трудно найти. – Cody Gray♦ 23 April 2017 в 13:15
  • 4
    @CodyGray. Пара из нас предложила документацию для загрузчика . Я с тобой согласен ;-) – Michael Petch 23 April 2017 в 13:17
  • 5
    @CodyGray: Каноническое Q & amp; A (почему бы просто не пометить это?) Было бы гораздо более ценным, чем попытка использовать полезность для Docs. – Lightness Races in Orbit 23 April 2017 в 13:33
Другие вопросы по тегам:

Похожие вопросы: