Эмуляция Линуса Торвальдса: создайте свою собственную операционную систему с нуля (I)

Прежде всего, отметьте, что это моя первая статья, и я надеюсь, что она вам понравится.

Линус Торвалс счастлив

В этой серии мы будем подражать Линус Торвальдс, мы собираемся создать нашу операционную систему из 0. В этом первом эпизоде ​​мы увидим загрузку и поместим на экран текст из нашего ядра.

В моем случае операционная система называется NextDive. Первое решение, которое мы должны принять, как только мы рассмотрим операционную систему, - это какой будет загрузчик?

Здесь есть несколько вариантов, и мы даже можем создать один сами; однако в этом уроке я собираюсь использовать GRUB, потому что большинство знает о нем более или менее кое-что. Мы создаем папку, которая будет корнем нашей операционной системы, и там мы создаем папку / boot / grub

mkdir nextroot && cd nextroot

mkdir -p boot/grub

Там мы создаем файл grub.cfg следующим образом:

menuentry "NextDivel" {
echo "Booting NextDivel"
multiboot /next/START.ELF
boot
}

В этом файле мы увидели, как GRUB в данном случае загрузит наше ядро ​​в /next/START.ELF. Теперь мы должны создать наше ядро.

Для этого нам понадобится НКУ y ГАЗ (ассемблер проекта GNU, обычно поставляется с gcc). Итак, мы собираемся создать ядро.

Сначала мы создаем файл с именем kernel.asm. Этот файл будет содержать начальную точку нашего ядра, а также будет определять мультизагрузку (функция некоторых загрузчиков, таких как GRUB). Содержимое kernel.asm будет таким:

.text
.globl start
start:
jmp multiboot_entry
.align 4
multiboot_header:
.long 0x1BADB002
.long 0x00000003
.long -(0x1BADB002+0x00000003)
multiboot_entry:
movl $(stack + 0x4000), %esp
call NextKernel_Main
loop: hlt
jmp loop
.section ".bss"
.comm stack,0x4000

Все, что связано с мультизагрузкой, просто не соответствует спецификации. Все начнется при запуске, он вызовет multiboot_entry, мы определили мультизагрузочный заголовок в первых 4k и поместим его (с помощью movl).

Позже мы вызываем NextKernel_Main, которая является нашей функцией ядра C. В цикле делаем остановку для остановки компьютера. Это компилируется с:

as -o kernel.o -c kernel.asm

Теперь перейдем к программированию на C. Вы подумаете, что теперь все - кусок пирога, мы ставим Printf en основной и все, мы сделали это.

Ну нет, так как Printf y основной это функции, которые определены операционной системой, но мы их создаем! Мы можем использовать только те функции, которые определяем сами.

В следующих главах я буду говорить о том, как установить нашу собственную библиотеку C (glibc, bionic, newlibc), но время от времени. Мы обсуждали, что хотим вывести текст на экран, что ж, посмотрим, как мы это сделаем.

Есть два варианта: один - вызвать BIOS а другой - напрямую управлять памятью экрана. Мы собираемся сделать последнее, потому что это яснее из C, и это также позволит нам сделать это, когда мы войдем в защищенный режим.

Мы создаем файл NextKernel_Main.c со следующим содержимым:

int NextKernel_Main()
{
char *str = "NextDivel says Hello World", *ch;
unsigned short *vidmem = (unsigned short*) 0xb8000;
unsigned i;
for (ch = str, i = 0; *ch; ch++, i++)
vidmem[i] = (unsigned char) *ch | 0x0700;
return 0;
}

Этим мы напрямую манипулируем памятью VGA и по буквам мы это пишем. Мы компилируем, отключив stdlib:
gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding

Если вы зашли так далеко, вы захотите попробовать свою новую операционную систему прямо сейчас, но мы еще не закончили. Нам нужен небольшой файл, который сообщает компилятору, где в файле оставить каждый раздел. Это делается с помощью сценария компоновщика. Создаем link.ld:

ENTRY(start)
SECTIONS
{
. = 0x00100000;
.multiboot_header :
{
*(.multiboot_header)
}
.text :
{
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(4096);
}
.data :
{
data = .; _data = .; __data = .;
*(.data)
*(.rodata)
. = ALIGN(4096);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .; _end = .; __end = .;
}

Этим мы определяем положение каждого раздела и точку входа start, которую мы определили в kernel.asm. Теперь мы можем объединить всю эту смесь:

gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding -lgcc

Теперь мы копируем START.ELF в / next внутри нашей папки, которая имитирует корень нашей операционной системы. Переходим в корневую папку нашей новой операционной системы с консолью и проверяем наличие двух файлов: один /boot/grub/grub.cfg и другой /next/START.ELF.

Мы переходим в верхний каталог и вызываем утилиту создания ISO с именем GRUB. grub-mkrescue

grub-mkrescue -o nextdivel.iso nextroot

Как только мы это сделаем, у нас будет ISO. Этот ISO можно открыть на компьютерах x86 (Тоже 64 бита) и виртуальные машины. Чтобы проверить это, я собираюсь использовать QEMU. Мы называем QEMU из командной строки:

qemu-system-i386 nextdivel.iso

Начнет SeaBIOS а позже у нас будет GRUB. Позже, если все будет правильно, мы увидим нашу фразу.
Вы подумаете, что это сложно, я отвечаю: да, это так.

На самом деле создать операционную систему сложно, и эта здесь не делает ничего полезного. В следующих главах мы увидим, как обрабатывать цвета на экране, зарезервировать память и, если получится, как получить данные с клавиатуры.

Если кто-то не хочет копировать все сюда, у меня есть репозиторий по адресу GitHub (подробнее) с операционной системой NextDive. Если вы хотите скомпилировать NextDive вам просто нужно иметь git и cmake:

git clone https://github.com/AdrianArroyoCalle/next-divel
cd next-divel
mkdir build && cd build
cmake ..
make
make DESTDIR=next install
chmod +x iso.sh
./iso.sh
qemu-system-i386 nextdivel.iso

Я призываю вас сотрудничать с NextDivel, если у вас есть время и желание создать операционную систему. Возможно, даже превосходит Linux ... время покажет.


Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.

85 комментариев, оставьте свой

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   Elav сказал

    :O

    1.    марианогаудикс сказал

      Торвальдс передал Эндрю С. Таненбауму операционную систему Minix (производную от UNIX) и улучшил ее.

      Таненбаум поссорился с Линусом, они оскорбляли друг друга. Таненбаум говорит, что за Microkernel будущее (HURD, Minix new cone Microkernel).

      http://www.taringa.net/posts/linux/17215999/Linux-vs-Hurd-Kernel-Monolitico-vs-Microkernel.html

  2.   элиотайм3000 сказал

    Это лучший пост, который я когда-либо видел в этом блоге. Я уже хочу знать, что еще делать.

  3.   Карлос Гуд сказал

    Быть под впечатлением

  4.   Axl сказал

    Действительно впечатляет !!

  5.   роконлинукс сказал

    ФУУУУУУА!
    Это самый увлекательный пост, который я когда-либо видел, хе-хе. Поздравляю Адриана, статья про шлюху! гипер интересно !!! 🙂

    1.    Хоакин сказал

      Я согласен. Представляю себе такую ​​ситуацию:
      Опытный пользователь GNU / Linux (со счастливым лицом):
      «Я уже знаю, как скомпилировать свой Gentoo»

      Ботан (с презрением): «Пфф, я создал свой собственный дистрибутив ...»

      1.    десикодер сказал

        Да, я могу создать свой собственный дистрибутив Linux. Фактически в нем я разрабатываю initramfs и ядро ​​для встраиваемого Linux. Создать операционную систему - это не то же самое, что и дистрибутив linux. Первое намного сложнее, почти невозможно, второе, как вы сказали, может быть любым, даже Ubuntu с измененным логотипом xD. Поэтому я бы оставил это так:

        Опытный пользователь GNU / Linux (со счастливым лицом)
        - Я уже знаю, как скомпилировать свой Gentoo

        Полубук
        - Пфф, я с нуля следил за Linux и сделал свой собственный дистрибутив

        Ботан (с презрением)
        - pff, потому что я программировал ядро ​​на ассемблере и на C

        Saludos!

  6.   Кронос сказал

    Мне это интересно, в ожидании следующих глав.

  7.   Abimaelmartell сказал

    Некоторое время назад я видел этот учебник, он для C ++
    https://github.com/SamyPesse/How-to-Make-a-Computer-Operating-System

    1.    АдрианАрройоУлица сказал

      Спасибо за ссылку, посмотрю.

  8.   Хосе Хакоме сказал

    Мне нужна операционная система, на 100% совместимая с графикой AMD: /

    1.    ИванЛинукс сказал

      Windows

      1.    Хосе Хакоме сказал

        хахаха, в Windows Catalyst нет поддержки OpenGL, хотя в Linux я не могу использовать всю графическую мощь, я буду ждать, чтобы увидеть, что произойдет!

        1.    beny_hm сказал

          Просто подождите, пока клапан уничтожит рынок

  9.   КЗКГ ^ Гаара сказал

    Волшебный, идеальный, отличный вклад, похоже, отличная серия постов 🙂

  10.   O_Pixote_O сказал

    Буах, я хотел бы знать, как программировать, чтобы помочь вам, просто как способ практиковать знания, которые вы изучаете, а один помогает. Сейчас я оставлю вас девиз, чтобы привлечь внимание к проекту, как только вы закончите «Use NextDivel, порно выглядит так же (или лучше).»

  11.   это имя сказал

    Муооооолааа !!!!

  12.   Нордри сказал

    Очень хорошая статья, но интересно, почему вы не следили за проектом Linux From Scratch?

    привет

    1.    АдрианАрройоУлица сказал

      Ну, Linux от Scratch в порядке, и вы можете сказать, что он ваш, но на самом деле он очень механический:
      -Скачать шрифты
      -Затей их
      -Составить
      -Установить
      -Следующий
      Здесь, даже если в итоге результат будет хуже, вы можете сказать, что просмотрели все файлы.

    2.    десикодер сказал

      Как видно из моего предыдущего комментария, потому что он не имеет такого же уровня сложности. Кроме того, linux с нуля, вопреки своему названию, на самом деле не создает систему с нуля. Создание системы с нуля - это ее программирование самостоятельно, написание собственного ядра, а не ядра Linux, если возможно, даже собственного загрузчика вместо grub, lilo, syslinux и т. д. Хотя LFS - немалый подвиг и довольно сложный процесс, он даже близко не подходит к программированию собственного ядра ...

      Кроме того, я согласен с AdrianArroyo Calle, что это слишком механически, я когда-то читал это, и вы в конечном итоге отказываетесь от шестой страницы, они также говорят вам использовать какие версии пакетов, потому что в противном случае инструкции не работают (что показывает отсутствие гибкости, на мой взгляд). Я думаю, что лучше иметь что-то свое, скомпилировать пакеты, которые вы хотите, даже запрограммировать некоторые, скомпилировать ядро ​​Linux и спокойно.

      Saludos!

  13.   печенье сказал

    уууоооооо !! Я никогда не получал столько постов, сколько этот.
    Пожалуйста, продолжайте 😀

  14.   linux_user сказал

    Не знаю, что случилось:

    ошибка: не найден мультизагрузочный заголовок.
    ошибка вам нужно сначала загрузить ядро

    1.    АдрианАрройоУлица сказал

      Если это меня утешает, я совершил ту же ошибку. Попробуйте использовать исходники, которые есть в GitHub, там ошибка уже решена. В любом случае, я думаю, если вы измените строку grub.cfg с «multiboot /next/START.ELF» на «kernel /next/START.ELF», это может сработать. Я точно не знаю.

      1.    Mcplatano сказал

        Во-первых, великолепный вход 🙂
        У меня такая же проблема с загрузкой ядра из grub. Даже используя исходники GitHub или меняя мультизагрузку для ядра ...

        ошибка: не найден мультизагрузочный заголовок.
        ошибка: не загружено ядро

        1.    АдрианАрройоУлица сказал

          Вы используете clang в качестве компилятора? Измените его на gcc
          Вы не забыли использовать скрипт компоновщика? Компоновщику (в нашем случае ld) необходимо знать, где в файле он будет помещать каждую вещь. В этом случае заголовок мультизагрузки должен быть в начале.
          Вы используете систему CMake? Если вы его используете, я думаю, он не подведет.
          Если у вас не сработает, я попробую найти другое решение.

  15.   хурт сказал

    [+100]
    Просто прекрасно !!!

  16.   invisible15 сказал

    Это действительно круто 🙂

  17.   Танракс сказал

    Снимаю шляпу. Впечатляющий пост. Поздравляю.

  18.   человек сказал

    Вау!
    Было бы замечательно, если бы вы могли открывать приложения, созданные на HTML5 и Javascript, без использования браузера, возможно ли это?
    Я говорю о том, что они похожи на нативные приложения.
    Так что программировать под эту операционную систему было бы легко 😀

    1.    АдрианАрройоУлица сказал

      В данном случае я не собираюсь этого делать, потому что для этого требуется гораздо больше работы, но есть операционная система под названием «is», которая выполняет то, что вы говорите. Фактически, командная строка - это JavaScript, а окна отрисовываются с использованием функций JavaScript Canvas. Инженеры Nintendo сделали это, и теперь это открытый исходный код.

      http://code.google.com/p/es-operating-system/

      1.    человек сказал

        Валла, спасибо за информацию 😀
        я взгляну

  19.   патодекс сказал

    Тот, кто может сделать свою собственную ОС, может умереть мирно, так как интеллектуальный уровень, которого он должен достичь с ее помощью; Это заставляет вас отказаться от рая или ада.
    Кусок проводки.

    1.    Мигель сказал

      до сих пор никто не сделал ничего, что можно было бы назвать достойной операционной системой, созданной с нуля, даже Linux Torvalds, как вы говорите в начале, так как это началось из исходных кодов Unix, а все остальное создано совместно с другими чем один человек, жизнь очень коротка и начинать с нуля немыслимо ни для кого, даже если требуется обратное, это демонстрируется во многих ошибках, допущенных при копировании и вставке Linux Torvalds

      1.    Skarmiglione сказал

        Исходники unix закрыты, использование minix ... что-то другое.

      2.    Фелипе Робаина сказал

        а те кто QDOS что сделал?
        были на чем-то основаны?

  20.   Тесла сказал

    Из того, что я вижу, у кого нет собственной операционной системы, потому что они не хотят, хахахаха.

    А теперь серьезно, очень интересно! Многое выходит за рамки моих ограниченных познаний в области программирования, но я с нетерпением буду читать другие части этой серии.

    Спасибо за сообщение!

  21.   Мануэль Р сказал

    Ты оставил меня с лицом О_О ... без намерения недооценивать чей-либо вклад, это самый "профи", который я видел за последнее время. Привет.

  22.   aitor_cz сказал

    Очень хорошая статья, Адриан. Продолжайте, пожалуйста…

  23.   mj сказал

    Вы шутите в День дураков? Не говорите «Эмуляция Линуса Торвальдса: создайте свою собственную операционную систему с нуля». Я не думаю, что это сложно для тех, кто делает карьеру в каком-нибудь технологическом институте или университете; но для меня я начинающий лучник (есть те, кто называет нас «нубами», но я считаю себя более новичком, несколько ленивым), это звучит как не ступить на землю. В любом случае, ДАННАЯ СТАТЬЯ создает много любопытства, БЕЗ СОМНЕННОГО УВАЖЕНИЯ И УВАЖЕНИЯ ЕГО РЕДАКТОРА, ПОЗДРАВЛЯЕМ; Первое, что я сделаю, это постараюсь хоть немного разобраться в этом ценном материале.
    СПАСИБО, Адриан Арройо Калле, отличная работа и благородная передача знаний.

  24.   Блэр Паскаль сказал

    LEL Отличный пост, так держать.

  25.   F3niX сказал

    Какой отличный пост, это то, что я пропустил из Linux. Замечательный.

  26.   рубин сказал

    Отличный пост, большое спасибо.
    Я не понял, что делает файл link.ld, может мне кто-нибудь объяснить?

    1.    АдрианАрройоУлица сказал

      Файл link.ld сообщает компоновщику (в данном случае ld), в какой позиции в итоговом файле должна находиться каждая часть кода. Мы также определяем точку входа, поскольку, поскольку у нас нет операционной системы, мы не можем использовать main как обычную программу, в этом случае мы выбираем функцию запуска.

  27.   Макси сказал

    Здорово весь твой пост! Жду 7! Что делать, если у меня есть сомнения, например, если я просто хочу запустить алгоритм без ОС, как мне узнать, что я могу использовать, а что нет?

    1.    АдрианАрройоУлица сказал

      Если вы используете его таким образом, вы не сможете использовать что-либо из stdlib, которое практически все используют (без malloc, free, printf, scanf, strcmp и т. Д.). Все должно быть реализовано прямо из памяти или ASM. Возможно, в более высокой главе я покажу вам, как установить библиотеку C для операционной системы. Если вы используете C ++, вы не можете использовать исключения и операторы new и delete (и, конечно же, многое другое).

    2.    Свичер сказал

      Я думаю что Эсто он может дать вам лучшее представление о том, как это сделать.

  28.   Стивен сказал

    Здравствуйте, около 5 лет назад я следил за аналогичной публикацией и разработал микроядро, которое запускается таким же образом, у него есть некоторые аспекты, которые нужно улучшить, но это может вас заинтересовать, оно работает в защищенном режиме, выполняет многозадачность и выполняет виртуализацию памяти, в последнее время я работал над драйвером диска и приводом компакт-диска, чтобы сделать его устанавливаемым, а не просто запускать на живом компакт-диске ... Приветствую.

  29.   Йохан сказал

    Уважаемый, у меня ошибка при выполнении команды:
    gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding -lgcc

    link.ld: 5 синтаксическая ошибка
    collect2: ошибка: ld вернул 1 статус выхода

    link.ld
    . = 0x00100000;
    .multiboot_header: {
    * (. multiboot_header)
    }

    В строке 5 ошибки не вижу, у кого-то такое же происходит?

    Я работаю с виртуализированным debian wheezy в virtualbox

    1.    Джулиан Рейес Эскригас сказал

      добавить ";" в конце * (. multiboot_header)

  30.   Эрик Орельяна Ромеро сказал

    Отличная инициатива, я обязательно буду следить за главами этого поста, чтобы многому у него научиться. Большое спасибо за то, что нашли время научить нас. Единственной деталью в этой связи следует отметить, что Линус Торвальдс не является создателем какой-либо операционной системы, он создал Ядро системы GNU / Linux (то, что использовалось в других ОС), которое до сих пор достойно, но важно отдать должное Ричарду Столмену, создавшему большую часть ОС.

    Большое спасибо за ваш вклад, и я надеюсь, что вы примете во внимание мое наблюдение.

  31.   Джулиан Рейес Эскригас сказал

    Я уже какое-то время возился с этой темой, заинтересовался, как только прочитал заголовок. но сообщение продолжает получать

    ошибка: не найден мультизагрузочный заголовок.
    ошибка вам нужно сначала загрузить ядро

    Я загрузил то, что беру, в репо на github https://github.com/rkmax/GenyOS

    1.    Мартин Вильяльба сказал

      То же самое происходит и со мной. Вы нашли решение?

  32.   Чарли сказал

    вопрос Я начал вводить синтаксис, и строка меню говорит мне, что команда не найдена, кто может сказать мне, почему
    вот что я делаю

    ЧЕРНЫЙ @ ЧЕРНЫЙ-pc: ~ / blackroot $ menuentry «NextDivel» {
    menuentry: команда не найдена

    1.    АдрианАрройоУлица сказал

      Содержимое этого содержимого следует вводить не в командной строке, а в созданном вами файле с именем grub.cfg.

  33.   Нодетино сказал

    Отличная статья, спасибо!

  34.   David сказал

    Захватывающий…!! это как недостающее звено.

  35.   р.гарсиаг сказал

    Мне нравятся ваши руководства по эмуляции LInus Torvalds, но есть один шаг, который я не понимаю, а именно:
    Теперь мы копируем START.ELF в / next внутри нашей папки, которая имитирует корень нашей операционной системы. Переходим в корневую папку нашей новой операционной системы с консолью и проверяем наличие двух файлов: один /boot/grub/grub.cfg и другой /next/START.ELF.

    Мы переходим в верхний каталог и вызываем утилиту создания ISO с GRUB под названием grub-mkrescue.

    Может ли кто-нибудь объяснить мне это: p

    1.    АдрианАрройоУлица сказал

      Просто чтобы сгенерировать минимальный ISO, который может загрузить GRUB, мы копируем ядро ​​(/ ISO, любая папка) /next/START.ELF и файл конфигурации GRUB в (/ ISO, любая папка) / boot / grub / grub.cfg. Как только это будет сделано, мы еще не установили GRUB на ISO, и есть утилита, которая генерирует ISO из папки и устанавливает GRUB под названием grub-mkrescue. Тогда мы, наконец, получим загрузочный ISO с установленным GRUB, который может считывать конфигурацию для последующего правильного выполнения START.ELF. Не знаю, объяснил ли я себя, но то, что мы делаем, является своего рода ложной файловой системой, с помощью которой мы генерируем ISO.

  36.   Мигель Хосе Гевара Атенсио сказал

    Hottie

  37.   Майкл Морено сказал

    Что ж, на самом деле посмотрите на новую систему не так много, но если улучшить Linux, например, создать exonucleus linux с серверным компонентом, который действует как микроядро, если это необходимо, то есть структура exo с поведением micronucleus, которая будет супер и Linux .

    Другое дело, что я не эксперт в программировании, всего несколько дрянных C ++ и немного java, мне было бы достаточно дать программе ядра Linux модуль, распотрошить его, модифицировать и т. Д.

  38.   ЗимнийСолдат53 сказал

    Вне всяких сомнений, уже в отпуске надо делать.

  39.   Фермин сказал

    Этот хороший, а в какой программе он его проектирует и кодирует?
    пожалуйста, дайте мне этот ответ

  40.   Темный разум сказал

    При компиляции из вашего git я получаю:

    [jmponce @ jar build] $ cmake ..
    - Создание каталога NextRoot
    - Генерация скрипта ISO
    сделать DESTDIR = следующая установка
    ./iso.sh
    - Найден Doxygen: / usr / bin / doxygen (найдена версия "1.8.9")
    - Настройка выполнена
    - Генерация сделана
    - Файлы сборки записаны в: / home / jmponce / next-divel / build
    [jmponce @ jar build] $ make
    Сканирование зависимостей целевого START.ELF
    [7%] Создание объекта ASM-ATT src / CMakeFiles / START.ELF.dir / start / boot.asm.o
    [14%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / NextShellLite.cpp.o
    [21%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_Screen.cpp.o
    [28%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / NextKernel_Main.cpp.o
    [35%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_Panic.cpp.o
    [42%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_Timer.cpp.o
    [50%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_Memory.cpp.o
    [57%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_Ports.cpp.o
    [64%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_GDT.cpp.o
    [71%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_ISR.cpp.o
    [78%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_String.cpp.o
    [85%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_IRQ.cpp.o
    [92%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_IDT.cpp.o
    [100%] Создание объекта CXX src / CMakeFiles / START.ELF.dir / start / ND_Keyboard.cpp.o
    Связывание исполняемого файла CXX START.ELF
    / usr / bin / ld: Несовместимый /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/libgcc.a пропускается при поиске -lgcc
    / usr / bin / ld: не удается найти -lgcc
    collect2: ошибка: ld вернул статус выхода 1
    src / CMakeFiles / START.ELF.dir / build.make: 402: невыполненные инструкции для цели 'src / START.ELF'
    make [2]: *** [src / START.ELF] Ошибка 1
    CMakeFiles / Makefile2: 106: невыполненные инструкции для целевого src / CMakeFiles / START.ELF.dir / all
    make [1]: *** [src / CMakeFiles / START.ELF.dir / all] Ошибка 2
    Makefile: 117: Ошибка в инструкциях для цели «все»
    make: *** [all] Ошибка 2

    1.    АдрианАрройоУлица сказал

      Ошибка, похоже, заключается в том, что он не может найти llibgcc, поскольку у вас 64-разрядная версия, и в настоящее время система сборки вынуждена использовать 32-разрядную версию. Вам следует установить пакет совместимости в свой дистрибутив или лучше использовать 32-битную систему.

      1.    Роналду Родригес сказал

        У меня 32 бита, и я получаю ту же ошибку, вы имеете в виду операционную систему или архитектуру? у меня 64-битная, но я использую 32-битную Ubuntu, не спрашивайте, финансовые проблемы, этим я говорю все.

  41.   Хорхе сказал

    Отличная тема, ждем большего размаха. С уважением

  42.   Джон сказал

    Отлично, я надеюсь на большее

  43.   Соид Перес сказал

    Здравствуйте, я молодой посол, который хочет создать операционную систему, поддерживающую все программы и платформы, чтобы разработчикам не приходилось иметь мощные машины, приложения или программы на ПК.
    Вот почему меня интересует этот пост, но когда я загружаю ваш git или пытаюсь его создать, все работает, пока я не выполню команду ./iso.sh или grub-mkrescue -o nextdivel.iso nextroot, вы получите эту ошибку

    «Grub-mkrescue: предупреждение: ваш xorriso не поддерживает« –grub2-boot-info ». Некоторые функции были отключены. Используйте xorriso 1.2.9 или новее.
    grub-mkrescue: предупреждение: ваш xorriso не поддерживает «–grub2-boot-info». Ваш образ ядра слишком велик. Загрузка с диска отключена. Используйте xorriso 1.2.9 или новее .. »
    Я действительно понятия не имею, так как я много знаю о приложениях и веб-сетях, но я ничего не знаю о grub

    1.    АдрианАрройоУлица сказал

      Возможно, вам потребуется обновить программу xorriso в вашем дистрибутиве. Какой дистрибутив и версию вы используете?

      1.    Соид Перес сказал

        Я использую xubuntu 14.04lts и пытаюсь запустить xorriso, но оболочка сообщает мне, что не может ее найти, и я получаю apt-get install xorriso, хотя я искренне ожидал ответа, потому что у меня был плохой опыт установки вещей, которые я не знаю в linux, хе-хе . Я обновлю его прямо сейчас и расскажу, что случилось

      2.    АдрианАрройоУлица сказал

        Затем установите xorriso из программного центра или просто из терминала выполните «sudo apt-get install xorriso»

      3.    Соид Перес сказал

        Я уже сделал все, что вы мне сказали, и как с git, так и с моим, я получаю xorriso 1.3.2: манипулятор файловой системы RockRidge, проект libburnia.

        Ток привода: -outdev 'stdio: nextdivel.iso'
        Текущий медиа: файл stdio, перезаписываемый
        Статус СМИ: пусто
        Сводка СМИ: 0 сеансов, 0 блоков данных, 0 данных, 1901 мин. Свободного места
        В образ ISO добавлен каталог '/'='/tmp/grub.OEqSzV'
        xorriso: ОБНОВЛЕНИЕ: 546 файлов добавлены за 1 секунду
        xorriso: FAILURE: невозможно определить атрибуты исходного файла '/ media / gaia / Jupiter1 / ShellSystem / nextroot / nextroot': нет такого файла или каталога
        xorriso: ОБНОВЛЕНИЕ: 546 файлов добавлены за 1 секунду
        xorriso: aborting: -abort_on 'FAILURE' обнаружил 'FAILURE'
        И кордрой, я не понимаю, что моя структура - это /nextroot/boot/grub/grub.cfg и nextroot / next / START.ELF

      4.    Соид Перес сказал

        Спасибо, я готов двигаться дальше, друг помог мне и сказал, что я сделал не так, это была организация каталога, так что я уладил это и все

      5.    Эрик сказал

        Извините, не могли бы вы сказать, какую процедуру вы выполнили, поскольку я получаю сообщение об ошибке: ничего не загружается: нет такого файла или каталога

        отсутствует загрузочное устройство.

  44.   хосе сказал

    С Уважением! Я собирался попросить вас об одолжении, если бы вы могли отправить мне электронное письмо с тем, что вы здесь объясняете, я немного запутался, и мне нужно сравнить то, что у меня есть, с тем, что вы объясняете, возможно, мне не ясно, создание grub. cfg происходит в терминале gcc или где именно? большое спасибо друг!

    1.    АдрианАрройоУлица сказал

      Вы создаете файл grub.cfg с помощью любого текстового редактора и должны сохранить его в PROJECT_FOLDER / boot / grub / grub.cfg.

  45.   Джуазано сказал

    Привет, Адриан, прежде всего поздравляю вас и благодарим за ваш вклад.

    Вы знаете, я делаю это для практики, и я начал собирать это после вашего обучения, однако после начала я обнаружил первую ошибку

    $ as -o kernel.o -c kernel.asm
    bash: as: команда не найдена ...
    Подобные команды:
    'са'
    'ac'

    Я работаю над Fedora 20, и я не могу найти решение в этом отношении, я был бы признателен за ваше руководство о том, следует ли мне что-то менять в gcc или gas

    заранее спасибо

    1.    АдрианАрройоУлица сказал

      Вы должны установить GAS, чтобы я мог видеть код ошибки. У меня под рукой нет Fedora, но теоретически, если вы выполните yum install gcc-c ++, вы установите весь пакет GCC и GNU, как обычно, вместе с ним.

  46.   Гастон Рамирес сказал

    Я с вами, я кое-что знаю о C ++, C # (хотя последний не очень полезен в этом вопросе) плохо то, что мне до сих пор не хватает опыта, я никогда не работаю с языком C, ваша публикация отличная, Мне нечего сказать, если у меня будет время, я увижу. Спасибо.

  47.   Тересита дель Иисус нах Санчес сказал

    Большое спасибо за большую помощь….

  48.   JKY сказал

    Я люблю Linux, это лучший район, правда для моих окон - мусор, потому что я знаю, что создатель Linux является создателем окон

  49.   Роде сказал

    Привет, я получаю сообщение об ошибке в grub:
    ошибка: файл /next/START.ELF не найден
    ошибка: сначала нужно загрузить ядро

    Не могли бы вы мне помочь и погуглили, но я не могу найти

  50.   Энрике Авила сказал

    Пожалуйста, как мне сделать так, чтобы он показывал сообщение HELLO WORLD? Я новичок и все еще недостаточно знаю

  51.   КАРЛОС ГЕРРЕРО АЛЬВАРЕС сказал

    Со мной происходит следующее:
    gcc -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding -lgcc
    / usr / bin / ld: kernel.o: перемещение R_X86_64_32 против символа `stack 'не может использоваться при создании объекта PIE; перекомпилировать с -fPIE
    / usr / bin / ld: ошибка последней ссылки: непредставимый раздел на выходе
    collect2: ошибка: ld вернул 1 статус выхода