Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > рвопос про исходники ядра linux


Автор: vadim90 11.9.2009, 13:33
прошу помочь мне в изучении исходников ядра linux.

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

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

Автор: andrew_121 11.9.2009, 14:02
Цитата(vadim90 @  11.9.2009,  13:33 Найти цитируемый пост)
Не могу найти откуда ж собственно начать читать сырцы ядра

зависит от того что нужно тебе.

Автор: vadim90 11.9.2009, 14:13
я хочу изучить весь процесс работы ядра

Автор: andrew_121 11.9.2009, 14:36
Цитата(vadim90 @  11.9.2009,  14:13 Найти цитируемый пост)
я хочу изучить весь процесс работы ядра 

 smile думаешь успеешь?(до старости). Ты хоть представляешь сколько там строк кода? Хоть приблизительно?

Автор: vadim90 11.9.2009, 14:41
andrew_121, представляю, если тебе нечего говорить по делу, то не пиши  тут, пиши в личку, там обсудим

Автор: смерш 11.9.2009, 14:56
Цитата(vadim90 @ 11.9.2009,  14:13)
я хочу изучить весь процесс работы ядра

Ну так начни с процесса загрузки : 
http://duartes.org/gustavo/blog/post/kernel-boot-process
Работу всех подсистем ядра знают во всём мире человек 5 отсилы  smile  
Поэтому все разработчики ядра специализируются на конкретной подсистеме или даже её части (это к /net например относится).
Из подсистем для того чтобы начать можно выбрать /mm. Во всяком случае там хоть что-то понять можна, и литературы достаточно по ней тоже. Хотя бы:
Gorman M. — Understanding the Linux Virtual Memory Manage.
Вобще имхо без серьёзного опыта в программировании лезть в ядро не стоит (по себе сужу). 

Автор: vadim90 11.9.2009, 15:04
смерш благодарю за ответ, спасибо

опыт есть, достаточно большой на С. придется постигнуть еще asm

Автор: vadim90 11.9.2009, 17:40
тоже неплохая статья о процессе загрузки linux

http://www.ibm.com/developerworks/ru/library/l-linuxboot/

там написано: "...вызывается функцияstart_kernelиз(init/main.c), которая осуществляет переход в ту часть ядра Linux, которая не зависит от особенностей конкретной аппаратной платформы. Можно сказать, что это функция main для ядра Linux."

так вот хочу понять, в коде исходников ядра есть функция main или же нет???
как же тогда GNU gcc компилирует исходники???

Автор: Pointer 11.9.2009, 20:11
Cпецом по ядру не являюсь, но на мой взгляд сразу в "большое ядро" лезть не стоит, возми что-нибудь поменьше)

Таненбаум Э.,Вудхалл А.Операционные системы.Разработка и реализация.3-е изд.

minix, linux первые версии ядра(на фтп кернел.орг, папка historic)...смотри исходники.

Автор: смерш 11.9.2009, 20:21
Цитата(vadim90 @ 11.9.2009,  17:40)
тоже неплохая статья о процессе загрузки linux

http://www.ibm.com/developerworks/ru/library/l-linuxboot/

там написано: "...вызывается функцияstart_kernelиз(init/main.c), которая осуществляет переход в ту часть ядра Linux, которая не зависит от особенностей конкретной аппаратной платформы. Можно сказать, что это функция main для ядра Linux."

так вот хочу понять, в коде исходников ядра есть функция main или же нет???

Простые программы работают в окружении хоста , который предоставляет ей все необходимые сервисы. Т.е. gcc предоставляет все необходимые библиотеки и ф-ции и в свою очередь ядро предоставляет все необходимые сервисы gcc, который тоже работает в его окружении. В этом окружении начальная точка выполнения находится в ф-ции main().
А ядро работает в своём собственномhttp://publications.gbdirect.co.uk/c_book/preface/hosted_and_free_standing.html.  Поэтому никаких main() тут и нет.  В общем это забота загрузчика, загрузить образ и сделать jump на точку входа... А дальше всё есть по ссылке в первом посте.

Цитата

как же тогда GNU gcc компилирует исходники???

это уже надо лазить по мэйкфайлам, мой интерес пока дотуда ещё недобрался, если вобще когда нибудь доберётся.
Но если интересно то тут есть доки по ним Documentations/kbuild/



Автор: MAKCim 11.9.2009, 21:24
загрузку изучать в таком порядке
startup_32 (head_32.S) -> i386_start_kernel (head32.c) -> start_kernel (init/main.c)

в обязательном порядке смотреть linux/init.h, а именно во что разворачиваются макросы *_initcall в зависимости от MODULE (это даст представление о том, каким образом реализуется возможность сборки некоторых частей ядра статически и динамически (в виде модулей))

изучение любой подсистемы начинается с __init функции
пример - sock_init из net/socket.c

Добавлено через 9 минут и 31 секунду
Цитата(vadim90 @  11.9.2009,  17:40 Найти цитируемый пост)
так вот хочу понять, в коде исходников ядра есть функция main или же нет???

есть start_kernel как аналог main

к слову говоря, до main в обыычной программе выполняется куча кода libc
применительно к ядру этой кучей является все, что выполняется до start_kernel


Цитата(vadim90 @  11.9.2009,  17:40 Найти цитируемый пост)
как же тогда GNU gcc компилирует исходники??? 

очень просто
сама компиляция не требует наличия какй-либо точки входа типа main в обычной программе
в процессе компиляции создаются объектные файлы
дальше они подаются на вход компоновщику, который собирает целевой файл
применительно к ядру, например для x86_64, в arch/x86/kernel/vmlinux.lds.S находится скрипт компоновщика, в котором записаны соответствия между входными и выходными секциями
по нему ld собирает статический образ ядра
дальше в arch/x86/boot/compressed/Makefile описан процесс сборки bzImage из полученного статического образа


Автор: vadim90 11.9.2009, 21:37
Pointer, смерш, MAKCim преогромное спасибо


Автор: MAKCim 11.9.2009, 21:57
vadim90
компилятор ничего не ищет, он компилирует, т. е создает объектные файлы
дальше работает ld
он создает нужный тип выходного файла используя один из скриптов (в зависимости от нужного типа)
вместе с объектником самой программы статически линкуется еще ряд объектников, в частности crt1.o из /usr/lib или /usr/lib64
в этом объектнике используется ссылка на символ main
так как он линкуется с программой статически, то ld должен найти main среди символом всех входных объекников

при сборке ядра после компиляции ld просто выполняет другие скрипты и линкует дрк\угие объектники, где main в явном и неявном виде не используется
отсюда нет необходимости в его наличии

Автор: vadim90 12.9.2009, 18:59
Друзья, проведя 2 дня за изучением загрузочных кодов и чтением статей (кстати, нашел подробную статью http://linuxportal.ru/entry.php/1506_0_3_0_C/) я пока понял основной алгоритм что и как. Конкретно в данной статье говорится что и как. Меня мучает один вопрос, по-сути, чтоб там разобраться, надо знать аппаратуру на высоком уровне, как и что тестировать и т.д. Ведь кто то этот код писал, придумывал что и в какой последовательности тестировать, включать, вот, и получается так, что это просто надо знать. Может кто подскажет что читать (кроме про проц), каким образом что и как инициализируется, по каким адресам и т.д.

Автор: bsa 13.9.2009, 08:32
vadim90, если не секрет, зачем тебе это? У тебя что-то не работает и ты хочешь сам устранить проблему? Имхо, быстрее будет, если ты баг-репорт отправишь.
Если ты хочешь стать разработчиком ядра, то для этого совсем не обязательно знать полностью его устройство. Так как ты вряд ли будешь переписывать его архитектуру.

Автор: MAKCim 13.9.2009, 08:54
поддерживаю bsa, какая цель?
если "просто так", то мотивация пропадет быстро ;)
нужна некая проблема, тогда поиск ее решения даст ответы на вопросы

Автор: vadim90 13.9.2009, 09:21
нее, ребят, вы ошибаетесь, цель глобальна, понять все это

Автор: GrayCardinal 13.9.2009, 12:46
Рекомендую начать с простого smile
Linux Device Driver 3 (ldd3)

Добавлено через 43 секунды
http://lwn.net/Kernel/LDD3/

Автор: vadim90 13.9.2009, 13:58
GrayCardinal, спасибо

Автор: смерш 13.9.2009, 16:11
Цитата(vadim90 @ 13.9.2009,  09:21)
нее, ребят, вы ошибаетесь, цель глобальна, понять все это

Действительно непонятно какую цель ты преследуешь. Если хочешь стать разработчиком ядра, то ты идёшь по неправильному пути, в конце концов ты просто сломаешься от потока информации которая никак у тебя не будет связываться в общую картину. Под большим опытом в программировании я имел именно это в виду, т.е. опыт работы с ОГРОМНЫМИ проектами, а не владение в совершенстве С. Мотивация как сказал Максим пройдёт ОЧЕНЬ быстро, если ты будешь только читать книги/исходники. Я по этому пути уже прошёл, практически с нулевым результатом на выходе. Это после полугода скитания по всему ядру в надежде что вот вот зацеплюсь за что-то и начну уже писать, хотя никаких попыток для этого и не делал...
В общем рекомендую тебе оставить загрузку (на время хотя бы), бородатым хакерам  smile .
Изучи:
1. обработку прерываний, исключений, softirq, тасклеты и т.д.
2. синхронизацию в ядре
3. управление памятью
и далее выбери подсистему которая тебя больше всего интересует, подпишись на рассылку по ней на http://vger.kernel.org , читай баги на http://bugzilla.kernel.org и пробуй ПИСАТЬ.
Ну или если хочеш писать драйвера то читать LDD + опять же ПИСАТЬ.
Из книг на первом месте:
Ядро Linux. Бовет/Чезати.
Ещё книги:
Professional Linux Kernel Architecture
The Linux Networking Architecturе
Understanding Linux Network Internals
Essential Linux Device Drivers
Linux Kernel in a Nutshell
Всё, smile . 


Автор: vadim90 13.9.2009, 16:23
смерш, спасибо преогромное за все, я поступлю по твоим советам, потому что ты прав. Спасибо!

Автор: Remiznik 13.9.2009, 18:00
я вот хотел бы разобраться с внутреним строением ядра чтоб оптимизировать его под свои нужды ) тоесть не переписывать а бонально отключить то что мне не нужно то чем я не буду пользоваться а для этого мне кажеться неплохо было знать усстройство ядра )

и чтобы вы мне посоветовали почитать ?

Автор: bsa 13.9.2009, 19:43
Remiznik, а ты зайди в конфигуратор ядра и вдумчиво читай описание каждого пункта. Думаю, тебе в большинстве случаев не составит труда отключить лишнее (в крайнем случае, можно сделать модулем многое) или выбрать подходящую именно тебе настройку.

Автор: vadim90 14.9.2009, 16:23
может кому пригодится перевод LDD http://www.nclug.ru/wiki/index.php?page=knz_ldd2

Автор: GrayCardinal 14.9.2009, 18:52
vadim90
ldd, вторая, да еще и русская... Хм  smile 

Автор: cupper 24.9.2009, 10:43
vadim90 если в процессе изучения кода ядра найдешь участки кода отвечающие за начальную загрузку молулей, скинь плиз инфу эту в личку, а то ищу но пока немогу найти.

Автор: kirjanov 4.10.2009, 12:51
Действительно, один из лучших способов что-либо начать делать для ядра - пытаться фиксить баги, которые появляются на http://bugzilla.kernel.org. Конечно, это достаточно сложная задача, потому что она требует хорошего понимания того, что же собственно случилось и как это примерно работает (хорошо если это банальный NULL pointer dereference, который бросается в глаза). Но тем не менее, иногда все же можно найти задачу, которуй можно решить начинающему разработчику. 
Bugzilla это хорошо, но, имхо, ведь есть и способ получше. Как насчет The Linux Driver Project?
Проект находится на http://www.linuxdriverproject.org/foswiki/bin/view и ждет помощи smile Что это такое и в чем его цель можно посмотреть, сходив по ссылке.
Цитата

The LDP group is also actively working on drivers for a number of
different video devices today, with the code being available today for
testing by users in the linux-next kernel releases.  These drivers
should go into a kernel.org release in the near future when development
is complete.

Для того чтобы потихоньку вьезжать в курс дела, неплохо подписаться на рассылку kernelnewbies.org.

Насчет того, чтобы понять работу ядра, то имхо, это хорошая цель. Меня она не покидает уже года 2.
Могу сказать что поначалу все очень плохо/непонятно, но потом все же картинка немного прояснится. В конечном итоге все зависит только от вас и вашего упорства. 

Вот вроде все.
PS: из книг я очень советую почитать Professional Linux kernel architecture. Я считаю что это одна из лучших книг по общему устройству ядра Linux(коих не так много).

Автор: vadim90 4.10.2009, 21:24
kirjanov, спасибо большое, но мне еще рано что-либо фиксить, все свободное время уделяю исходникам ядра и соответствующей литературе

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)