Найти в Дзене
ULTeam8

Язык программирования Си поможет мне подняться

Оглавление

Статья в блоге - Лаборатория IT

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

Кстати, есть одна несправедливость, автор языка Си, Деннис Ритчи, умер на третий день, после смерти Стива Джобса. О смерти основателя Apple не написал только ленивый. Легендарный разработчик же ушел тихо, будто никому не нужный. Так вот, это не так. Мы помним о тебе, Деннис! Надеюсь читатели поймут меня и не осудят за этот эмоциональный абзац.

Деннис Ритчи - создатель языка программирования Си

-2

Так вот, Деннис Ритчи, работая в Bell Labs, разработал язык Си. Дизайн языка предполагал, что использоваться он будет в тех местах, где раньше использовался ассемблер. Более того, данный язык программирования разрабатывался специально для создания операционной системы Unix.

-3

Исходник на Си

Что-же, начнем. Нужно создать новый файл с наименованием - kernel.с. Исходники на языке Си используют расширение файла - .c. Реализуем функцию вывода наименования и версии операционной системы. Язык программирования Си очень похож на ассемблер, поэтому мы, фактически, просто перепишем наш код, который я написал в статье: Ядро операционной системы - первые шаги, используя синтаксис Си.

Очень просто, не так ли. Комментарии в коде ясно показывают где и что происходит.

Доработка загрузчика

Для внедрения данного кода в загрузчик ядра Simple OS, нужно немного поправить ассемблерный исходник. Как Вы помните там есть список инструкций для вывода текста. Удалим их! Должен остаться такой код:

Настала пора подняться на уровень выше! (барабанная дробь) Добавляем в код вызов процедуры из исходника Си. Функция называется kmain. Покажем загрузчику кто есть кто, перед меткой start, что она находится в другом файле:

extern kmain

А теперь вызов после установки адреса стека:

call kmain

В целом код получается такой:

Сборка с помощью GNU LD

Теперь у нас есть два файла исходников: boot.asm и kernel.c. Чтобы собрать единое ядро используем компоновщик, или как его правильно называют: редактор связей, из пакета GNU LD. По ссылке можно посмотреть документацию на русском языке. Мой файл - link.ld - это файл с конфигурацией для компоновщика на языке управления линкером,очень простой:

В нем указан формат выходного файла, точка входа и секции бинарника.

В терминале нужно будет написать следующую команду:

ld -m elf_i386 -T link.ld -o kernel.bin boot.o kernel.o

kernel.o и boot.o - это файлы объектного кода, компилированного из исходников: kernel.c и boot.asm. На выходе получается собранное ядро - kernel.bin.

После этого стандартно собираем iso-образ диска, запускаем в эмуляторе. И, вуаля:

-4

Автоматизация сборки

Добавлю знания, почерпнутые в теоретической обзорной статье: Автоматизация — используем make.

Пробегусь быстренько по целям:

  • project_structure - подготовка структуры проекта
  • boot - компиляция загрузчика ядра ОС
  • kernel - компиляция ядра операционной системы, написанного на языке программирования Си
  • link - компоновка ядра
  • iso - сборка образа диска
  • qemu - запуск подготовленного образа в эмуляторе в качестве жесткого диска
  • qemu_cd - запуск образа в качестве cd-диска
  • clean - очистка директории сборки

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

make qemu_cd

Надеюсь Вам понравилась статья. А, пока, до скорых встреч!

Картинки найдены на просторах интернета.

Рекомендуем почитать