Я скомпилировал ядро linux, загрузив его с kernel.org, поместил на рабочий стол и открыл терминал. Я перешел в папку linux-3.2.13, набрал mr proper
.
Затем я использую make menuconfig
для настройки своего файла .config. После того, как я закончил с этим и сохранил его, я набрал , make
и терминал начал компилировать файлы. После 3 часов компиляции я задался вопросом, не сделал ли я что-то неправильно.
У меня есть вопросы:
- Я сделал что-то не так?
- Если нет, что мне делать дальше?
- Какой будет результат (например, .bin, .elf)?
- Моя конечная цель — создать ОС, которую я смогу записать на компакт-диск, установить на другой компьютер и запустить (нетОС Ubuntu с другим ядром).
решение1
Я сделал что-то не так?
Не похоже. Компиляция нового ядра очень ресурсоемка. Если у вас старый процессор и мало оперативной памяти, это может занятьоченьlong.
Убедитесь, что вы выбрали только те модули/функции, которые вам действительно нужны, и если у вас многоядерная/потоковая машина с небольшим объемом оперативной памяти, используйте опцию , -jX
чтобы make
она могла запускать сборку параллельно. Например
make -j4
для большей части сборки будут использоваться четыре ядра.
Каков будет результат?
Это будет сжатый образ ядра. Это не файл ELF и не исполняемый файл в обычном смысле. Он имеет формат, подходящий для обработки загрузчиком вашей платформы.
Что я должен делать дальше?
Зависит от того, что вы задумали... (См.здесьдля простого HOWTO по установке модулей и образа ядра, предполагая, что вы используете Grub. Есть много других, доступных с быстрым поиском, и вам лучше поискать в документации вашего текущего дистрибутива, если вы планируете фактически запустить основной дистрибутив с вашим новым ядром - есть требования к функциям и потенциальные особенности initrd, которые нужно принять во внимание.)
[Моя цель — создать собственную ОС]
Боюсь, вы очень далеки от этого. Сборка ОС — очень, очень сложная задача, а сборка ядра — одна из самых простых ее частей.
Я бы посоветовал вам зайти наLinux с нуляи читать текущую стабильную "книгу". Также посмотрите наdistrowatchи выполните поиск в категории дистрибутивов «На основе исходного кода», некоторые из них могут вас заинтересовать.
решение2
Я публиковал большие комментарии и подумал, что, возможно, лучше будет опубликовать что-то в качестве ответа, потому что коробка больше, и я могу писать столько, сколько захочу. :) Надеюсь, вы простите мне мой безумный бред.
И еще, предупреждаю: я полный негодяй, и я тебе немного крылья подрежу.
Первое, что вам нужно решить: насколько хороши ваши навыки программирования? Вы не сможете написать свою собственную ОС без хороших навыков программирования и хорошего понимания оборудования.
Второе, что вам нужно решить:
- Вы создаете дистрибутив Linux? (например, Debian, Ubuntu, Red Hat)
- Вы создаете операционную систему на базе Linux с другой средой выполнения? (например, Android, Maemo)
- Вы пишете операционную систему с нуля? (например, VMS, CP/M, RT-11, Amoeba, Plan/9)
Прежде чем ответить на эти вопросы, вам следует дважды проверить, правильно ли вы изложили свои условия, чтобы знать, что вы делаете.
1. Дистрибутив Linux (например, Debian)
Если все, что вы хотите сделать, это Yet Another Linux Distribution, то компиляция ядра — наименьшая из ваших забот. Ядро практически компилируется само, если дать ему достаточно времени и достаточно большой компьютер.
Вотстатья, в которой обсуждаются некоторые аспекты создания дистрибутивов Linux.
Почему это сложнее, чем вы думаете: чем больше функциональности вы хотите добавить в свой дистрибутив, тем сложнее будет заставить его правильно собраться. Вам придется выбирать, изобретать ли велосипед (создать свой собственный менеджер пакетов) или использовать существующий (RPM? APT? Порты?). В любом случае, вам придется месяцами заниматься раздражающей работой по согласованию взаимно несовместимых пакетов, компиляции, проверке работоспособности на разных компьютерах с разными процессорами (не только Intel или AMD) и так далее.
В зависимости от масштаба, вам, возможно, придется переделывать работу тысяч людей самостоятельно. Многому ли вы научитесь? Безусловно! Но вы также многому научитесь, запустив существующий дистрибутив Linux и время от времени компилируя некоторые пакеты самостоятельно, чтобы посмотреть, как все работает. Зачем собирать libc и сотни других библиотек, если все, что вы хотите увидеть, это как построен X-сервер?
Подумайте об этом так: если вы хотите научиться собирать ПК, с чего бы вы начали: с ведра транзисторов и паяльника или с комплектующих для ПК и некоторой документации?
2. Операционная система на базе Linux (например, Android)
Существует довольно много операционных систем на базе Linux, среды выполнения которых существенно отличаются от POSIX. На ум приходят Maemo, Meego, Android и другие (чаще всего встроенные) операционные системы.
Преимущество этого в том, что вам не нужно писать собственное ядро. Недостаток этого в том, что вам не только нужно разрабатывать свой собственный дистрибутив, но и вам придется делать большинство пакетов самостоятельно. Вы думали, что компиляция gcc
— libc
это боль? Попробуйте написать свой собственный ANSI-C-совместимый компилятор Cиполный программный стек с нуля. Годы написания раздражающих маленьких функций (вероятно, на ассемблере), которые обеспечивают крошечные, крошечные порции удовлетворения. Вам также нужно будет изучить большую часть внутреннего устройства ядра Linux и то, как оно взаимодействует с пользовательским пространством, потому что этот интерфейс — то, на чем вы будете строить. К концу этого вы должны будете знать наизусть большинство номеров системных вызовов. :)
Вы бы многому научились? Конечно! Больше, чем вы когда-либо считали возможным. Будет ли это раздражать и раздражать? О да. Есть причина, по которой Android не был создан одиноким парнем с ноутбуком в свободное время. Даже gcc
не был создан таким образом.
3. Операционная система с нуля
Здесь вы начинаете с ассемблера и компилятора C и пишете собственное ядро — если в вашей ОС вообще есть ядро. Это не всегда так. Загрузите все таблицы данных, которые вы можете найти для своего оборудования, и вперед. Как только у вас запустится базовое ядро, вы сможете узнать о среде выполнения. Вы можете написать собственную среду выполнения или убедиться, что ваше ядро частично или полностью совместимо с POSIX, и тогда в вашем распоряжении будет полноценная среда выполнения GNU. Вам «просто» нужно будет создать первый уровень библиотек и запустить его gcc
на новой ОС.
Это полезно? Удивительно. Будет ли это сложно? Если имена Дональд Кнут, Эндрю Таненбаум ничего вам не говорят, вам, вероятно, стоит передумать. Будет много изучать теоретическую информатику. Существует невероятное количество теории, которая входит в создание операционной системы действительно с нуля. К сожалению, есть также удивительное количество скуки с современными системами.
Раньше было так: вы просто записывали ПЗУ с инструкцией JMP в нужном месте, вставляли его в сокет, включали, и все готово. Современным системам требуется серьезный объем работы только для того, чтобы запустить ядро ЦП, настроить память, перечислить устройство ввода и запустить устройство вывода. По каждой из этих задач есть целые книги (у меня есть книга пооригинальный(VGA, насчитывающий более 1000 страниц — выросши на 8-битных машинах, я полагал, что программирование VGA 1987 года будет простым, и это меня серьезно раздражало, но в процессе я многому научился!)
Так стоит ли это делать?
Вам непременно следуетпытаться. Не имейте ложных представлений об «успехе», если ваши цели не установлены с самого начала. Поддержка ОС/дистрибутива — этооткрытыйзадача, которую обычно выполняют большие группы людей. Но даже попытка сделать это отточит ваши навыки и научит вас новым.
Кстати, я говорю на основе (часто болезненного) опыта в отношении большинства из этих вещей. Я (со)писал встроенные низкоуровневые среды выполнения для нескольких ЦП (учеба/работа/развлечение), и я пишу игрушечную ОС для игрушечного ЦП в данный момент (это все для развлечения).
решение3
Чтобы скомпилировать ядро в Ubuntu, следуйте инструкциям, приведенным в следующем руководстве: