Интервью с hidnplayr

332ac097cb7bfba245943a942c69f564.png Предлагаем Вашему вниманию интервью с Jeffrey Amelynck aka hidnplayr (на Хабре hidnplayr), бельгийским разработчиком в проекте KolibriOS. Ранее о некоторых его разработках уже была статья.Интервью было проведено Сергеем Кузьминым aka Wildwest (на Хабре W__W)Представься — где учился, что изучал, в каких ОС довелось поработать.

Я учился в академии, в прошлом известной как KAHO Sint-Lieven, которая сейчас является подразделением крупнейшего университета Бельгии KU-Leuven. Там я получил степень бакалавра по специальности «Электроника и инфокоммуникационные технологии» (специализация «Электроника»).

f46fc87e46d34ef6ba05c8256d7ba625.jpg

После этого я попробовал получить степень магистра, но недавно потерял интерес к этому обучению. Скажу, что это обучение слишком теоретическое для меня и я решил, что лучше начну утверждаться в реальном мире.

Помогла ли тебе работа над KolibriOS в твоем обучении, работе или карьере?

Моя профессиональная карьера еще только начнется, но я уверен, что смогу применить некоторые знания, приобретенные здесь. KolibriOS дала мне некоторый опыт в работе с сетями и в программировании, но также важность документации, самомотивации и тому подобное. Работа с реальным оборудованием показала мне важность документации и стандартизации.

2bebfe9393b140f29a4461eb1aaadcab.jpg

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

79e8d21bb2114900b3bbb8e84e3a19c7.jpg

Расскажи о Бельгии. Расскажи, что в Бельгии есть такого, о чем мало знают за границей (пример: недавно человек из Эквадора рассказывал, что у них в стране растет очень много бамбука. Я об этом не знал.).

Бельгия широко известна из-за пива, шоколада и картофельных чипсов, но наша любовь к гастрономической кухне не кончается на этом. Знаешь ли ты, что у нас столько же звезд Мишлена на жителя, как во Франции?

Не знал этого. Как и когда ты узнал о MenuetOS и KolibriOS?

В юном возрасте 13 лет я искал альтернативные операционные системы. Я пробовал несколько дистрибутивов Linux, но были проблемы с запуском на моем старом компьютере. Конфигурирование, особенно драйверов видеокарт и X Window System, доставляло головные боли. Я нашел MenuetOS и сразу же был впечатлен. Из-за MenuetOS я решил изучить программирование на ассемблере.

Некоторое время назад твой ник был profkid13, но потом ты его сменил на hidnplayr. Расскажи про эти ники, причину смены.

Profkid13 был моим первым ником, как ты догадываешься, в возрасте 13 лет. Он отражал идею того, кем я хотел быть в то время: умный новичок. Конечно, ничего из этого еще не было правдой, я не знал как учиться в интернете и задавал неправильные вопросы на разных форумах. Позже, когда я понял это, я решил, что настало время для нового ника, чтобы избавиться от плохого имиджа.Ник произошел из чата, в котором я провел много часов моей юности. Это был публичный чат, где можно было играть в игры с другими пользователями. Я нашел способ скрыть себя из списка пользователей и поэтому выбрал имя «hidden player», который позже сократился до «hidnplayr». Этот ник прижился и я никогда не думал сменить его.

Одна из спорных тем — это история MenuetOS и последующее разделение коллектива разработчиков на тех, кто поддержал Menuet64 и тех, кто поддержал KolibriOS. Расскажи свою версию событий периода 2003–2007 годов. Почему ты поддержал KolibriOS?

Я не помню, когда именно я нашел KolibriOS, но было очевидно, что она лучше, чем MenuetOS, по крайнем мере в моих глазах. У меня всегда был интерес к компьютерным сетям и я решил изучить это в KolibriOS.KolibriOS была лучше для меня, потому что она имела такие качества как (лучший) менеджер памяти и более живое сообщество.Первой программой, которую я закоммитил на SVN, была программа «autodhcp». Она объединяла две существующие программы «DHCP client» и «network configuration», чтобы автоматически получать настройки сети от сервера DHCP и применить их после загрузки.

ea9ff86a356b40469d6f123cce6a5087.gif

Расскажи про свои программы для KolibriOS, в том числе про irc клиент и программу для работы с COM портом.

Я написал простой клиент VNC и хотел написать больше сетевых программ, но потом заметил ограничения существовавшего сетевого стека в KolibriOS.

3b5efd91746d4d488f60e15ed9e620f9.jpg

Несколько простых изменений (сокративших копирование данных ядром ОС) сильно улучшило производительность, но всё еще было подоптимальным. Я никогда публично не показывал эти фиксы ядра. Одна вещь, которая быстро была включена в ядро, была новая системная функция, которая позволяла читать больше, чем 1 байт за раз из сокета.Вместо улучшения старого кода я решил начать с нуля новый сетевой стек. Я хотел избавиться от внутриядерных сетевых драйверов и заменить существующий сетевой API на индустриальный стандарт BSD сокетов.Это также значило, что все сетевые программы должны быть обновлены или даже полностью переписаны. Некоторые программы, такие как клиент IRC, были полностью переписаны, потому что в их коде был большой беспорядок. Одна из моих максим: «Пиши лазанья код, а не спагетти код.»

8a0944996e184848b6827a7aca9a38c4.gif

2fb5be420e0245eab766746c68e6e799.gif

c470ab19e7634c24a7556c9b89f477a2.png

Программа терминала была написана после просьбы на форуме о таком приложении. Я написал её за несколько часов, показав какой простой может быть такая программа.

e5805959e41141fc9ce7cd604b778f6e.png

К сожалению, было невозможно назначить запрос на прерывание (IRQ) COM порта в программе без написания специального драйвера.Я решил, что не буду этого делать, ведь лучше подождать поддержки COM порта на уровне ОС.И к счастью, это может скоро случиться, когда программист gtament (на Хабре gtament, который написал драйвер переходника FTDI USB-RS232) закончит этот API.

Расскажи про paste.kolibrios.org и программу для посылки текстов из KolibriOS на этот сайт.

Сайт paste.kolibrios.org это публично доступный pastebin, такой же, как pastie.Моя программа «pasta» была написана для демонстрации того, как использовать библиотеку http library (Примечание — ниже будет рассказано про библиотеку) с куками и методом post из HTTP. Она позволяет послать текст из файла или буфера обмена на сайт.

e571e7e99fae45859511c5ef6c046a35.png

Каких сетевых программ еще не хватает в KolibriOS? Появятся ли когда-нибудь аналоги команды netstat (Примечание — это команда в cmd.exe из Windows, есть программы с такой же функцией — TCPView и Anvir) и программа для показа списка открытых и закрытых портов с возможностью управлять их состоянием? Как обстоят дела с серверным софтом?

Такие программы точно будут написаны, единственный вопрос — когда это будет. Поскольку для меня это хобби, я не могу назвать сроки.Программа Socketdbg может прочитать все значения в ядре для конкретного сокета, но это очень нижний уровень конечно.Демон FTP (или сервер, если угодно) доступен и должен работать.

1bdd95b10bb24b4a9a37236d1c67971d.png

Сервер HTTP тоже доступен, но не в основном дистрибутиве, потому что использует специальную библиотеку, которая отсутствует на SVN.Он называется photonweb и на самом деле это мультиплатформенный сервер HTTP, написанный в «Fresh IDE» программистом johnfound. Написание HTTP сервера специально для KolibriOS находится не на высоком месте в моем личном списке приоритетов.

Как насчет Samba, печати по сети?

Samba видимо требует большого объема работы и поэтому также не на высоком месте в моем личном списке приоритетов. Но определенно было бы приятно иметь её поддержку.Некоторые сетевые принтеры позволяют послать документы на них через протокол FTP, так что это уже возможно, если сможешь разобраться в том, как это сделать.Но поскольку нет поддержки диспетчера очереди печати (spooler) и всех прочих требуемых сервисов для принтеров, то для меня нет смысла исследовать протоколы принтеров.

Что входит в список приоритетов?

Он постоянно меняется и вообще это что-то в моей голове, что я не могу записать.

Расскажи о бранче сетевого стека, который был потом интегрирован в ядро. Каковы его главные особенности и преимущества, его текущее состояние и планы на ближайшее будущее.

Я поддерживаю страницу на вики, где можно найти информацию и отслеживать прогресс: wiki.kolibrios.org/wiki/New_stackОсновными целями для нового сетевого стека являлись более высокая производительность (пропускная способность), поддержка многих сетевых интерфейсов и API, совместимое с BSD сокетами, для упрощения написания/портирования сетевых программ.Для увеличения производительности я уменьшил копирование сетевых пакетов (в MenuetOS они копировались каждым обработчиком протокола (protocol handler)).Я также выбрал реализацию драйверов такую, которая поддерживает прерывания, хотя я недавно узнал, что подход опроса (polling approach) может дать лучшую пропускную способность с трафиком из малых пакетов. (К счастью, опрос может быть легко реализован в текущих драйверах, когда понадобиться)В настоящий момент работа с несколькими сетевыми картами поддерживается, но самонастройка (DHCP) работает только на первой обнаруженной сетевой карте.Маршрутизация в ядре также нуждается в улучшении для работы с несколькими сетевыми картами. (Некоторые функции жестко привязаны к первой сетевой карте).Код TCP, который не так сложен, но велик, в целом работает, но не является полным и должен быть должным образом протестирован. Текущий код TCP — это вручную переписанная реализация кода TCP из 4.4BSD, и поэтому для современного интернета немного устарел.Позже, я хочу изучить разные алгоритмы предотвращения насыщения и прочие оптимизации.

4e8123feaf4e44afbb1dd0d37e92bdcb.jpg

Есть ли проблемы или ограничения в сетевом стеке? Сколько соединений может быть запущено одновременно? Какое значение трафика DDoS является проблемой для KolibriOS?

Проблемы могут быть багами или нереализованными свойствами.Полное тестирование необходимо и запланировано после реализации некоторых свойств, таких как очередь сборки TCP (TCP re-assembly queue).Максимальное количество сетевых буферов и соединений настраивается в коде ядра. Выдержка из stack.inc: NET_DEVICES_MAX = 16NET_BUFFERS = 512NET_BUFFER_SIZE = 2048Количество сокетов ограничено только доступной памятью в соответствующий момент, но в дальнейшем может быть легко ограничено цифрой, настраиваемой пользователем.

Расскажи как работает сетевой стек

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

Когда пакет принимается по проводу сетевой картой, генерируется прерывание.Это прерывание обрабатывается драйвером, который помещает пришедший пакет в оперативную память компьютера (если аппаратура еще этого не сделала) и посылает указатель на этот сетевой пакет в ядро. Ядро помещает этот указатель в очередь пакетов, ожидающих обработки так скоро, насколько это возможно, но не в обработчике прерываний. Через небольшой промежуток времени ядро начнет обработку входящих пакетов и вызовет соответствующие обработчики протоколов в ядре. Например, ответ на запрос отклика ICMP (ICMP echo request) будет сделан ядром, ARP пакеты будут обработаны также ядром, но пакеты/сегменты UDP и TCP могут привести к данным, находящимся в очереди в сокет.Когда такие данные прибывают, владелец процесса сокета будет оповещен, что данные доступны и данные могут быть приняты через системную функцию 75, 7 (Получить из сокета).Этот системный вызов скопирует данные из буфера сетевых пакетов (в пространстве ядра) в место, выбранное программой (в пространстве пользователя).Буфер сетевых пакетов тогда отмечается как пустой и готовый к повторному использованию системой.

f2157a8495704ea48dd4d4e043b2acc8.gif

Если программа хочет послать данные, то она вызывает системную функцию 75, 6 (Послать в сокет).Это приведет к тому, что ядро выделить место под сетевой буфер, сгенерирует необходимые заголовки протокола в этом буфере, и скопирует данные из пространства пользователя в сетевой буфер.Ядро затем вызовет соответствующий сетевой драйвер, который скопирует сетевой буфер в аппаратный буфер и наконец пошлет пакет по проводу.Как только драйвер сигнализирует, что копирование в аппаратный буфер закончено, сетевой буфер отмечается как пустой, чтобы его можно было позже повторно использовать.

a5fe0ad8bd2a4de9974d8a70a77aa488.png

Как использовать HTTPlib (http.obj)?

Так, во-первых, надо знать как использовать библиотеки в KolibriOS. Эта статья в вики KolibriOS должна быть хорошим началом: wiki.kolibrios.org/wiki/Libraries.Когда ты разобрался в этом и знаешь основы того, как работает HTTP, ты можешь найти API библиотеки http library: websvn.kolibrios.org/filedetails.php? repname=Kolibri+OS&path=%2Fprograms%2Fdevelop%2Flibraries%2Fhttp%2Fhttp_en.txtи некоторые примеры: websvn.kolibrios.org/listing.php? repname=Kolibri+OS&path=%2Fprograms%2Fdevelop%2Flibraries%2Fhttp%2Fexamples%2F

© Habrahabr.ru