Skip to content

Latest commit

 

History

History
345 lines (283 loc) · 38.5 KB

README_ru.md

File metadata and controls

345 lines (283 loc) · 38.5 KB

Университет Низкоуровневого Программирования

Что это такое?

Вдохновляясь google-interview-university, мне бы хотелось поделиться опытом и показать путь к становлению программистом низкого уровня, потому что соответствующие навыки перестали быть столь обыденными, каковыми были раньше. К тому же, многие учащиеся и просто новички часто меня сами спрашивают, как стать низкоуровневым программистом и разработчиком ядра Linux в частности.

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

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

Что значит "низкоуровневый"?

Я определяю низкоуровневое программирование как очень близкое к устройству, используя низкоуровневые языки программирования, такие как C или ассемблер, на контрасте с высокоуровневым программированием, типичного для приложений в user-space, использующим языки высокого уровня (такие как Python, Java).

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

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

Теория

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

  • Архитектура Компьютеров
  • Операционные Системы

Мне кажется, лучший способ выучить теорию - пройти соответствующий курс. Чтение книг само по себе не плохо, но отнимает слишком много времени и сил. При желании, можно найти много хороших курсов в онлайн университетах, в частности, на coursera.org и edx.org. Но теория - это лишь теория. Не думаю, что необходимо закончить курс на отлично, чтобы понять общую суть. Ты будешь становиться лучше и лучше с ростом опыта.

Позволь мне представить несколько книг, которые я читал. Они широко используются в качестве учебников в университетах. Если их нет или не было у читателя в университете, то стоит потратить немного времени на ознакомление.

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

Языки

Ассемблер

Выбери один, х68 или ARM. Нужды знать оба нет смысла. Не имеет смысла даже знать сам язык по себе. Суть состоит в понимании внутренности процессора и компьютера в целом. То есть, нет нужды практиковаться в ассемблере самой последней модели. Выбери 8086 или Cortex-M.

Язык C

Тут коротких путей нет. Просто читай всю книгу и решай все упражнения.

Если хочешь стать экспертном в программировании на C, посети https://leetcode.com/. Удачи!

Язык Rust

Я уверен, что следующий язык для системного программирования будет Rust. Я предоставлю лист того что я делал чтобы выучить Rust.

Линус Торвальдс сказал - "Если резко обстоятельства не изменятся, то он [Rust] появится в 6.1."

  • The Rust Programming Language
    • Хорошо для знакомства с языком, но имеет мало примеров и упражнений.
  • Rust by Example
    • Пока читаешь "The Rust Programming Language", можешь находить примеры и упражнения здесь.
    • Но здесь не так много упражнений которые ты можешь сделать для себя. Только некоторые примеры включают в себя "сделай это" упражнения, и они очень простые.
  • Programming Rust, 2nd
    • Глубокое ознакомление с языком, но также имеет мало примеров и упражнений.
  • Exercism
    • Хорошие упражнения для практики индивидуальных особенностей Rust.
    • Я не уверен что Менторы активно работают, но этого будет достаточно чтобы сравнивать свои решения с другими.
    • После отправки своего решения, ты можешь видеть решения других во вкладке "Community solutions" (с поры Exercism V3).
    • Много легких упражнений нацелено на функциональные особенности, такие как map/filter/any и т.д.
  • Легкий Rust
  • Let's get rusty
    • Много ютуберов делают курсы по Rust, но этот понравился мне больше всего.
    • Он выставляет последний новости по Rust. Заслуживает подписки.
  • Rust для Linux
    • Смотри примеры источников как Rust попал в ядро Linux

Приложения

Железо && Прошивки

Если хочешь стать системным инженером встраиваемых систем, то лучше начать с простых kit'ов для разработки, нежели с последнего чипсета ARM.

  • Arduino Start Kit
    • Существует множество серий Arduino, но "Arduino Start Kit" имеет наиболее простой процессор (Atmega328P) и книгу-гайд.
    • Atmega328P имеет 8-битное ядро, с которого хорошо начинать в сфере проектирования цифровых схем и разработки прошивок.
    • Тебе не требуется знать, как создавать схематики и макеты, а так же собирать чипы.
    • Но нужно знать, как читать схематики и понимать, как чипы соединены между собой.
    • Разработчик прошивок должен уметь читать схематики и понимать, как передать данные на целевое устройство.
    • Следуй гайду!
  • 8086 manual
    • Если ты не знаком с архитектурой x86, то 8086 также является хорошим гайдом архитектуры процессора и ассембрела 80x86
  • 80386 manual

К этому моменту, можно приступать к последним процессорам архитектур ARM и x86.

Для примера, плата Raspberry Pi имеет процессор Cortex-A53, поддерживающий 64-битный набор инструкций. Это позволяет получить опыт в работе с современной процессорной архитектуры с помощью rPi. Да, его можно купить... но... что ты собираешься с ним делать? Если нет целевого проекта, скорее всего ты просто положишь плату в дальний ящик и забудешь о ней как и обо всех других, купленных до этого.

Поэтому, я рекомендую следующий проект.

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

Вообще говоря, у тебя уже есть доступ к последнему процессору и последним аппаратным устройствам. Твой ноутбук! Твой ПК! Ты уже имеешь все необходимое для старта! Не нужно ничего покупать. QEMU может эмулировать последние процессоры ARM и x86. То есть, все необходимое на руках. Существует множество игрушечных ядер и документации для справки. Просто установи QEMU эмулятор и создай микро-ядро, которое способно загрузиться, включить подкачку и вывести текстовые сообщения.

Другие игрушечные ядра:

Ядро Linux и драйвера устройств

Не нужно создавать свою полноценную операционную систему. Присоединйяся к сообществу Linux и участвуй в разработке.

Следуй аккуратно

Ссылки

Посмотри здесь, если понадобится что-то еще

Прочие приложения

Да, ты можешь быть и не заинтересован в линуксе и прошивках. Если так, то можно найти и другие сферы:

  • Системное программирование и драйвера устройств под Windows
  • Безопасность
  • Реверс инженеринг

У меня нет каких-либо знаний в данных сферах. Поэтому прошу отправить мне любую информацию о них для новичков.

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

Будущее низкоуровневого программирования

Мне неизвестно будущее, но я посматриваю на RUST.

Если бы у меня была свободная неделя в одиночестве, я бы его выучил. Просто потому, что RUST - самый новый язык программирования, на котором возможна разработка драйверов устройств под Linux.

IoT теперь уже является трендом, поэтому стоит посмотреть на ОС для него. ARM, Samsung и некоторые другие компании имеют свои собственные ОС реального времени, но, к сожалению, многие из них имеют закрытый исходный код. Но Linux Foundation также имеет свое решение: Zephyr

Обычные облачные сервера имеют множество слоев; в частности, хостовую ОС, драйвер kvm, процесс qemu, гостевая ОС и сервисное приложение. Контейнер был создан, чтобы предоставить легку. виртуализацию. В ближайшем будущем, новый концепт ОС, так называемый "библиотечная ОС" или Unikernel, может заменить типичный стэк SW для виртуализации.

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

Как начать?

Однажды, я получил письмо с таким вопросом. На этой странице представлено множество информационных книг, курсов и проектов. И в том, что я забыл напистаь тут ответ на него - моя вина. Конечно, не существует единственного прямого пути. Я просто пишу, что делал сам и в каком порядке. Если ты уже знаком с чем-то, то можешь это пропустить. ПОВТОРЯЮ, это все лишь пример, которому ты можешь следовать. Если не знаешь, что делать, просто делай все ПО ПОРЯДКУ.

Перевод

Присылайте мне pull-реквесты, если хотите перевести эту страницу. Я перечислю их здесь.

Кто я такой?

Вдохновляясь google-interview-university, мне бы хотелось поделиться опытом и показать путь к становлению программистом низкого уровня, потому что соответствующие навыки перестали быть столь обыденными, каковыми были раньше. К тому же, многие учащиеся и просто новички часто меня сами спрашивают, как стать низкоуровневым программистом и разработчиком ядра Linux в частности.

Для информации, у меня более 10 лет опыта в качестве низкоуровневого программиста, мой опыт включает:

  • Программирование на ассмемблере под 80x86
  • Аппаратные средства на чипах Atmel и прошивки для них
  • Язык C и системное программирование под Unix
  • Драйвера устройств под Linux
  • Ядро Linux: подкачка страниц
  • Ядро Linux: драйвер блочного устройства и md module