Skip to content

Latest commit

 

History

History
395 lines (330 loc) · 44.2 KB

README_ru.md

File metadata and controls

395 lines (330 loc) · 44.2 KB

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

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

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

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

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

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

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

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

Наконец, на этой странице представлены самые разные темы: от аппаратных компонентов до ядра Linux. Это огромный диапазон слоёв. Одностраничный документ никогда не сможет охватить детали всех слоев, поэтому его основная задача — быть отправной точкой в мир низкоуровневого программирования.

Теория

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

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

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

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

  • Архитектура Компьютеров
  • Операционные системы
  • Рекомендуемые курсы
  • Общие навыки программирования
  • Системный дизайн
    • Соберите свой собственный комплект микропроцессора 8086
      • Если вы не создадите свою аппаратную плату, вы не поймете, что такое устройство с отображением физической памяти.
      • Современные точки доступа включают в себя очень много IP-адресов. Таким образом, у вас нет возможности понять, как связаны ядро процессора и периферийные устройства.
      • Когда вы создаете свой собственный комплект 8086, у вас есть возможность найти каждое периферийное устройство в физической памяти. И вы можете своими глазами увидеть работу основных аппаратных компонентов (BUS, IRQ, Clock, Power и т.д.).
      • Я собрал комплект 8086 в своем университете. Это был один из самых ценных курсов, которые я когда-либо посещал. Попробуйте собрать свой собственный комплект аппаратного обеспечения. Было бы лучше, если бы аппаратное обеспечение было старше и проще, потому что вам придется больше делать для себя.
      • Найдите в своей любимой поисковой системе «комплект 8086». Вы сможете найти несколько веб-сайтов, на которых можно купить аппаратную схему, детали и ознакомиться с руководствами.

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

Языки

Ассемблер

Выберите одну из платформ, х68 или ARM, необходимости в доскональном изучении обеих нет смысла. Даже не столь важно знание самой реализации языка ассемблера. Гораздо важнее глубокое понимание работы процессора и компьютера в целом. Знание последних новинок реализации языка ассемблера не так важно, так что для начала лучше выбрать 8086 или Cortex-M, но также подойдёт и любой процессор имеющийся у вас.

Язык C

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

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

Rust

I am sure that the next language for the systems programming would be Rust. I will make a list what I did to learn Rust.

Linus Torvalds said "Unless something odd happens, it [Rust] will make it into 6.1."

  • The Rust Programming Language
    • Great introduction, but lack of examples and exercises.
  • Rust by Example
    • While reading "The Rust Programming Language", you can find examples and exercises here.
    • But there are not many exercises you can do something for yourself. Only some examples includes "do-this" exercises and they are very simple.
  • Programming Rust, 2nd
    • Deeper introduction, but still lack of examples and exercises.
  • Exercism
    • Good exercises to practice indivisual features of RUST.
    • I am not sure Mentors are working actively but it would be enough to compare your solution with others.
      • After submitting your solution, you can see other's solutions with "Community solutions" tab (since Exercism V3).
      • Many easy level exercises are for functional feature such as map/filter/any and etc.
  • Easy rust
  • Let's get rusty
    • There are many Youtubers uploading Rust course but I enjoyed this course most.
    • He has been uploading the latest news for Rust. It's worth subscribing.
  • Rust for Linux
    • See the example sources and check how Rust will get into the Linux kernel

Приложения

Аппаратное обеспечение && Прошивка

Если хочешь стать системным инженером встраиваемых систем, то лучше начать с простых 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 и участвуй в разработке.

Some resources for Linux kernel and device driver development from beginner to advanced.

Ссылки

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

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

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

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

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

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

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

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

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

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

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

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

How to start?

Я получил электронное письмо с вопросом, как начать. На этой странице много информации о книгах, курсах и проектах. Моя ошибка, что я забыл написать с чего начать. К сожалению простого пути нет в оригинале "King's Road to King's Landing". Можете последовать моему пути или открыть новый. Далее предложен мой путь. Если вы уже изучали один из разделов, вы можете пропустить его. ДИСКЛЕЙМЕР, это всего лишь один из вариантов и вы можете последовать ему если не знаете с чего начать.

  • Для начала познакомьтесь с теорией операционных систем: к примеру Морис Дж. Бах. Архитектура операционной системы Unix
  • Изучите язык ассемблера и языки C
  • Попробуйте применить C на практике
    • Уроки по проектам C: Посмотри предложенные идеи или реализуй свою.
    • leetcode.com: Если у вас не получается найти интересную идею для проекта, потренируйтесь в реализации алгоритмов и структур данных.
  • Сделать аппаратный проект
    • Выберите себе Raspberrypi или Arduino. Вам нужен опыт управления оборудованием напрямую с помощью языка C.
    • Я рекомендую купить комплект Atmega128 и реализовать программу для включения/выключения светодиодов, обнаружения входного сигнала переключателя и отображения сообщений на текстовом ЖК-дисплее. Программа управления двигателем тоже очень хороший проект: например, трассировщик линии.
    • В процессе реализации проекта вы можете обращаться к документациям сторонних библиотек, но не можете использовать их.
  • Основы ядра Linux
  • Go to the professional field
    • If you want to be a professional Linux Kernel Developer
      • must read Understanding the Linux Kernel
      • Check the latest issues at https://lwn.net/ and join it.
        • Check "Recent kernel patches" at "https://lwn.net/Kernel/" or direct link https://lwn.net/Kernel/Patches
        • Find an interesting patch to you. Try to understand the source code. Of course it would be really difficult but try. You will be closer and closer whenever you try.
        • Build kernel and test it on your system. For example, performance test, stability test with LTP(https://linux-test-project.github.io/) or static code analysis tools inside of kernel.
        • Сообщайте о любых проблемах, если вы их обнаружите: предупреждения/ошибки компиляции, падение производительности, паника ядра/упс или любая другая проблема.
        • Если вы сделали всё правильно. Владелец патча напишет сообщение «Проверено»; тег с вашим именем.
        • Найдите свое имя в логах ядра в git
    • А также множество других направлений
      • Есть много областей, где может работать разработчик низкоуровневого программного обеспечения: безопасность, компилятор, прошивка, робот/автомобиль и т. д.

Перевод

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

Кто я такой?

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

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

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