2016-03-11 11 views
1

Я сделал небольшой загрузчик. Теперь я хочу загрузить ядро ​​C++. Могу ли я использовать мой маленький загрузчик для этого?Можно вызвать ядро ​​с этим загрузчиком ASM? Как?

[BITS 16] 
    [ORG 0x7C00] 
    [extern _start_kernel] 

    MOV SI, LoadString 
    CALL String 
    CALL _start_kernel 




    JMP $ 

    Print: 
    MOV AH, 0x0E 
    MOV BH, 0x00 
    MOV BL, 0x07 


    INT 0x10 
    RET 

    String: 
    characters: 
    MOV AL, [SI] 
    INC SI 
    OR AL, AL 
    JZ stopPrint 
    CALL Print 
    JMP characters 
    stopPrint 
    RET 


    LoadString db 'Loading...', 0 


    TIMES 510 - ($ - $$) db 0 
    DW 0xAA55 

Это очень простой загрузчик, и это первый раз, когда я делаю загрузчик (с учебником). Я использую NASM в окнах для компиляции кода asm.

+2

Не настоящий ответ на этот вопрос, потому что он очень расплывчатый. Напишите больше конкретных, что вы хотите сделать ... Теперь вы можете получить ответ «Да» или «Нет» на свой текущий вопрос, и это тоже очень неопределенно :) Откуда вы хотите загрузить ядро? сырое устройство? fs type? Вы подготовили для этого место? ПБС/куча? и т. д. На самом деле ваш вопрос поднимает больше вопросов. – 0xAX

+1

Среди других проблем, которые вы использовали, компилятор C++? он генерирует 16-битный код? Если это не так, ваш загрузчик также должен будет позаботиться о том, чтобы перевести процессор в 32-разрядный защищенный режим, прежде чем даже попытаться выполнить 32-разрядный код. У вас может быть более легкое время, если вы используете совместимый с Multiboot загрузчик, такой как _GRUB_, который обрабатывает вас для этой тяжелой работы. –

+0

У вас есть файл 'linker.ld'? Вам нужно связать код сборки с вашим загрузчиком, иначе вы не сможете вызывать какие-либо функции в вашем файле ядра. – Razor

ответ

3

Теперь я хочу загрузить ядро ​​C++. Могу ли я использовать мой загрузочный загрузчик asm для этого?

Не с кодом, который Вы написали, потому что в загрузчике это ваш фактически ОТВЕТСТВЕННОСТЬ принести файл ядра в память. Просто объявление внешней метки [extern _start_kernel] не принесет пользы.
Искать в форуме, и вы найдете примеры, которые управляют этим.

Заметка о ваших усилиях до сих пор.
Поскольку вы написали [ORG 0x7C00], вы хотите, чтобы ваши адреса относились к линейному адресу 0. Здесь также ваша ответственность, чтобы убедиться, что регистры сегментов настроены соответствующим образом. Вам нужно добавить в код:

xor ax, ax 
mov ds, ax 
MOV SI, LoadString 
+3

Как указано '_start_kernel' является extern, что подразумевает, что подпрограмма' _start_kernel' связана с загрузчиком. В этом случае нет необходимости читать в ядре. Однако есть несколько предостережений: 1) это не то, как обычно выполняются загрузчики, как правило, они читают в ядре 2) BIOS будет читать только 1 сектор во время загрузки, поэтому загрузчик и подпрограмма _start_kernel должны были бы вписаться в единый сектор. Даже с родным приводом сектора 4K, который не будет большим количеством ядра. –

1

Если вы хотите, чтобы вызвать внешнюю функцию внутри ядра, вам необходимо сначала он объявлен в файле ядра, а затем вызвать его из загрузчика. Вам также понадобится файл компоновщика, который связывает ядро ​​с загрузчиком все в отдельный двоичный файл, который затем можно загрузить с помощью GRUB. Посетите сайт this, в котором показано, как заставить ваш загрузчик запускать из ядра, а затем связать его с помощью файла компоновщика. Возможно, вам понадобится перекрестный компилятор GCC, если у вас есть Linux, и если вы планируете использовать код на этом сайте.

 Смежные вопросы

  • Нет связанных вопросов^_^