Компиляция кода ядра в Linux - PullRequest
5 голосов
/ 21 февраля 2011

Хорошо, я читаю о разработке ядра Linux, и есть некоторые фрагменты кода, использующие структуры данных ядра и прочее.Допустим, я бы хотел поэкспериментировать с ними, например, есть очень простой фрагмент:

#include <../../linux-2.6.37.1/include/linux/sched.h>
struct task_struct *task;
for_each_process(task) {
    printk("%s[%d]\n", task->comm, task->pid);
}

Кажется довольно простым, а?Теперь, я не могу построить вещь.Я использую NetBeans.Файл sched.h является правильным, как если бы можно было щелкнуть CTRL + по нему, один из них был перенесен в нужный файл.

Нужно ли мне как-то включить мой пример файла и собрать целое * 1009?* ядро ​​из Makefile?Я просто хотел увидеть, что он строит и, возможно, что он будет работать.Если мне нужно собрать все ядро, как бы я на самом деле тестировал свои вещи?

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

Спасибо, ребята!

Ответы [ 5 ]

6 голосов
/ 21 февраля 2011

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

Имейте в виду, что не весь код ядра может быть перемещен в модуль - только те, которые используют публичные (экспортируемые) интерфейсы ядра. Код, свойственный ядру ядра (например, виртуальной машине или планировщику), вероятно, недоступен для остальной части ядра.

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

Деталь, которая усложняет задачу: в общем случае вы можете вставить только модуль в ядро, для которого он был построен. Модуль, скомпилированный в хост-системе, может использоваться на тестовой ВМ тогда и только тогда, когда ядро ​​идентично, то есть та же версия пакета ядра из того же дистрибутива. Учитывая, что вы захотите обновить дистрибутив своего хоста, на мой взгляд, проще построить модуль в тестирующей системе.

Поскольку вам необходим полный комплект разработки для C , вам, вероятно, следует установить один из популярных дистрибутивов Linux. Он должен быть более стабильным, и вы можете иметь доступ к его сообществу пользователей. Если вы хотите уменьшить его размер, вы можете просто установить базовую систему без X-сервера или графических приложений.

BTW Netbeans предназначен для разработки приложений для пространства пользователя. Вы, вероятно, можете адаптировать его для кода ядра, но он никогда не будет таким подходящим, как для программирования в пользовательском пространстве. На самом деле, ни одна IDE действительно не подходит. Код ядра не может быть запущен из пространства пользователя (не говоря уже о том, чтобы использовать отдельную виртуальную машину), что нарушает обычный цикл рабочего процесса edit-> compile-> run-> debug, который автоматизируют IDE.

Большинство разработчиков ядра просто используют расширенный редактор с подсветкой синтаксиса для C, такой как Vim или Emacs . Emacs на самом деле является IDE (и многим другим), но, как я упоминал выше, вы не можете легко использовать рабочий процесс на основе IDE для разработки кода ядра.

1 голос
/ 21 февраля 2011

Очень мало кода ядра может работать вне ядра в любой форме. Большая часть кода ядра очень 'переплетена' (чтобы использовать фразу, которую я узнал от коллеги много лет назад, чтобы описать чрезмерную связь) с другими частями кода ядра. Функции «знают» определения структур для многих и многих структур вдали от того, над чем они работают. Типичные разработчики программного обеспечения ненавидят код вроде этого:

    if (unlikely(inode_init_always(sb, inode))) {
            if (inode->i_sb->s_op->destroy_inode)
                    inode->i_sb->s_op->destroy_inode(inode);
            else
                    kmem_cache_free(inode_cachep, inode);
            return NULL;
    }

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

Если вы хотите поиграть, то не так уж сложно настроить и запустить виртуальную систему в наши дни с qemu + kvm или virtualbox или uml, чтобы попытаться внести изменения в ядро. Довольно просто «поиграть» со структурами в работающей системе, но это гораздо более осуществимо, чем попытка скомпилировать части ядра в пользовательском пространстве.

Удачи. :)

1 голос
/ 21 февраля 2011

Весь код, который вы пишете, компилируете и запускаете как пользовательские программы, запускается как ... ну, пользовательские программы, в пользовательском режиме.Ядро работает в режиме ядра.Оба режима разделены и не могут видеть друг друга напрямую.Они общаются через определенные интерфейсы.Эти интерфейсы являются системными вызовами языка Си (в отличие от вызовов библиотеки языка Си).

Чтобы получить доступ к структурам task_struct, ваш код должен работать в режиме ядра.Для этого лучше всего написать модуль ядра и загрузить его в ядро.

1 голос
/ 21 февраля 2011

Вы можете собрать загружаемый модуль ядра, если вы не хотите собирать все ядро ​​- например, см. http://www.linux -tutorial.info / modules.php? name = Howto & pagename = Module-HOWTO .

0 голосов
/ 03 августа 2013

Вам может понравиться использование systemtap в качестве оболочки для небольших кусочков кода модуля ядра:

# stap -g -e 'probe begin { your_function() exit() }
%{
#include <linux/whatever.h>
%}
function your_function() %{
   ... insert safe c code here ...
%}'

Он также может автоматически кросс-компилироваться (если вы используете stap --remote=VIRTMACHINE ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...