Вопрос

Я хочу изучить программирование ядра Linux.

Каковы будут отправные точки для этого?Какие проблемы могут быть более простыми для решения?

Это было полезно?

Решение

Попробуйте найти книгу Роберта Лава по программированию ядра Linux.Это очень кратко и легко следовать.

После этого или одновременно с этим вы, возможно, захотите взглянуть на «Понимание ядра Linux». Но я бы не рекомендовал это на ранних стадиях.

Также посмотрите на Руководство по программированию ядра Linux.Поскольку программирование модулей ядра позволяет многому научиться, это руководство вам поможет.И да, для получения большого количества информации обратитесь к подкаталогу «документация» архива исходного кода ядра.

Другие советы

**TODO** +editPic: Linux Kernel Developer -> (Ring Layer 0)
         +addSection: Kernel Virtualization Engine

KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.

Рекомендуемые книги для Неинициализированный void *i

«Люди не понимают книг, пока они не проживут определенную жизнь, или, во всяком случае, ни один человек не поймет глубокую книгу, пока он не увидит и не проживет хотя бы часть ее содержания».–Эзра Паунд

Путешествие в тысячу кодовые мили должно начинаться с одного шага.Если вы не знаете, с какой из следующих книг начать, не волнуйтесь, выберите любую по вашему выбору.Не все те, кто бродят теряются.Как все дороги в конечном итоге соединяются с шоссе, вы будете исследовать новые вещи в своем путешествии по ядру по мере продвижения страниц, не встречая тупиков, и в конечном итоге подключитесь к code-set.Читайте внимательно и помните: Код — это не литература.

То, что осталось, — это не вещь, не эмоция, не образ, не мысленный образ, не воспоминание и даже не идея.Это функция.Процесс какой-то.Аспект Жизни, который можно описать как функцию чего-то «большего».И поэтому, кажется, что это на самом деле не "отдельно" от этого что-то другое.Как функция ножа - резать что-то - не является, по сути, отдельным от самого ножа.Функция может использоваться или не использоваться в данный момент, но оно потенциально НИКОГДА не разделено.

Дерандомизированный алгоритм Соловея Штрассена для теста на простоту:

Solovay Strassen Derandomized Algorithm for Primality Test

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

static void tasklet_hi_action(struct softirq_action *a)
{
        struct tasklet_struct *list;

        local_irq_disable();
        list = __this_cpu_read(tasklet_hi_vec.head);
        __this_cpu_write(tasklet_hi_vec.head, NULL);
        __this_cpu_write(tasklet_hi_vec.tail, this_cpu_ptr(&tasklet_hi_vec.head));
        local_irq_enable();

        while (list) {
                struct tasklet_struct *t = list;

                list = list->next;

                if (tasklet_trylock(t)) {
                        if (!atomic_read(&t->count)) {
                                if (!test_and_clear_bit(TASKLET_STATE_SCHED,
                                                        &t->state))
                                        BUG();
                                t->func(t->data);
                                tasklet_unlock(t);
                                continue;
                        }
                        tasklet_unlock(t);
                }

                local_irq_disable();
                t->next = NULL;
                *__this_cpu_read(tasklet_hi_vec.tail) = t;
                __this_cpu_write(tasklet_hi_vec.tail, &(t->next));
                __raise_softirq_irqoff(HI_SOFTIRQ);
                local_irq_enable();
        }
}

Ядро Linux ( 5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6 )

«У природы нет ни ядра, ни оболочки;она — все одновременно» — Иоганн Вольфганг фон Гете.

Читатель должен хорошо знать концепции операционной системы;четкое понимание длительных процессов и их различий с процессами с короткими периодами выполнения;отказоустойчивость при соблюдении мягких и жестких ограничений реального времени.При чтении важно понимать и n/ack выбор дизайна, сделанный исходным кодом ядра Linux в основных подсистемах.

Потоки [и] сигналы [представляют собой] зависящий от платформы след страданий, отчаяния, ужаса и безумия (~ Энтони Баксте).При этом вы должны быть экспертом по C, прежде чем углубляться в ядро.У вас также должен быть хороший опыт работы со связанными списками, стеками, очередями, деревьями Red Blacks, хеш-функциями и т. д.

volatile int i;
int main(void)
{
    int c;
    for (i=0; i<3; i++) {
        c = i&&&i;
        printf("%d\n", c);    /* find c */
    }
    return 0;
}

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

Видео Лекции в системах реального времени, Планирование задач, Сжатие памяти, Барьеры памяти, СМП

#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
  1. Разработка ядра Linux - Роберт Лав
  2. Понимание ядра Linux - Дэниел П.Бове, Марко Чезати
  3. Искусство Linux KerneL Design - Ян Лисян
  4. Профессиональная архитектура ядра Linux - Вольфганг Мауэрер
  5. Проектирование операционной системы UNIX - Морис Дж.Бах
  6. Понимание диспетчера виртуальной памяти Linux - Мел Горман
  7. Внутреннее устройство ядра Linux - Тигран Айвазян
  8. Учебник по встроенному Linux - Кристофер Халлинан

Драйверы устройств Linux ( 1 -> 2 -> 4 -> 3 -> 8 -> ... )

«Музыка не увлекает за собой.Вы должны идти вперед исключительно благодаря своей способности действительно сосредоточиться на этом маленьком зернышке эмоций или истории».-- Дебби Гарри

Ваша задача, по сути, состоит в том, чтобы установить высокоскоростной интерфейс связи между аппаратным устройством и программным ядром.Вам следует прочитать справочную информацию/руководство по оборудованию, чтобы понять поведение устройства, его состояние управления и данных, а также предоставляемые физические каналы.Знание ассемблера для вашей конкретной архитектуры и хорошее знание языков описания оборудования СБИС, таких как VHDL или Verilog, помогут вам в долгосрочной перспективе.

вопрос:Но зачем мне читать характеристики оборудования?

А:Потому что «Существует пропасть углерода и кремния, которую программное обеспечение не может преодолеть» — Рахул Соннад

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

Видео Лекции о драйверах устройств Linux (Лек.17 и 18), Анатомия встроенного драйвера KMS, Управление контактами и обновление GPIO, Общая система синхронизации, Напишите настоящий драйвер для Linux — Грег К.Х.

static irqreturn_t phy_interrupt(int irq, void *phy_dat)
{
         struct phy_device *phydev = phy_dat;

         if (PHY_HALTED == phydev->state)
                 return IRQ_NONE;                /* It can't be ours.  */

         /* The MDIO bus is not allowed to be written in interrupt
          * context, so we need to disable the irq here.  A work
          * queue will write the PHY to disable and clear the
          * interrupt, and then reenable the irq line.
          */
         disable_irq_nosync(irq);
         atomic_inc(&phydev->irq_disable);

         queue_work(system_power_efficient_wq, &phydev->phy_queue);

         return IRQ_HANDLED;
}
  1. Драйверы устройств Linux - Джонатан Корбет, Алессандро Рубини и Грег Кроа-Хартман
  2. Основные драйверы устройств Linux - Шрикришнан Венкатешваран
  3. Написание драйверов устройств Linux - Джерри Куперштейн
  4. Руководство по программированию модулей ядра Linux - Питер Джей Зальцман, Майкл Буриан, Ори Померанц
  5. Руководство программиста Linux PCMCIA - Дэвид Хиндс
  6. Как программировать SCSI в Linux - Хайко Эйбфельдт
  7. Руководство по последовательному программированию для операционных систем POSIX - Майкл Р.Сладкий
  8. Графические драйверы Linux:введение - Стефан Маршезен
  9. Руководство по программированию драйверов USB-устройств Linux - Детлеф Флигль
  10. Модель устройства ядра Linux - Патрик Мочел

Сеть ядра ( 1 -> 2 -> 3 -> ... )

«Назовите это кланом, назовите это сетью, назовите это племенем, назовите это семьей:Как бы вы это ни называли, кем бы вы ни были, вам это нужно». - Джейн Ховард

Понимание прохождения пакетов в ядре является ключом к пониманию работы сети ядра.Понимание этого необходимо, если мы хотим понять внутреннюю структуру Netfilter или IPSec и многое другое.Двумя наиболее важными структурами сетевого уровня ядра Linux являются: struct sk_buff и struct net_device

static inline int sk_hashed(const struct sock *sk)
{
        return !sk_unhashed(sk);
} 
  1. Понимание внутреннего устройства сети Linux - Кристиан Бенвенути
  2. Сеть ядра Linux:Реализация и теория - Рами Розен
  3. Сетевое программирование UNIX - В.Ричард Стивенс
  4. Полное руководство по сетевому программированию Linux - Кейр Дэвис, Джон В.Тёрнер, Нэйтан Йоком
  5. Стек TCP/IP Linux:Сеть для встраиваемых систем - Томас Ф.Герберт
  6. Программирование сокетов Linux на примере - Уоррен В.Гей
  7. HOWTO по расширенной маршрутизации и управлению трафиком в Linux - Берт Хьюберт

Отладка ядра ( 1 -> 4 -> 9 -> ... )

Если, общаясь с ним, человек не говорит точно, что он имеет в виду, в результате обязательно возникнут проблемы.~Алан Тьюринг о компьютерах

Брайан В.Керниган в статье «Unix for Beginners» (1979) сказал: «Самым эффективным инструментом отладки по-прежнему является тщательное размышление в сочетании с разумным размещением операторов печати».Знание того, что собирать, поможет вам быстро получить нужные данные для быстрой диагностики.Великий ученый-компьютерщик Эдсгер Дейкстра однажды сказал, что тестирование может продемонстрировать наличие ошибок, но не их отсутствие.Хорошая практика проведения расследований должна сочетать необходимость быстрого решения проблем, необходимость развития своих навыков и эффективное использование экспертов в данной области.

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

Видео Лекции по отладке ядра и профилированию, Анализ дампа ядра, Многоядерная отладка с помощью GDB, Управление условиями многоядерной гонки, Отладка электроники

/* Buggy Code -- Stack frame problem
 * If you require information, do not free memory containing the information
 */
char *initialize() {
  char string[80];
  char* ptr = string;
  return ptr;
}

int main() {
  char *myval = initialize();
  do_something_with(myval);
}
/*  “When debugging, novices insert corrective code; experts remove defective code.”
 *     – Richard Pattis
#if DEBUG
 printk("The above can be considered as Development and Review in Industrial Practises");
#endif
 */
  1. Отладка Linux и настройка производительности - Стив Бест
  2. Методы отладки приложений Linux - Аурелиан Мелинте
  3. Отладка с помощью GDB:Отладчик уровня исходного кода GNU - Роланд Х.Пеш
  4. Отладка встроенного Linux - Кристофер Халлинан
  5. Искусство отладки с помощью GDB, DDD и Eclipse - Норман С.Мэтлофф
  6. Почему программы терпят неудачу:Руководство по систематической отладке - Андреас Зеллер
  7. Программный экзорцизм:Руководство по отладке и оптимизации устаревшего кода - Билл Бланден
  8. Отладка:Обнаружение наиболее неуловимых проблем с программным и аппаратным обеспечением - Дэвид Дж.Аганс
  9. Отладка мышлением:Мультидисциплинарный подход - Роберт Чарльз Мецгер
  10. Найдите ошибку:Книга неправильных программ - Адам Барр

Файловые системы ( 1 -> 2 -> 6 -> ... )

«Я хотел иметь виртуальную память, по крайней мере, в сочетании с файловыми системами».-- Кен Томпсон

В системе UNIX все представляет собой файл;если что-то не является файлом, то это процесс, за исключением именованных каналов и сокетов.В файловой системе файл представлен inode, своего рода серийный номер, содержащий информацию о фактических данных, составляющих файл.Виртуальная файловая система Linux VFS кэширует информацию в памяти из каждой файловой системы по мере ее монтирования и использования.Необходимо уделять большое внимание правильному обновлению файловой системы, поскольку данные в этих кэшах изменяются по мере создания, записи и удаления файлов и каталогов.Наиболее важным из этих кэшей является буферный кэш, который интегрирован в способ доступа отдельных файловых систем к своим базовым блочным устройствам хранения.

Видео Лекции по системам хранения, Файловая система, совместимая с Flash

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
        struct open_flags op;
        int fd = build_open_flags(flags, mode, &op);
        struct filename *tmp;

        if (fd)
                return fd;

        tmp = getname(filename);
        if (IS_ERR(tmp))
                return PTR_ERR(tmp);

        fd = get_unused_fd_flags(flags);
        if (fd >= 0) {
                struct file *f = do_filp_open(dfd, tmp, &op);
                if (IS_ERR(f)) {
                        put_unused_fd(fd);
                        fd = PTR_ERR(f);
                } else {
                        fsnotify_open(f);
                        fd_install(fd, f);
                }
        }
        putname(tmp);
        return fd;
}

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
        if (force_o_largefile())
                flags |= O_LARGEFILE;

        return do_sys_open(AT_FDCWD, filename, flags, mode);
}
  1. Файловые системы Linux - Моше Бар
  2. Файловые системы Linux - Уильям фон Хаген
  3. Файловые системы UNIX:Эволюция, проектирование и реализация - Стив Д.Паштет
  4. Практическое проектирование файловой системы - Доминик Джампаоло
  5. Криминалистический анализ файловой системы - Брайан Кэрриер
  6. Иерархия файловой системы Linux - Бинь Нгуен
  7. БТРФС:Файловая система B-дерева Linux - Охад Родех
  8. СтегФС:Стеганографическая файловая система для Linux - Эндрю Д.Макдональд, Маркус Дж.Кун

Безопасность ( 1 -> 2 -> 8 -> 4 -> 3 -> ... )

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

Ни одна техника не работает, если ее не использовать.Этика меняется вместе с технологиями.

"Ф × S = к«Продукт свободы и безопасности является константой.- Законы Нивена

Криптография формирует основу доверия в Интернете.Взлом — это использование средств контроля безопасности на техническом, физическом или человеческом уровне.Защита ядра от других запущенных программ — это первый шаг на пути к безопасной и стабильной системе, но этого явно недостаточно:некоторая степень защиты также должна существовать между различными пользовательскими приложениями.Эксплойты могут быть нацелены на локальные или удаленные службы.

«Свою судьбу невозможно взломать грубой силой… вам нужен черный ход, боковой канал в Жизнь». ― Клайд Дсоуза

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

Видео Лекции по криптографии и сетевой безопасности, Пространства имен для безопасности, Защита от удаленных атак, Безопасный встроенный Linux

env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
  1. Взлом:Искусство эксплуатации - Джон Эриксон
  2. Руткитный арсенал:Побег и уклонение в темных углах системы - Билл Бланден
  3. Взлом раскрыт:Секреты сетевой безопасности - Стюарт МакКлюр, Джоэл Скамбрей, Джордж Курц
  4. Руководство по эксплуатации ядра:Атака на ядро - Энрико Перла, Массимилиано Олдани
  5. Искусство криминалистики памяти - Майкл Хейл Лий, Эндрю Кейс, Джейми Леви, Аарон Уолтерс
  6. Практическое обратное проектирование - Брюс Данг, Александр Газе, Элиас Бачаалани
  7. Практический анализ вредоносного ПО - Майкл Сикорски, Эндрю Хониг
  8. Максимальная безопасность Linux:Руководство хакера по защите вашего Linux-сервера - Анонимный
  9. Безопасность Linux - Крейг Хант
  10. Реальная безопасность Linux - Боб Токсен

Исходный код ядра ( 0.11 -> 2.4 -> 2.6 -> 3.18 )

«Как и вино, мастерство программирования ядра созревает со временем.Но, в отличие от вина, оно при этом становится слаще».--Лоуренс Мучека

Вы можете не думать, что программисты — это художники, но программирование — чрезвычайно творческая профессия.Это творчество, основанное на логике.Образование в области информатики не может сделать никого опытным программистом, так же как изучение кистей и пигментов не может сделать кого-то опытным художником.Как вы уже знаете, есть разница между знанием пути и прохождением пути;Крайне важно засучить рукава и запачкать руки исходным кодом ядра.Наконец, с полученным таким образом ядром знание, куда бы ты ни пошел, ты будешь светить.

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

Видео Лекции по рецептам ядра

linux-0.11
├── boot
│   ├── bootsect.s      head.s      setup.s
├── fs
│   ├── bitmap.c    block_dev.c buffer.c        char_dev.c  exec.c
│   ├── fcntl.c     file_dev.c  file_table.c    inode.c     ioctl.c
│   ├── namei.c     open.c      pipe.c          read_write.c
│   ├── stat.c      super.c     truncate.c
├── include
│   ├── a.out.h     const.h     ctype.h     errno.h     fcntl.h
│   ├── signal.h    stdarg.h    stddef.h    string.h    termios.h
│   ├── time.h      unistd.h    utime.h
│   ├── asm
│   │   ├── io.h    memory.h    segment.h   system.h
│   ├── linux
│   │   ├── config.h    fdreg.h fs.h    hdreg.h     head.h
│   │   ├── kernel.h    mm.h    sched.h sys.h       tty.h
│   ├── sys
│   │   ├── stat.h      times.h types.h utsname.h   wait.h
├── init
│   └── main.c
├── kernel
│   ├── asm.s       exit.c      fork.c      mktime.c    panic.c
│   ├── printk.c    sched.c     signal.c    sys.c       system_calls.s
│   ├── traps.c     vsprintf.c
│   ├── blk_drv
│   │   ├── blk.h   floppy.c    hd.c    ll_rw_blk.c     ramdisk.c
│   ├── chr_drv
│   │   ├── console.c   keyboard.S  rs_io.s
│   │   ├── serial.c    tty_io.c    tty_ioctl.c
│   ├── math
│   │   ├── math_emulate.c
├── lib
│   ├── close.c  ctype.c  dup.c     errno.c  execve.c  _exit.c
│   ├── malloc.c open.c   setsid.c  string.c wait.c    write.c
├── Makefile
├── mm
│   ├── memory.c page.s
└── tools
    └── build.c
  1. Начало для новичков с Исходный код Linux 0.11 (менее 20 000 строк исходного кода).После 20 лет разработки по сравнению с Linux 0.11 Linux стал очень огромным, сложным и трудным для изучения.А вот концепция конструкции и основная конструкция принципиальных изменений не претерпели.Изучение Linux 0.11 по-прежнему имеет важное практическое значение.
  2. Обязательное чтение для хакеров ядра => Linux_source_dir/Documentation/*
  3. Вы должны быть подписаны и активны хотя бы в одном списке рассылки ядра.Начните с новички в ядре.
  4. Вам не нужно читать полный исходный код.Как только вы ознакомитесь с API ядра и его использованием, начните непосредственно с исходного кода интересующей вас подсистемы.Вы также можете начать с написания собственных модулей plug-n-play и экспериментировать с ядром.
  5. Разработчикам драйверов устройств будет полезно иметь собственное специализированное оборудование.Начните с Raspberry Pi.

Проверить Проект Linux Kernel Janitor

«Мы просматриваем исходный код ядра Linux, проводим проверки кода, исправляем необслуживаемый код и выполняем другие очистки и преобразования API.Это хорошее начало для взлома ядра».

Я бы сказал: «Выучите C».:)

Попробуйте эту бесплатную онлайн-книгу.

Руководство по программированию модуля ядра Linux http://www.linuxhq.com/guides/LKMPG/mpg.html

Посетите kernelnewbies.org, подпишитесь на список рассылки Kernelnewbies, зайдите на irc.oftc.org #kernelnewbies

Некоторые ресурсы:

  • Книга:Роберт Лав, Разработка ядра Linux, 3-е издание
  • Книга:Corbet, Rubini, Драйверы устройств Linux, 3-е издание (бесплатная версия) здесь)
  • Книга:Коротко о ядре Linux (бесплатная версия) здесь)
  • Бесплатные материалы предоставлены Свободные электроны
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top