Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Программирование под Unix/Linux > рвопос про исходники ядра linux |
Автор: vadim90 11.9.2009, 13:33 |
прошу помочь мне в изучении исходников ядра linux. нарыл пару книг в сети, но вопрос не в этом. Не могу найти откуда ж собственно начать читать сырцы ядра, в книгах про это не нашел. кто может копался в исходниках прошу помочь |
Автор: andrew_121 11.9.2009, 14:02 |
зависит от того что нужно тебе. |
Автор: vadim90 11.9.2009, 14:13 |
я хочу изучить весь процесс работы ядра |
Автор: andrew_121 11.9.2009, 14:36 |
![]() |
Автор: vadim90 11.9.2009, 14:41 |
andrew_121, представляю, если тебе нечего говорить по делу, то не пиши тут, пиши в личку, там обсудим |
Автор: смерш 11.9.2009, 14:56 | ||
Ну так начни с процесса загрузки : http://duartes.org/gustavo/blog/post/kernel-boot-process Работу всех подсистем ядра знают во всём мире человек 5 отсилы ![]() Поэтому все разработчики ядра специализируются на конкретной подсистеме или даже её части (это к /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 | ||||
Простые программы работают в окружении хоста , который предоставляет ей все необходимые сервисы. Т.е. gcc предоставляет все необходимые библиотеки и ф-ции и в свою очередь ядро предоставляет все необходимые сервисы gcc, который тоже работает в его окружении. В этом окружении начальная точка выполнения находится в ф-ции main(). А ядро работает в своём собственномhttp://publications.gbdirect.co.uk/c_book/preface/hosted_and_free_standing.html. Поэтому никаких main() тут и нет. В общем это забота загрузчика, загрузить образ и сделать jump на точку входа... А дальше всё есть по ссылке в первом посте.
это уже надо лазить по мэйкфайлам, мой интерес пока дотуда ещё недобрался, если вобще когда нибудь доберётся. Но если интересно то тут есть доки по ним Documentations/kbuild/ |
Автор: 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 |
Рекомендую начать с простого ![]() Linux Device Driver 3 (ldd3) Добавлено через 43 секунды http://lwn.net/Kernel/LDD3/ |
Автор: vadim90 13.9.2009, 13:58 |
GrayCardinal, спасибо |
Автор: смерш 13.9.2009, 16:11 | ||
Действительно непонятно какую цель ты преследуешь. Если хочешь стать разработчиком ядра, то ты идёшь по неправильному пути, в конце концов ты просто сломаешься от потока информации которая никак у тебя не будет связываться в общую картину. Под большим опытом в программировании я имел именно это в виду, т.е. опыт работы с ОГРОМНЫМИ проектами, а не владение в совершенстве С. Мотивация как сказал Максим пройдёт ОЧЕНЬ быстро, если ты будешь только читать книги/исходники. Я по этому пути уже прошёл, практически с нулевым результатом на выходе. Это после полугода скитания по всему ядру в надежде что вот вот зацеплюсь за что-то и начну уже писать, хотя никаких попыток для этого и не делал... В общем рекомендую тебе оставить загрузку (на время хотя бы), бородатым хакерам ![]() Изучи: 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 Всё, ![]() |
Автор: 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, вторая, да еще и русская... Хм ![]() |
Автор: 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 и ждет помощи ![]()
Для того чтобы потихоньку вьезжать в курс дела, неплохо подписаться на рассылку kernelnewbies.org. Насчет того, чтобы понять работу ядра, то имхо, это хорошая цель. Меня она не покидает уже года 2. Могу сказать что поначалу все очень плохо/непонятно, но потом все же картинка немного прояснится. В конечном итоге все зависит только от вас и вашего упорства. Вот вроде все. PS: из книг я очень советую почитать Professional Linux kernel architecture. Я считаю что это одна из лучших книг по общему устройству ядра Linux(коих не так много). |
Автор: vadim90 4.10.2009, 21:24 |
kirjanov, спасибо большое, но мне еще рано что-либо фиксить, все свободное время уделяю исходникам ядра и соответствующей литературе |