Вопрос или проблема
Я интересуюсь модификацией внутренностей ядра, применением патчей, работой с драйверами устройств и модулями, для собственного удовольствия.
Существует ли исчерпывающий ресурс по хакерству ядра, предназначенный для опытных программистов?
**TODO** +editPic: Разработчик ядер Linux -> (Кольцевой уровень 0)
+addSection: Ядро виртуализации
KERN_WARN_CODING_STYLE: Не используйте циклы, если вы не можете обойтись без них.
Рекомендуемые книги для Неинициализированный
void *i
“Люди не понимают книги, пока у них нет определенного жизненного опыта, или, по крайней мере, ни один человек не понимает глубокую книгу, пока он не увидит и не проживет хотя бы часть ее содержания”. –Эзра Паунд
Путешествие в тысячу кодомиль должно начинаться с одного шага. Если вы не уверены, с какой из следующих книг начать, не переживайте, выберите любую на свой выбор. Не все, кто блуждают, потеряны. Поскольку все дороги в конечном итоге соединяются с шоссе, вы будете исследовать новые вещи в своем путешествии по ядру, пока страницы движутся без тупиков, и в конечном итоге соединитесь с код-набором
. Читайте с настороженным умом и помните: Код – это не литература.
То, что осталось, не является вещью, эмоцией или изображением, или ментальным образом, или памятью, или даже идеей. Это функция. Процесс некоторого рода. Аспект жизни, который можно описать как функцию чего-то “большего”. И, следовательно, кажется, что это не “отдельно” от этого чего-то другого. Как функция ножа – резать что-то – на самом деле не отделена от самого ножа. Функция может быть использована, а может и не быть в данный момент, но она потенциально НИКОГДА не отделяется.
Solovay Strassen Дерандомизированный алгоритм для тестирования на простоту:
Читать не для того, чтобы противоречить и оспаривать; иначе не верить и не принимать на веру; и не для того, чтобы находить разговоры и дискуссии; а для того, чтобы взвешивать и размышлять. Некоторые книги нужно пробовать на вкус, другие следует проглотить, а некоторые немногие следует разжевать и переварить: то есть некоторые книги читают только частями, другие читают, но не любопытно, а некоторые немногие читают целиком, и с усердием и вниманием.
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, прежде чем погружаться в ядро. Вы также должны иметь хороший опыт работы со связанными списками, стековыми структурами, очередями, красно-черными деревьями, хеш-функциями и т.д.
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 заключаются в преднамеренном запутывании кода. Это часто необходимо для передачи вычислительного смысла, включающего две или более операции в чистом и элегантном виде. Это особенно верно при написании кода для многопроцессорной архитектуры.
Видеолекции по системам реального времени, Планирование задач, Сжатие памяти, Барьер памяти, SMP
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
- Разработка ядра Linux – Роберт Лав
- Понимание ядра Linux – Дэниел П. Бовет, Марко Чезати
- Искусство проектирования ядра Linux – Ян Ликсян
- Профессиональная архитектура ядра Linux – Вольфганг Маурер
- Проектирование операционной системы UNIX – Морис Дж. Бах
- Понимание менеджера виртуальной памяти Linux – Мел Горман
- Внутренности ядра Linux – Тигран Айвазян
- Введение в встроенный Linux – Кристофер Холлинан
Драйверы устройств Linux ( 1 -> 2 -> 4 -> 3 -> 8 -> … )
“Музыка не уносит вас. Вы должны нести её строго в соответствии с вашей способностью действительно сосредоточиться на этом маленьком зародыше эмоции или истории”. — Дебби Хэри
Ваша задача в основном заключается в установлении высокоскоростного коммуникационного интерфейса между аппаратным устройством и программным ядром. Вам следует прочитать справочную документацию по аппаратному обеспечению, чтобы понять поведение устройства и его состояния управления и данных, а также предоставленные физические каналы. Знание ассемблера для вашей архитектуры и разумное понимание языков описания аппаратного обеспечения VLSI, таких как VHDL или Verilog, поможет вам в долгосрочной перспективе.
- Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32
- Справочное руководство по архитектуре ARM
- Руководство разработчика ARM System
Вопрос: Но почему я должен читать спецификации оборудования?
Ответ: Потому что, “Существует пропасть углерода и кремния, которую программное обеспечение не может перекрыть” – Рахул Соннад
Тем не менее, вышеизложенное не создает проблем для Вычислительных алгоритмов (Код драйвера – обработка нижнего уровня), так как его можно полностью смоделировать на Универсальной машине Тьюринга. Если вычисленный результат правдив в математической области, это свидетельствует о том, что он также будет верен в физической области.
Видеолекции по драйверам устройств 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; /* Это не может быть у нас. */
/* Шина MDIO не может быть записана в контексте прерывания,
* поэтому мы должны отключить прерывание здесь. Рабочая очередь
* будет записывать PHY, чтобы отключить и очистить
* прерывание, а затем заново включит линию прерывания.
*/
disable_irq_nosync(irq);
atomic_inc(&phydev->irq_disable);
queue_work(system_power_efficient_wq, &phydev->phy_queue);
return IRQ_HANDLED;
}
- Драйверы устройств Linux – Джонатан Корбет, Алессандро Рубини и Грег Кроах-Хартман
- Основные драйверы устройств Linux – Шрикиршнан Венкатесваран
- Написание драйверов устройств для Linux – Джерри Куперстайн
- Руководство по программированию модулей ядра Linux – Петер Джей Сальцман, Майкл Буриан, Ори Померанц
- Руководство для программистов PCMCIA Linux – Дэвид Хиндс
- Руководство по программированию SCSI для Linux – Хайко Эйбфельдт
- Руководство по сериализации для ОС POSIX – Майкл Р. Свифт
- Драйверы графики Linux: введение – Стефан Маршесин
- Руководство по программированию драйверов USB для Linux – Детлеф Флигел
- Модель устройства ядра 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);
}
- Понимание сетевых внутренних систем Linux – Кристиан Бенвенути
- Сетевое взаимодействие ядра Linux: реализация и теория – Рами Розен
- Программирование сетей UNIX – У. Ричард Стивенс
- Окончательное руководство по программированию сетей Linux – Кейр Дэвис, Джон W. Тёрнер, Натан Йоком
- Стек TCP/IP Linux: сетевое взаимодействие для встроенных систем – Томас Ф. Херберт
- Программирование сокетов Linux на примере – Уоррен В. Гей
- Расширенная маршрутизация для Linux и контроль трафика HOWTO – Берт Хуберт
Отладка ядра ( 1 -> 4 -> 9 -> … )
Если при взаимодействии с ним не сказать точно, что имеешь в виду, будет неизбежно возникновение проблем. ~Алан Тьюринг о компьютерах
Брайан У. Керниган в статье “Unix для начинающих” (1979) сказал: “Самый эффективный инструмент отладки все еще представляет собой внимательное размышление, дополненное разумно размещенными операторами вывода”. Зная, что собирать, вы сможете быстро получить правильные данные для быстрой диагностики. Великий ученый-компьютерщик Эдсгер Дейкстра как-то сказал, что тестирование может продемонстрировать наличие ошибок, но не их отсутствие. Хорошие практики расследования должны сбалансировать необходимость быстро решать проблемы, необходимость развивать свои навыки и эффективное использование экспертов в данной области.
Бывают моменты, когда вы достигаете дна, ничего не кажется работающим, и у вас исчерпаны все варианты. Именно тогда начинается настоящая отладка. Ошибка может предоставить вам возможность освободиться от зацикленности на неэффективном решении.
Видеолекции по отладке и профилированию ядра, Анализ дампов ядра, Отладка многопроцессорных систем с помощью GDB, Контроль состояния гонки многопроцессорных систем, Отладка электроники
/* Ошибочный код -- Проблема стекового кадра
* Если вам требуется информация, не освобождайте память, содержащую эту информацию
*/
char *initialize() {
char string[80];
char* ptr = string;
return ptr;
}
int main() {
char *myval = initialize();
do_something_with(myval);
}
/* “При отладке новички вставляют исправляющий код; эксперты удаляют дефектный код.”
* – Ричард Паттис
#if DEBUG
printk("Вышеупомянутое можно считать разработкой и рецензированием в промышленных практиках");
#endif
*/
- Отладка и настройка производительности в Linux – Стив Бест
- Техники отладки приложений Linux – Аурелиан Мелинте
- Отладка с помощью GDB: отладчик исходного кода GNU – Роланд Х. Пеш
- Отладка встроенного Linux – Кристофер Холлинан
- Искусство отладки с помощью GDB, DDD и Eclipse – Норман С. Матлофф
- Почему программы терпят неудачу: руководство по систематической отладке – Андреас Зеллер
- Экзорцизм программного обеспечения: справочник по отладке и оптимизации унаследованного кода – Билл Блунден
- Отладка: поиск наиболее ускользающих программных и аппаратных проблем – Дэвид Дж. Аґанс
- Отладка с помощью мышления: многопрофильный подход – Роберт Чарльз Мецгер
- Найдите баг: книга некорректных программ – Адам Барр
Файловые системы ( 1 -> 2 -> 6 -> … )
“Я хотел бы иметь виртуальную память, по крайней мере в контексте файловых систем”. — Кен Томпсон
На системе UNIX все является файлом; если что-то не является файлом, это процесс, за исключением именованных труб и сокетов. В файловой системе файл представлен inode
, своего рода серийным номером, содержащим информацию об актуальных данных, составляющих файл. Виртуальная файловая система Linux VFS
кэширует информацию в памяти из каждой файловой системы во время ее монтирования и использования. Нужно проявлять много осторожности при правильном обновлении файловой системы, поскольку данные внутри этих кэшей модифицируются, когда создаются, записываются или удаляются файлы и директории. Наиболее важный из этих кэшей – это Кэш буферов, который интегрируется в способ доступа отдельных файловых систем к их базовым блоковым устройствам хранения.
Видеолекции по системам хранения, Файловая система, дружелюбная к флэш-памяти
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);
}
- Файловые системы Linux – Моше Бар
- Файловые системы Linux – Уильям фон Хаген
- Файловые системы UNIX: эволюция, проектирование и реализация – Стив Д. Пейт
- Практическое проектирование файловых систем – Доминик Джампаоло
- Анализ судебно-экспертной работы файловых систем – Брайан Кэрри
- Иерархия файловой системы Linux – Бин Нгуен
- BTRFS: Файловая система B-tree для Linux – Охад Родех
- StegFS: Стеанографическая файловая система для Linux – Эндрю Д. Макдональд, Маркус Г. Кун
Безопасность ( 1 -> 2 -> 8 -> 4 -> 3 -> … )
“UNIX не был спроектирован, чтобы останавливать своих пользователей от совершения глупостей, так как это также могло бы остановить их от выполнения умных вещей”. — Даг Гуин
Никакая техника не работает, если она не используется. Этические нормы со временем меняются.
“F × S = k” произведение свободы и безопасности является постоянной величиной. – Законы Нивена
Криптография составляет основу доверия в Интернете. Хакерство – это использование уязвимостей в системах безопасности, будь то технический, физический или человеческий элемент. Защита ядра от других работающих программ является первым шагом к созданию безопасной и стабильной системы, но этого явно недостаточно: определенный уровень защиты должен также существовать между различными пользовательскими приложениями. Уязвимости могут нацеливаться как на локальные, так и на удаленные сервисы.
“Вы не можете сломать свою судьбу, груба сила… вам нужна потайная дверь, побочный канал в жизнь.”
― Клайд ДсузаКомпьютеры не решают проблемы, они выполняют решения. За каждым недетерминированным алгоритмическим кодом стоит определенный разум.
— /var/log/dmesg
Видеолекции по криптографии и сетевой безопасности, Пространства имен для безопасности, Защита от удаленных атак, Безопасный встроенный Linux
env x='() { :;}; echo уязвимый' bash -c "echo это тест для Shellsock"
- Хакерство: искусство эксплуатации – Джон Эриксон
- Арсенал руткитов: побег и уклонение в мрачных уголках системы – Билл Блунден
- Хакерство раскрыто: секреты сетевой безопасности – Стюарт МакКлур, Джоэл Скамбрай, Джордж Курц
- Руководство по эксплуатации ядра: атака на ядро – Энрико Перла, Массимилиано Ольдани
- Искусство судебной медицины: выявление – Майкл Хейл Лай, Эндрю Кейс, Джейми Леви, Аарон Уолтерс
- Практическое реверс-инжиниринг – Брюс Дэнг, Александр Газет, Элиас Бахаалани
- Практический анализ вредоносных ПО – Майкл Сикорски, Эндрю Хониг
- Максимальная безопасность Linux: руководство хакера по защите вашего сервера Linux – Аноним
- Безопасность Linux – Крейг Хант
- Безопасность 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
- Начинающие могут начать с исходного кода Linux 0.11 (менее 20,000 строк исходного кода). По прошествии 20 лет разработки, по сравнению с Linux 0.11, Linux стал очень большим, сложным и трудным для изучения. Однако концепция проектирования и основная структура не претерпели революционных изменений. Изучение Linux 0.11 по-прежнему имеет важное практическое значение.
- Обязательное чтение для хакеров ядра =>
Linux_source_dir/Documentation/*
- Вы должны быть подписаны на как минимум один почтовый список ядра и быть активными в нем. Начните с новичков ядра.
- Не нужно читать весь исходный код. Как только вы станете знакомы с API ядра и его использованием, прямо переходите к исходному коду подсистемы, которой вы интересуетесь. Также можно начать с написания собственных модулей plug-n-play для экспериментов с ядром.
- Авторы драйверов устройств выиграют, если у них будет собственное специализированное оборудование. Начните с Raspberry Pi.
Linux Kernel Newbies – отличный ресурс.
Я предлагаю вам прочитать “Ядро Linux в одной книге“, Грега Кроах-Хартмана и “Понимание ядра Linux“, Роберта Лава. Обязательно к прочтению 🙂
Драйверы устройств Linux – еще один хороший ресурс. Это даст вам возможность узнать о внутреннем устройстве. Из предисловия:
Это, на первый взгляд, книга о написании драйверов устройств для системы Linux. Это достойная цель, конечно; поток новых аппаратных продуктов, скорее всего, не замедлится в ближайшее время, и кто-то должен будет заставить все эти новые гаджеты работать с Linux. Но эта книга также о том, как работает ядро Linux и как адаптировать его работу под ваши нужды или интересы. Linux – это открытая система; с помощью этой книги мы надеемся, что она станет более открытой и доступной для более широкой аудитории разработчиков.
Смотрите Проект документации Linux. Особенно “Руководство по модулям ядра Linux”.
Внутренности ядра Linux 2.4 – еще один онлайн ресурс для изучения. Похоже, он принимает довольно “основополагающий” подход, начиная с загрузки. Вот содержание:
- Загрузка
- 1.1 Построение образа ядра Linux
- 1.2 Загрузка: Обзор
- 1.3 Загрузка: BIOS POST
- 1.4 Загрузка: загрузочный сектор и настройка
- 1.5 Использование LILO в качестве загрузчика
- 1.6 Высокоуровневая инициализация
- 1.7 Загрузка SMP на x86
- 1.8 Освобождение данных и кода инициализации
- 1.9 Обработка командной строки ядра
- Управление процессами и прерываниями
- 2.1 Структура задачи и таблица процессов
- 2.2 Создание и завершение задач и потоков ядра
- 2.3 Планировщик Linux
- 2.4 Реализация связного списка в Linux
- 2.5 Очереди ожидания
- 2.6 Таймеры ядра
- 2.7 Нижние половины
- 2.8 Очереди задач
- 2.9 Задачеты
- 2.10 Softirqs
- 2.11 Как реализованы системные вызовы на архитектуре i386?
- 2.12 Атомарные операции
- 2.13 Спинлоки, спинлоки чтения-записи и большие спинлоки для читателей
- 2.14 Семафоры и семафоры чтения/записи
- 2.15 Поддержка ядра для загрузки модулей
- Виртуальная файловая система (VFS)
- 3.1 Кэши inode и взаимодействие с Dcache
- 3.2 Регистрация/аннулирование файловой системы
- 3.3 Управление дескрипторами файлов
- 3.4 Управление структурой файла
- 3.5 Управление суперблоком и точкой монтирования
- 3.6 Пример виртуальной файловой системы: pipefs
- 3.7 Пример файловой системы диска: BFS
- 3.8 Домен выполнения и бинарные форматы
- Кэш страниц Linux
- Механизмы IPC
- 5.1 Семафоры
- 5.2 Очереди сообщений
- 5.3 Общая память
- 5.4 Примитивы IPC в Linux
И, чтобы сделать это еще более сладким, вышло новое издание “Разработка ядра Linux” третьего издания от Роберта Лава и Slashdot имеет обзор.
Начните с “Введения в ядро Linux” Клаудии Сальцберг и др. Хорошая книга для начинающих. Книга Роберта Лава определенно не та, с которой стоит начинать новичкам. Вторая книга выше уровня среднего.
Ответ или решение
Изучение внутренностей ядра Linux может быть напряженным занятием, однако с правильными ресурсами и подходом вы сможете опередить своих соперников на этом пути. Вот детальное руководство и рекомендации для начинающих, которые хотят углубиться в модификацию ядра, применение патчей и работу с устройствами.
Рекомендуемая литература
-
Основная литература по ядру Linux:
- "Linux Kernel Development" – Роберт Лав (Robert Love). Эта книга является отличным ресурсом для понимания структуры и работы ядра Linux, однако рекомендуется не только новичкам, но и опытным программистам.
- "Understanding the Linux Kernel" – Даниэль П. Бовет и Марко Чезати. Прекрасная книга, которая охватывает основные структуры данных и механизмы ядра.
-
Книги о разработке драйверов:
- "Linux Device Drivers" – Джонатан Корбет, Алессандро Рубини и Грег Кроах-Хартман. Это классический справочник, который не только обучает написанию драйверов, но и объясняет, как работает ядро с аппаратным обеспечением.
- "Linux Kernel Module Programming Guide" – Питер Джей Сальцман. Полезный ресурс для изучения создания модулей ядра.
-
Специальные области:
- "Understanding the Linux Virtual Memory Manager" – Мел Горман. Эта книга охватывает тему управления памятью, один из ключевых аспектов работы ядра.
- "The Linux TCP/IP Stack" – Томас Ф. Херберт. Подробно рассматривает структуру сетевого стека в Linux.
Онлайн-ресурсы
- Linux Kernel Newbies – ресурс, предназначенный для новичков в мире разработки ядра Linux. Здесь вы найдете обучающие материалы, документацию и полезные ссылки.
- The Linux Documentation Project – активно поддерживаемая документация сообщества Linux.
Учебные видео
Существует множество видеолекций, которые могут помочь вам в изучении:
Начальный подход к обучению
-
Убедитесь, что у вас уровень программирования C:
Программирование на C является основным для понимания ядра Linux, так как оно написано на этом языке. Убедитесь, что вы знакомы с такими понятиями, как указатели, структуры и управление памятью. -
Загрузите и исследуйте исходный код ядра:
Скачайте последнюю версию исходного кода ядра с официального сайта kernel.org. Начните с простых задач, таких как создание и загрузка модулей. -
Исследуйте в реальном оборудовании:
При написании драйверов для устройств желательно иметь доступ к выделенному оборудованию. Например, Raspberry Pi будет отличной отправной точкой для экспериментов.
Заключение
Погружение в ядро Linux — это длинный и увлекательный путь, который требует терпения и настойчивости. С правильной литературой, онлайн-ресурсами и практикой вы сможете достичь значимых успехов. Не стесняйтесь задавать вопросы на форумах и участвовать в обсуждениях, это значительно ускорит ваш процесс обучения.