Мені цікаво змінити внутрішню частину ядра, застосувати патчі, обробляти драйвери пристроїв та модулі для власної особистої розваги.
Чи є комплексний ресурс для злому ядра, призначений для досвідчених програмістів?
Мені цікаво змінити внутрішню частину ядра, застосувати патчі, обробляти драйвери пристроїв та модулі для власної особистої розваги.
Чи є комплексний ресурс для злому ядра, призначений для досвідчених програмістів?
Відповіді:
**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
. Читайте насторожено і пам’ятайте: Код - це не література .
Залишилося - це не річ, ані емоція, ані зображення, ані ментальна картина, ані пам'ять, ані ідея. Це функція. Процес якийсь. Аспект Життя, який можна було б описати як функцію чогось «більшого». І тому виявляється, що насправді воно не є «відокремленим» від того чимось іншим. Як і функція ножа - різати щось - насправді не є окремим від самого ножа. Ця функція може бути або не використовується в даний момент, але вона потенційно НІКОЛИ не відокремлена.
Дерадомізований алгоритм Соловай Страссена для тесту на первинність :
Читайте, щоб не суперечити і не плутати; ні вірити і приймати як належне; ні знайти розмови та дискурси; але зважити і врахувати. Деякі книги потрібно скуштувати, інші - проковтнути, а деякі - пожовкнути та перетравити: тобто деякі книги слід читати лише частинами, інші - читати, але не цікаво, а деякі - читати цілком. та з ретельністю та увагою.
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 Kernel полягає у навмисному затуманенні коду, яке використовується разом. Це часто необхідне для того, щоб передати обчислювальний зміст, що включає дві або більше операцій, чисто і елегантно. Особливо це стосується написання коду для багатоядерної архітектури.
Відео Лекції по системам реального часу , завдання календарного планування , стиснення пам'яті , бар'єри пам'яті , SMP
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
Драйвери пристроїв Linux (1 -> 2 -> 4 -> 3 -> 8 -> ...)
"Музика не веде вас із собою. Ви повинні суворо переносити її завдяки своїй здатності дійсно просто зосередитись на тому маленькому маленькому ядрі емоцій чи історії". - Деббі Гаррі
В основному ваше завдання - встановити високошвидкісний комунікаційний інтерфейс між апаратним пристроєм та ядром програмного забезпечення. Ви повинні ознайомитись з довідковою таблицею / посібником з технічним обладнанням, щоб зрозуміти поведінку пристрою, його стан та стан даних, а також надані фізичні канали. Знання складання для вашої конкретної архітектури та неабияке знання апаратних засобів VLSI Опис таких мов, як VHDL або Verilog допоможуть вам у довгостроковій перспективі.
З : Але чому я повинен читати технічні характеристики?
Відповідь : Тому що "існує прірва вуглецю та кремнію, яке програмне забезпечення не може подолати" - Рахул Соннад
Однак вищевикладене не створює проблем для обчислювальних алгоритмів ( код драйвера - обробка в нижній половині ), оскільки його можна повністю імітувати на універсальній машині Тьюрінга . Якщо обчислений результат справедливий у математичній області , це впевненість, що він також відповідає фізичній області .
Відео лекції про драйвери пристроїв Linux (Lec. 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 -> 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 -> 4 -> 9 -> ...)
Якщо в спілкуванні з нею не сказано точно, що означає, неприємності можуть бути наслідком. ~ Алан Тьюрінг, про комп'ютери
Брайан В. Керніган у статті Unix для початківців (1979) сказав: "Найефективнішим інструментом налагодження все ще є ретельна думка, поєднана з розумно розміщеними заявами про друк". Знання, що збирати, допоможе швидко отримати потрібні дані для швидкої діагностики. Великий комп'ютерний вчений Едсгер Дайкстра одного разу сказав, що тестування може продемонструвати наявність помилок, але не їх відсутність. Хороша практика розслідування повинна врівноважувати необхідність швидкого вирішення проблем, необхідність формування своїх навичок та ефективного використання експертів з предметів.
Бувають випадки, коли ти стикаєшся низового боку, начебто нічого не працює, і у тебе не вистачає всіх варіантів. Тоді починається справжня налагодження. Помилка може забезпечити перерву, яку потрібно відключити від фіксації неефективного рішення.
Відео Лекції по Kernel Debug і профілювання , дампи пам'яті , аналізу , Multicore Налагодження з допомогою GDB , контролінг Багатоядерні Race Умови , налагодження електроніки
/* 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 -> 2 -> 6 -> ...)
"Я хотів мати віртуальну пам'ять, принаймні, як це поєднано з файловими системами". - Кен Томпсон
У системі UNIX все є файлом; якщо щось не є файлом, це процес, за винятком названих труб та розеток. У файловій системі файл представлений inode
, своєрідним серійним номером, що містить інформацію про фактичні дані, що складають файл. Віртуальна файлова система Linux VFS
зберігає інформацію в пам'яті кожної файлової системи під час її встановлення та використання. Необхідно бути обережним для правильного оновлення файлової системи, оскільки дані в цих кешах змінюються, коли файли та каталоги створюються, записуються та видаляються. Найважливішим із цих кешів є буферний кеш, який інтегрований у спосіб, коли окремі файлові системи отримують доступ до своїх базових блоків зберігання даних.
Відео лекції про системи зберігання даних , файлова система Flash Friendly
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 -> 2 -> 8 -> 4 -> 3 -> ...)
"UNIX не був розроблений для того, щоб перешкоджати користувачам робити дурні речі, оскільки це також заважало їм робити розумні речі". - Дуг Гвін
Жодна техніка не працює, якщо вона не використовується. Етика змінюється з використанням технології.
" F × S = k " продукт свободи та безпеки є постійною. - Закони Нівен
Криптографія складає основу довіри до Інтернету. Злом - це використання контролю безпеки будь-якого технічного, фізичного чи людського елемента. Захист ядра від інших запущених програм - це перший крок до надійної та стабільної системи, але цього, очевидно, недостатньо: певний ступінь захисту повинен існувати і між різними програмами user-land. Експлоатація може орієнтуватися на місцеві або віддалені служби.
"Ви не можете зламати свою долю, грубу силу ... вам потрібна задня дверцята, бічний канал у життя". - Клайд Дуза
Комп’ютери не вирішують проблем, вони виконують рішення. За кожним недетермінованим алгоритмічним кодом стоїть рішучий розум. - / var / log / dmesg
Відео лекції з криптографії та мережевої безпеки , простори імен для безпеки , захист від віддалених атак , захищений вбудований Linux
env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
Джерело ядра (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_source_dir/Documentation/*
Linux Kernel Newbies - чудовий ресурс.
Я пропоную вам прочитати " Ядро Linux у двох словах ", Грег Кроах-Хартман та " Розуміння ядра Linux ", Роберт Лав. Обов’язково читає :)
Ще один хороший ресурс - драйвери пристроїв Linux . Це дало б вам інший спосіб потрапити у внутрішні розробки. З передмови:
Це, на перший погляд, книга про написання драйверів пристроїв для системи Linux. Це, звичайно, гідна мета; Потік нових апаратних продуктів швидше за все не сповільниться, і комусь доведеться змусити всі ці нові гаджети працювати з Linux. Але ця книга також про те, як працює ядро Linux та як адаптувати його роботи до ваших потреб чи інтересів. Linux - це відкрита система; ця книга, ми сподіваємось, вона є більш відкритою та доступною для більшої спільноти розробників.
Див. Документаційний проект Linux . Зокрема, "посібник з модуля ядра Linux".
Linux Kernel 2.4 Internals - ще один Інтернет-ресурс, на який слід звернути увагу. Схоже, використовується досить «заземлений» підхід, починаючи з завантаження. Тут TOC:
І, щоб зробити його ще солодшим, є нове третє видання Linux Kernel Development від Роберта Лава, і Slashdot має огляд.
Почніть з Linux Kernel Primer від Клаудії Зальцберг та ін. Добре почати з початківців. Книга Роберта Лава, безумовно, не та книга, з якої слід починати початківцям. Пізніша книга вище середнього рівня.