Задать вопрос
  • Почему от добавления функций помимо main() в начало кода ядро перестает работать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему от добавления функций помимо main() в начало кода ядро перестает работать?

    смотри: ты собираешь образ kernel следующей командой:
    i686-elf-ld -Ttext 0x7E00 --oformat binary kernel.o -o kernel -e main

    а запускаешь следующей:
    ; Jump to the kernel's entry point
        JMP 0x0000:0x7E00

    как по-твоему здесь используется информация о точке входа -e main?

    Ответ
    никак, выполнение всегда начинается с начала образа kernel, куда выполняет переход начальный загрузчик; что там будет, то и начнёт выполняться. Эта информация даже никуда не записывается, потому что файл формата binary -- это тупо склеенные вместе загружаемые сегменты, там нет места для метаинформации. Если бы ты собирал ELF, то этот адрес был бы записан в поле e_entry заголовка ELF.

    Если не модифицировать загрузчик, то образ ядра должен начинаться с кода точки входа, в твоём случае -- с кода main(). Чтобы поместить нужный код в нужное место собранного образа обычно используют скрипт линковщика.
    Ответ написан
    Комментировать
  • Как использовать libstdc на Bare Metal?

    includedlibrary
    @includedlibrary
    Как верно заметили выше, никак. Но вообще, в ядре можно свои аналогичные функции написать, правда, они не всегда будут иметь тот же интерфейс, что и функции из стандартной библиотеки.
    Ответ написан
    4 комментария
  • Как использовать libstdc на Bare Metal?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть по-разному устроенные libc, некоторые из них можно приспособить для работы в ядре. Для начала нужно понимать, что в libc есть часть, которая совсем не зависит от ОС (например все функции mem*() или большинство функций str*()), есть часть, зависимость которой от ОС реализована в терминах других функций libc (например printf() может выделять память и может записывать в файл, но обе эти функции уже реализованы в других местах libc), а есть часть напрямую взаимодействующая с ОС.
    Некоторые libc написаны так, что эта последняя часть чётко отделена (например newlib) и для адаптации к другой ОС или к окружению внутри ядра нужно реализовать небольшое количество интерфейсов (для newlib это будет вариант libgloss).
    Ответ написан
    Комментировать
  • Почему этот код не заполняет синим весь экран?

    15432
    @15432
    Системный программист ^_^
    Ну один столбец синим он вам заполнил.
    А так, у вас в проверке границ MOV AX, Y и MOV AX, X вместо [Y] и [X]
    Ответ написан
    Комментировать
  • Как скомпилировать консольную программу C++ в .app?

    @dima20155
    you don't choose c++. It chooses you
    Потому что у ваша программа отработала и завершилась. Добавьте паузу, ожиданные ввода данных или что-то ещё и ваша программа будет ждать
    Вы же не удивляетесь, что запускаю компилятор, он останавливается после завершения работы? Вашей программе просто нечего больше делать.
    Ответ написан
    Комментировать
  • Как соответствовать LGPL для Qt?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, лицензия LGPL для того и придумана, чтобы можно было линковать закрытый код с открытым, при этом изменения в сам этот открытый код необходимо публиковать.
    Ответ написан
    Комментировать
  • Как скомпилировать приложение для Windows в Qt Creator на MacOS?

    Adamos
    @Adamos
    Теоретически достаточно поставить MXE и прописать соответствующий компилятор в QtCreator. Под Ubuntu я себе собрал такую среду и спокойно компилирую EXE-шники, просто переключившись на другую схему сборки в QtCreator.
    Как там с OSX на практике - не пробовал и не завидую новичку, которому понадобится разобраться с этой кухней...
    Ответ написан
    1 комментарий