#низкоуровневое_программирование — Public Fediverse posts
Live and recent posts from across the Fediverse tagged #низкоуровневое_программирование, aggregated by home.social.
-
C++: Как мы докатились до Hello World в 2 МБ
Казалось бы, современный С++ дает столько возможностей… Давайте попробуем препарировать всю эту необъятную мощь, начав с первого шага в любом языке программирования — «Hello World». Как реализации компиляторов встречают новичка, впервые написавшему свои первые строчки кода? Узнать, как же мы до такого докатились
https://habr.com/ru/articles/1033206/
#c++ #gcc #оптимизация_кода #оптимизация_программ #примеры_кода #деконструкция #низкоуровневое_программирование #сравнение_компиляторов #сравнение_версий
-
C++: Как мы докатились до Hello World в 2 МБ
Казалось бы, современный С++ дает столько возможностей… Давайте попробуем препарировать всю эту необъятную мощь, начав с первого шага в любом языке программирования — «Hello World». Как реализации компиляторов встречают новичка, впервые написавшему свои первые строчки кода? Узнать, как же мы до такого докатились
https://habr.com/ru/articles/1033206/
#c++ #gcc #оптимизация_кода #оптимизация_программ #примеры_кода #деконструкция #низкоуровневое_программирование #сравнение_компиляторов #сравнение_версий
-
C++: Как мы докатились до Hello World в 2 МБ
Казалось бы, современный С++ дает столько возможностей… Давайте попробуем препарировать всю эту необъятную мощь, начав с первого шага в любом языке программирования — «Hello World». Как реализации компиляторов встречают новичка, впервые написавшему свои первые строчки кода? Узнать, как же мы до такого докатились
https://habr.com/ru/articles/1033206/
#c++ #gcc #оптимизация_кода #оптимизация_программ #примеры_кода #деконструкция #низкоуровневое_программирование #сравнение_компиляторов #сравнение_версий
-
C++: Как мы докатились до Hello World в 2 МБ
Казалось бы, современный С++ дает столько возможностей… Давайте попробуем препарировать всю эту необъятную мощь, начав с первого шага в любом языке программирования — «Hello World». Как реализации компиляторов встречают новичка, впервые написавшему свои первые строчки кода? Узнать, как же мы до такого докатились
https://habr.com/ru/articles/1033206/
#c++ #gcc #оптимизация_кода #оптимизация_программ #примеры_кода #деконструкция #низкоуровневое_программирование #сравнение_компиляторов #сравнение_версий
-
Визуализатор структуры адреса на Си для Linux и Termux: Попасть в «Голову» кеш-линии
В 47 мои увлечения стали Си, Radare2 , Биты, Логика, Память. Изучая память зацепился за адреса. На адрес 0x7ffe10b284 можно смотреть бесконечно долго. Трудно сказать с ходу насколько удачно ваши данные легли в память. Влезают они в одну кеш-линию или размазаны по двум. Чтоб не заниматься битовой арифметикой в уме, я написал утилиту на Си для Linux и Termux. Она раскладывает младшие 12 бит адреса на 4 строки визуализации. Теперь сразу видно, попали мы в "Голову" или застряли в "Хвосте" кеш-линии. Утилита максимально легковесная. Вам не нужны сложные дебаггеры, достаточно gcc. Работает, как на десктопном Linux, так и в Termux на Android. Можно проверить выравнивание даже лёжа на диване.
-
Визуализатор структуры адреса на Си для Linux и Termux: Попасть в «Голову» кеш-линии
В 47 мои увлечения стали Си, Radare2 , Биты, Логика, Память. Изучая память зацепился за адреса. На адрес 0x7ffe10b284 можно смотреть бесконечно долго. Трудно сказать с ходу насколько удачно ваши данные легли в память. Влезают они в одну кеш-линию или размазаны по двум. Чтоб не заниматься битовой арифметикой в уме, я написал утилиту на Си для Linux и Termux. Она раскладывает младшие 12 бит адреса на 4 строки визуализации. Теперь сразу видно, попали мы в "Голову" или застряли в "Хвосте" кеш-линии. Утилита максимально легковесная. Вам не нужны сложные дебаггеры, достаточно gcc. Работает, как на десктопном Linux, так и в Termux на Android. Можно проверить выравнивание даже лёжа на диване.
-
Визуализатор структуры адреса на Си для Linux и Termux: Попасть в «Голову» кеш-линии
В 47 мои увлечения стали Си, Radare2 , Биты, Логика, Память. Изучая память зацепился за адреса. На адрес 0x7ffe10b284 можно смотреть бесконечно долго. Трудно сказать с ходу насколько удачно ваши данные легли в память. Влезают они в одну кеш-линию или размазаны по двум. Чтоб не заниматься битовой арифметикой в уме, я написал утилиту на Си для Linux и Termux. Она раскладывает младшие 12 бит адреса на 4 строки визуализации. Теперь сразу видно, попали мы в "Голову" или застряли в "Хвосте" кеш-линии. Утилита максимально легковесная. Вам не нужны сложные дебаггеры, достаточно gcc. Работает, как на десктопном Linux, так и в Termux на Android. Можно проверить выравнивание даже лёжа на диване.
-
Визуализатор структуры адреса на Си для Linux и Termux: Попасть в «Голову» кеш-линии
В 47 мои увлечения стали Си, Radare2 , Биты, Логика, Память. Изучая память зацепился за адреса. На адрес 0x7ffe10b284 можно смотреть бесконечно долго. Трудно сказать с ходу насколько удачно ваши данные легли в память. Влезают они в одну кеш-линию или размазаны по двум. Чтоб не заниматься битовой арифметикой в уме, я написал утилиту на Си для Linux и Termux. Она раскладывает младшие 12 бит адреса на 4 строки визуализации. Теперь сразу видно, попали мы в "Голову" или застряли в "Хвосте" кеш-линии. Утилита максимально легковесная. Вам не нужны сложные дебаггеры, достаточно gcc. Работает, как на десктопном Linux, так и в Termux на Android. Можно проверить выравнивание даже лёжа на диване.
-
[Перевод] Почему eBPF-программа работает на одном ядре, а на другом — нет
eBPF давно стал стандартным инструментом для работы с ядром, но на практике быстро выясняется: одна и та же программа может вести себя по-разному на соседних версиях Linux. Причина — в деталях, которые обычно остаются «под капотом»: структурах ядра, их смещениях и способе доступа к данным. В статье разбираемся, откуда берётся эта нестабильность, как работают механизмы вроде CO-RE и BTF и что на самом деле нужно учитывать, чтобы eBPF-код был переносимым и предсказуемым в разных окружениях. Разобраться в eBPF
https://habr.com/ru/companies/otus/articles/1020852/
#eBPF #ядро_Linux #BPF_CORE #переносимость_программ #версии_ядра_Linux #низкоуровневое_программирование #совместимость_систем
-
[Перевод] Почему eBPF-программа работает на одном ядре, а на другом — нет
eBPF давно стал стандартным инструментом для работы с ядром, но на практике быстро выясняется: одна и та же программа может вести себя по-разному на соседних версиях Linux. Причина — в деталях, которые обычно остаются «под капотом»: структурах ядра, их смещениях и способе доступа к данным. В статье разбираемся, откуда берётся эта нестабильность, как работают механизмы вроде CO-RE и BTF и что на самом деле нужно учитывать, чтобы eBPF-код был переносимым и предсказуемым в разных окружениях. Разобраться в eBPF
https://habr.com/ru/companies/otus/articles/1020852/
#eBPF #ядро_Linux #BPF_CORE #переносимость_программ #версии_ядра_Linux #низкоуровневое_программирование #совместимость_систем
-
[Перевод] Почему eBPF-программа работает на одном ядре, а на другом — нет
eBPF давно стал стандартным инструментом для работы с ядром, но на практике быстро выясняется: одна и та же программа может вести себя по-разному на соседних версиях Linux. Причина — в деталях, которые обычно остаются «под капотом»: структурах ядра, их смещениях и способе доступа к данным. В статье разбираемся, откуда берётся эта нестабильность, как работают механизмы вроде CO-RE и BTF и что на самом деле нужно учитывать, чтобы eBPF-код был переносимым и предсказуемым в разных окружениях. Разобраться в eBPF
https://habr.com/ru/companies/otus/articles/1020852/
#eBPF #ядро_Linux #BPF_CORE #переносимость_программ #версии_ядра_Linux #низкоуровневое_программирование #совместимость_систем
-
[Перевод] Почему eBPF-программа работает на одном ядре, а на другом — нет
eBPF давно стал стандартным инструментом для работы с ядром, но на практике быстро выясняется: одна и та же программа может вести себя по-разному на соседних версиях Linux. Причина — в деталях, которые обычно остаются «под капотом»: структурах ядра, их смещениях и способе доступа к данным. В статье разбираемся, откуда берётся эта нестабильность, как работают механизмы вроде CO-RE и BTF и что на самом деле нужно учитывать, чтобы eBPF-код был переносимым и предсказуемым в разных окружениях. Разобраться в eBPF
https://habr.com/ru/companies/otus/articles/1020852/
#eBPF #ядро_Linux #BPF_CORE #переносимость_программ #версии_ядра_Linux #низкоуровневое_программирование #совместимость_систем
-
Zig вместо C: пишем высокопроизводительный CLI-инструмент и заменяем 3000 строк C-кода
Всё началось на второй паре по системному программированию. Нам дали задачу: написать CLI-утилиту для анализа логов - парсить файл, фильтровать записи по уровню ошибок, считать статистику, выводить красиво в консоль. "Ну понятно", - открыл я vim и началось мое долгое приключение... Неделя. Две. Утилита называлась logz , она умела читать логи nginx и apache, фильтровать по уровню (DEBUG, INFO, WARN, ERROR), по дате, по IP, выводила топ адресов с наибольшим числом ошибок, рисовала простенький bar-chart прямо в терминале через unicode-символы. Только вот я сидел как-то вечером, запустил wc -l main.c - 3147 строк . И смотрел на это число минуты три с таким лицом - O_O . Сама утилита работала. Но открывая её осознаешь что - это месиво. Одна функция process_file на 400 строк. Сегфолты раз в неделю. Valgrind как лучший друг. И каждый раз когда надо добавить фичу - сначала полчаса вспоминаешь что вообще происходит в коде. Потом я случайно прочитал пост про Zig на lobste.rs . Заинтересовался и попробовал. Через месяц у меня была та же утилита, но теперь на 1089 строках , которая работала быстрее и не падала. Тут я понял что вот золотая жила и расскажу о том - зачем Zig, как переписывал, где облажался и что вышло в итоге. Смотреть как горит C-код
https://habr.com/ru/articles/1019466/
#zig #c #cli #системное_программирование #производительность #компилятор #низкоуровневое_программирование
-
Zig вместо C: пишем высокопроизводительный CLI-инструмент и заменяем 3000 строк C-кода
Всё началось на второй паре по системному программированию. Нам дали задачу: написать CLI-утилиту для анализа логов - парсить файл, фильтровать записи по уровню ошибок, считать статистику, выводить красиво в консоль. "Ну понятно", - открыл я vim и началось мое долгое приключение... Неделя. Две. Утилита называлась logz , она умела читать логи nginx и apache, фильтровать по уровню (DEBUG, INFO, WARN, ERROR), по дате, по IP, выводила топ адресов с наибольшим числом ошибок, рисовала простенький bar-chart прямо в терминале через unicode-символы. Только вот я сидел как-то вечером, запустил wc -l main.c - 3147 строк . И смотрел на это число минуты три с таким лицом - O_O . Сама утилита работала. Но открывая её осознаешь что - это месиво. Одна функция process_file на 400 строк. Сегфолты раз в неделю. Valgrind как лучший друг. И каждый раз когда надо добавить фичу - сначала полчаса вспоминаешь что вообще происходит в коде. Потом я случайно прочитал пост про Zig на lobste.rs . Заинтересовался и попробовал. Через месяц у меня была та же утилита, но теперь на 1089 строках , которая работала быстрее и не падала. Тут я понял что вот золотая жила и расскажу о том - зачем Zig, как переписывал, где облажался и что вышло в итоге. Смотреть как горит C-код
https://habr.com/ru/articles/1019466/
#zig #c #cli #системное_программирование #производительность #компилятор #низкоуровневое_программирование
-
Zig вместо C: пишем высокопроизводительный CLI-инструмент и заменяем 3000 строк C-кода
Всё началось на второй паре по системному программированию. Нам дали задачу: написать CLI-утилиту для анализа логов - парсить файл, фильтровать записи по уровню ошибок, считать статистику, выводить красиво в консоль. "Ну понятно", - открыл я vim и началось мое долгое приключение... Неделя. Две. Утилита называлась logz , она умела читать логи nginx и apache, фильтровать по уровню (DEBUG, INFO, WARN, ERROR), по дате, по IP, выводила топ адресов с наибольшим числом ошибок, рисовала простенький bar-chart прямо в терминале через unicode-символы. Только вот я сидел как-то вечером, запустил wc -l main.c - 3147 строк . И смотрел на это число минуты три с таким лицом - O_O . Сама утилита работала. Но открывая её осознаешь что - это месиво. Одна функция process_file на 400 строк. Сегфолты раз в неделю. Valgrind как лучший друг. И каждый раз когда надо добавить фичу - сначала полчаса вспоминаешь что вообще происходит в коде. Потом я случайно прочитал пост про Zig на lobste.rs . Заинтересовался и попробовал. Через месяц у меня была та же утилита, но теперь на 1089 строках , которая работала быстрее и не падала. Тут я понял что вот золотая жила и расскажу о том - зачем Zig, как переписывал, где облажался и что вышло в итоге. Смотреть как горит C-код
https://habr.com/ru/articles/1019466/
#zig #c #cli #системное_программирование #производительность #компилятор #низкоуровневое_программирование
-
Zig вместо C: пишем высокопроизводительный CLI-инструмент и заменяем 3000 строк C-кода
Всё началось на второй паре по системному программированию. Нам дали задачу: написать CLI-утилиту для анализа логов - парсить файл, фильтровать записи по уровню ошибок, считать статистику, выводить красиво в консоль. "Ну понятно", - открыл я vim и началось мое долгое приключение... Неделя. Две. Утилита называлась logz , она умела читать логи nginx и apache, фильтровать по уровню (DEBUG, INFO, WARN, ERROR), по дате, по IP, выводила топ адресов с наибольшим числом ошибок, рисовала простенький bar-chart прямо в терминале через unicode-символы. Только вот я сидел как-то вечером, запустил wc -l main.c - 3147 строк . И смотрел на это число минуты три с таким лицом - O_O . Сама утилита работала. Но открывая её осознаешь что - это месиво. Одна функция process_file на 400 строк. Сегфолты раз в неделю. Valgrind как лучший друг. И каждый раз когда надо добавить фичу - сначала полчаса вспоминаешь что вообще происходит в коде. Потом я случайно прочитал пост про Zig на lobste.rs . Заинтересовался и попробовал. Через месяц у меня была та же утилита, но теперь на 1089 строках , которая работала быстрее и не падала. Тут я понял что вот золотая жила и расскажу о том - зачем Zig, как переписывал, где облажался и что вышло в итоге. Смотреть как горит C-код
https://habr.com/ru/articles/1019466/
#zig #c #cli #системное_программирование #производительность #компилятор #низкоуровневое_программирование
-
У Z-80 4-битная АЛУ. Вот как она работает
Когда мы пишем код под микроконтроллер, за привычными инструкциями компилятора скрывается вполне конкретная логика – регистры, ALU, прерывания, шины и тайминги, которые живут по своим правилам. В статье разберём, как устроены базовые механизмы выполнения команд и что именно происходит на уровне микроархитектуры, когда «просто вызывается функция». Это попытка посмотреть на embedded-разработку через призму железа и понять, какие инженерные решения стоят за кажущейся простотой исходного кода. Разобрать архитектуру
https://habr.com/ru/companies/otus/articles/995876/
#микроархитектура_процессора #ALU #арифметикологическое_устройство #регистры #embeddedразработка #системное_программирование #низкоуровневое_программирование
-
У Z-80 4-битная АЛУ. Вот как она работает
Когда мы пишем код под микроконтроллер, за привычными инструкциями компилятора скрывается вполне конкретная логика – регистры, ALU, прерывания, шины и тайминги, которые живут по своим правилам. В статье разберём, как устроены базовые механизмы выполнения команд и что именно происходит на уровне микроархитектуры, когда «просто вызывается функция». Это попытка посмотреть на embedded-разработку через призму железа и понять, какие инженерные решения стоят за кажущейся простотой исходного кода. Разобрать архитектуру
https://habr.com/ru/companies/otus/articles/995876/
#микроархитектура_процессора #ALU #арифметикологическое_устройство #регистры #embeddedразработка #системное_программирование #низкоуровневое_программирование
-
У Z-80 4-битная АЛУ. Вот как она работает
Когда мы пишем код под микроконтроллер, за привычными инструкциями компилятора скрывается вполне конкретная логика – регистры, ALU, прерывания, шины и тайминги, которые живут по своим правилам. В статье разберём, как устроены базовые механизмы выполнения команд и что именно происходит на уровне микроархитектуры, когда «просто вызывается функция». Это попытка посмотреть на embedded-разработку через призму железа и понять, какие инженерные решения стоят за кажущейся простотой исходного кода. Разобрать архитектуру
https://habr.com/ru/companies/otus/articles/995876/
#микроархитектура_процессора #ALU #арифметикологическое_устройство #регистры #embeddedразработка #системное_программирование #низкоуровневое_программирование
-
У Z-80 4-битная АЛУ. Вот как она работает
Когда мы пишем код под микроконтроллер, за привычными инструкциями компилятора скрывается вполне конкретная логика – регистры, ALU, прерывания, шины и тайминги, которые живут по своим правилам. В статье разберём, как устроены базовые механизмы выполнения команд и что именно происходит на уровне микроархитектуры, когда «просто вызывается функция». Это попытка посмотреть на embedded-разработку через призму железа и понять, какие инженерные решения стоят за кажущейся простотой исходного кода. Разобрать архитектуру
https://habr.com/ru/companies/otus/articles/995876/
#микроархитектура_процессора #ALU #арифметикологическое_устройство #регистры #embeddedразработка #системное_программирование #низкоуровневое_программирование
-
[Перевод] Минимальный планировщик с eBPF, sched_ext и C
Планировщик Linux долгое время оставался зоной, куда можно было заглянуть, но почти невозможно вмешаться без пересборки ядра. С появлением sched_ext эта граница сдвинулась: теперь логику планирования можно описывать кодом на C и загружать в ядро через eBPF. В статье разберём минимальный рабочий планировщик, посмотрим, как он взаимодействует с ядром, и обсудим, какие новые возможности это открывает для экспериментов и диагностики поведения системы под нагрузкой. Вникнуть в ядро
https://habr.com/ru/companies/otus/articles/980206/
#eBPF #планировщик_задач #Linux_kernel #системное_программирование #планирование_процессов #ядро_Linux #низкоуровневое_программирование #C
-
Почему в Linux «Всё есть файл»? Или почему гениальные абстракции UNIX настолько гениальны
– Ваш терминал и ваше интернет соединение – это файл! – Да что вы такое говорите? – Скажите ещё, что и мышка в моей руке или жёсткий диск – это тоже файл. – Абсолютно верно! На самом деле, с точки зрения Linux – это так. В этой статье мы докажем это на практике и разберём один из самых неочевидных, но в то же время красивых механизмов UNIX-подобных систем, благодаря которому Linux прошёл проверку временем и стал одной из самых популярных операционных систем в мире.
https://habr.com/ru/companies/timeweb/articles/944454/
#linux #си #операционные_системы #низкоуровневое_программирование #сети #unix #файловая_система #жесткий_диск #железо #ядро_linux
-
Тайны пингвина: как работают исключения и прерывания в Linux?
Привет, хабр! Моя прошлая статья о работе памяти в Linux вам понравилась. Сегодня мы разберем работу исключений и прерываний. Что это, как они работают в ОС и Linux? Давайте разберемся вместе!
https://habr.com/ru/companies/timeweb/articles/780082/
#timeweb_статьи #linux #unix #операционные_системы #системное_программирование #низкоуровневое_программирование #прерывания #исключения #ядро_linux
-
Реверс алгоритма поиска устройств в сети
При создании оконного клиента под MS-Windows для удалённого взаимодействия с LED-матрицами стояла задача сделать автоматический поиск всех табло в сети. Моей первой идеей было перебирать все существующие IP-адреса конкретной подсети, по очереди посылая на них запросы и ожидая что одно или несколько устройств отправят соответствующий ответ. Я быстро отказался от этой задумки, ведь подобный брутфорс будет сильно нагружать сеть, да и сам алгоритм не самый быстрый. Других идей по реализации на тот момент у меня не было. Мне предоставили копию другого клиента, где поиск осуществляется моментально по нажатию одноимённой кнопки, а приложение в табличном виде выводит IP и MAC-адреса с рядом другой информации об обнаруженных матрицах, если таковые нашлись. Эти данные затем могут быть использованы для подключения, конфигурации и отправки команд на найденные устройства. Не имея исходного кода, я подготовил дизассемблеры, отладчики и hex-редакторы, готовясь к глубокому анализу и разбору проприетарного алгоритма поиска, чтобы реализовать что-то подобное уже в своей программе.
https://habr.com/ru/articles/830582/
#декомпиляция #дизассемблирование #обратная_разработка #winapi #сокеты #сетевое_программирование #низкоуровневое_программирование #ida_pro #x64dbg
-
Вот что я понял за 4 месяца написания ОС
Споры о самом сложном проекте во всем IT будут продолжаться вечно. Некоторые будут говорить что тяжелее всего написать ОС, другие скажут игровой движок, может еще попасться драйвер. В этой статье я постараюсь подробно расписать свой опыт в написании ОС.
https://habr.com/ru/articles/984514/
#ос #низкоуровневое_программирование #системное_программирование #трудности #подводные_камни
-
Низкоуровневый АД: пишем свою ОС — Часть 1. Загрузчик и стартовое ядро
Всем здрасте, и сегодня мы начнем наше прохождение через низкоуровневый кодинг - написание ОС. Сегодня мы напишем загрузчик (точнее конфиг к GRUB) и простенькое ядро, которое будет выводить "Hello OSDev!" Что нам понадобится: Сделать ОС
-
[Перевод] Невероятно быстрый подсчёт байтов
Оказалось, что тема суммирования целых чисел в кодировке ASCII в Haswell со скоростью memcpy гораздо популярнее, чем я мог ожидать. Именно поэтому я решил поучаствовать и в другом челлендже в жанре HighLoad: подсчёт uint8 . В настоящее время я занимаю всего лишь 13 место в списке лидеров, проигрываю первому месту около 7%, но уже узнал немало интересного. В этом посте я полностью опишу моё решение, в том числе, удивительный паттерн считывания из памяти. Используя его, можно примерно до 30% (по сравнению с обычным последовательным доступом) повысить скорость передачи в контексте одноядерных рабочих нагрузок, ограниченных размером кэша. По-видимому, этот метод малоизвестен. Как и в других постах автора, программа настроена для следующих входных характеристик высоконагруженной системы: Intel Xeon E3-1271 v3 @ 3,60 ГГц, ОЗУ 512 МБ, Ubuntu 20.04. В ней используется только AVX2, а AVX512 не используется.
-
Добавляем цикл WHILE. Лезем в компилятор GO
На одной из конференций я наблюдал, как наши коллеги реализовывали тернарный оператор в Go с помощью комментариев. Доклад длился всего минут 10, и, честно говоря, я не смог уловить ничего внятного, кроме того, что ребята явно хорошо повеселились. Однако это вдохновило меня разобраться, как работает компилятор Go под капотом. А лучший способ разобраться — это попробовать написать что-то своё. Самым простым и понятным для меня в этом плане показалась реализация цикла while. В этой статье я покажу, что у меня получилось выяснить. Вот примерный результат, к которому мы придём:
https://habr.com/ru/articles/888704/
#компилятор #go #while #highload #низкоуровневое_программирование
-
Реверс алгоритма поиска устройств в сети
При создании оконного клиента под MS-Windows для удалённого взаимодействия с LED-матрицами стояла задача сделать автоматический поиск всех табло в сети. Моей первой идеей было перебирать все существующие IP-адреса конкретной подсети, по очереди посылая на них запросы и ожидая что одно или несколько устройств отправят соответствующий ответ. Я быстро отказался от этой задумки, ведь подобный брутфорс будет сильно нагружать сеть, да и сам алгоритм не самый быстрый. Других идей по реализации на тот момент у меня не было. Мне предоставили копию другого клиента, где поиск осуществляется моментально по нажатию одноимённой кнопки, а приложение в табличном виде выводит IP и MAC-адреса с рядом другой информации об обнаруженных матрицах, если таковые нашлись. Эти данные затем могут быть использованы для подключения, конфигурации и отправки команд на найденные устройства. Не имея исходного кода, я подготовил дизассемблеры, отладчики и hex-редакторы, готовясь к глубокому анализу и разбору проприетарного алгоритма поиска, чтобы реализовать что-то подобное уже в своей программе.
https://habr.com/ru/articles/830582/
#декомпиляция #дизассемблирование #обратная_разработка #winapi #сокеты #сетевое_программирование #низкоуровневое_программирование #ida_pro #x64dbg
-
Реверс алгоритма поиска устройств в сети
При создании оконного клиента под MS-Windows для удалённого взаимодействия с LED-матрицами стояла задача сделать автоматический поиск всех табло в сети. Моей первой идеей было перебирать все существующие IP-адреса конкретной подсети, по очереди посылая на них запросы и ожидая что одно или несколько устройств отправят соответствующий ответ. Я быстро отказался от этой задумки, ведь подобный брутфорс будет сильно нагружать сеть, да и сам алгоритм не самый быстрый. Других идей по реализации на тот момент у меня не было. Мне предоставили копию другого клиента, где поиск осуществляется моментально по нажатию одноимённой кнопки, а приложение в табличном виде выводит IP и MAC-адреса с рядом другой информации об обнаруженных матрицах, если таковые нашлись. Эти данные затем могут быть использованы для подключения, конфигурации и отправки команд на найденные устройства. Не имея исходного кода, я подготовил дизассемблеры, отладчики и hex-редакторы, готовясь к глубокому анализу и разбору проприетарного алгоритма поиска, чтобы реализовать что-то подобное уже в своей программе.
https://habr.com/ru/articles/830582/
#декомпиляция #дизассемблирование #обратная_разработка #winapi #сокеты #сетевое_программирование #низкоуровневое_программирование #ida_pro #x64dbg
-
Низкоуровневое программирование под 8086 для любопытных, часть 2
В этой части нас ждёт погружение в один из способов организации мультипоточности на базе единственного ядра процессора. Мы научимся принудительно переключать выполнение между полностью зацикленными участками кода, ничего не "знающими" о каком-то другом коде, конкурирующем за процессорное внимание. По ходу повествования будут даны все необходимые пояснения и читателю не придётся обращаться к другим источникам, кроме первой части статьи.
https://habr.com/ru/articles/907312/
#assembler #i8086 #низкоуровневое_программирование #agalilov #прерывания #стек #видеобуфер #ассемблер #ассемблер_для_начинающих #мультизадачность
-
Низкоуровневое программирование под 8086 для любопытных, часть 1
В первой части мы: - посмотрим, как работать с памятью и регистрами 8086 - узнаем, как написать простую программу на ассемблере прямо в отладчике - изучим работу механизма прерываний и сделаем демонстрационный пример Статья рассчитана на тех, кто имеет начальный опыт программирования, но хочет понять основы низкоуровневого программирования и многозадачности. Примеры в бинарном виде доступны по ссылке https://github.com/galilov/habr/blob/main/asm-8086-galilov.zip .
https://habr.com/ru/articles/902412/
#Assembler #i8086 #низкоуровневое_программирование #agalilov #прерывания #стек #видеобуфер #регистры #ассемблер #ассемблер_для_начинающих
-
Чистовики патриарха. О трёх последних книгах Олега Цилюрика
Привет, Хабр! На связи Олег Сивченко @OlegSivchenko редактор направления «Компьютерная литература». Наша первая статья в корпоративном блоге вызвала ваш огромный интерес (+122) и оживлённое обсуждение с участием 30 пользователей (считая нас). На наш взгляд, вас заинтересовал вопрос авторских черновиков и доработки их до полноценных рукописей. Развивая тему, связанную со свободным ПО, хочу рассказать вам сразу о трёх наших знаковых книгах, посвящённых операционной системе Linux. Эти книги написал легендарный харьковский программист Олег Иванович Цилюрик (1951 — 2024), к сожалению, не дождавшийся выхода в свет 2-го издания своей книги « Linux и Go. Эффективное низкоуровневое программирование » ( оглавление ). Opus Magnum, принадлежащий его перу и вышедший у нас в марте 2023 года, называется « Расширения ядра Linux. Драйверы и модули » ( оглавление ). Кроме того, мы выпустили экзотический и по-своему незаменимый труд Олега Ивановича, который называется « Сети Linux. Модели и приложения » ( оглавление ), посвящённый настройке, эксплуатации и внутренней организации оверлейной сети Yggdrasil (октябрь 2023). Эта книга очень хорошо вписалась по духу и уровню в разрабатываемую нишу кибербезопасности , и, судя по отзывам на маркетплейсах , незаменима в нашу эпоху не столь свободного Интернета. Наконец, Олег Иванович самоотверженно справился с переводом одной книги O’Reilly —« Изучаем eBPF: программирование ядра Linux для улучшения безопасности, сетевых функций и наблюдаемости », вышедшей у нас в июле 2024 года. Давайте расскажу о двух из этих книг немного подробнее.
https://habr.com/ru/companies/bhv_publishing/articles/950970/
#Linux #unix #книги #разработка_ядра #Golang #низкоуровневое_программирование
-
Ассемблер: рассматриваем каждый байт «Hello, World!». Как на самом деле работают программы на уровне процессора и ОС
Что на самом деле происходит, когда вы запускаете программу? Мы привыкли воспринимать это как данность, но за кадром скрывается целая вселенная — от регистров процессора и системных вызовов Linux до формата ELF и модели памяти процесса. Присоединяйтесь к погружению, где мы прольём свет на каждый байт программы «Hello, World!» и поймём, каким образом ОС её выполняет.
https://habr.com/ru/companies/timeweb/articles/940310/
#linux #системный_вызов #ассемблер #виртуальная_память #компиляция #elf #библиотеки #си #низкоуровневое_программирование #timeweb_статьи
-
[Перевод] Как избегать типичных ошибок при встраивании ассемблерных вставок: подборка правил
Ассемблерные вставки, используемые компиляторами GCC и Clang, опосредуют взаимодействие высокоуровневых и низкоуровневых языков программирования. Это тонкая и коварная штука. Многие попадают в расставленные здесь капканы, зачастую совершенно неожиданно для себя. В сущности, ключевое слово asm можно перевести на C и C++ как unsafe . Почти в любых руководствах по встроенному ассемблеру, в том числе, и на ужасной странице ibilio , которая десятилетиями попадает в самый верх поисковой выдачи, неисправимо фигурируют фундаментальные серьёзные ошибки, а примеры в большинстве своём некорректны . Наиболее опасно, что эти примеры обычно приводят к ожидаемым результатам! Ситуация плачевная. Эта статья — не руководство, а подборка элементарных правил, которые помогут вам избежать самых распространённых ошибок либо отловить их при ревью кода. Здесь мы сосредоточимся сугубо на расширенном , а не на базовом ассемблере , а правила в этих версиях отличаются. На первом пишут любые инструкции, относящиеся к встроенному ассемблеру, с ограничениями или затираемыми. То есть, имеем токен : в обрамлении asm . Базовый ассемблер — тупой инструмент, который используется сравнительно нечасто, в основном в самом верху файла с кодом или в “голых” функциях . Поэтому злоупотребления базовым ассемблером на практике маловероятны.
https://habr.com/ru/articles/869544/
#ассемблер #компиляторы #оптимизация #низкоуровневое_программирование #системные_вызовы
-
Суслик и пингвин: кодим на Go под Linux
Язык ядра Linux, его модулей и утилит написаны на языке C. Хоть он и является старым языком и прародителем многих других, но его до сих пор используют. В экосистему линукса постепенно проникают и более молодые языки — например, Rust. Но сегодня мы поговорим об детище Google — GoLang. Я много пишу про этот замечательный язык и в этой статье предлагаю изучить основы системного программирования на Go, мы изучим как работать с ядром, юзерспейсом линукса. Расскажу об стандарте POSIX, а также узнаем, как сочетать C и Go-код.
https://habr.com/ru/articles/811587/
#асинхронность #корутины #горутины #сопрограммы #open_source #linux #go #golang #низкоуровневое_программирование #мультипоточность #параллельность #C #C++
-
[Перевод] Исследуем «вредоносную» флешку RJ45
Обратная разработка аппаратного обеспечения бывает очень сложна — но иногда для неё может потребоваться только уютное кресло и Google Translate. Просматривая заголовки, связанные с информационной безопасностью, следует исходить из того, что сообщения о распространённом саботаже, нарушающем цепи поставок обычно ложные. Нет, я не утверждаю, что атака такого рода не может произойти; просто подобные фокусы сложны, времязатратны и рискованны. К такому прибегаешь, только если других вариантов не осталось. Как правило, гораздо проще выкрасть учётные данные или заставить кого-нибудь скачать вредоносный файл. Недавно юный предприниматель взбаламутил соцсети, заявив, что приобретённый им в Китае девайс для подключения Ethernet-to-USB сразу был начинён вредоносом, который «ускользал от виртуальных машин», «считывал клавиатурный ввод» и «использовал характерные русскоязычные элементы». Считайте, что я этого не говорил.
https://habr.com/ru/articles/875124/
#флэшпамять #реверсинжиниринг #железо #usb #низкоуровневое_программирование #разборка
-
Низкоуровневое программирование под 8086 для любопытных, часть 2
В этой части нас ждёт погружение в один из способов организации мультипоточности на базе единственного ядра процессора. Мы научимся принудительно переключать выполнение между полностью зацикленными участками кода, ничего не "знающими" о каком-то другом коде, конкурирующем за процессорное внимание. По ходу повествования будут даны все необходимые пояснения и читателю не придётся обращаться к другим источникам, кроме первой части статьи.
https://habr.com/ru/articles/907312/
#assembler #i8086 #низкоуровневое_программирование #agalilov #прерывания #стек #видеобуфер #ассемблер #ассемблер_для_начинающих #мультизадачность
-
Низкоуровневое программирование под 8086 для любопытных, часть 2
В этой части нас ждёт погружение в один из способов организации мультипоточности на базе единственного ядра процессора. Мы научимся принудительно переключать выполнение между полностью зацикленными участками кода, ничего не "знающими" о каком-то другом коде, конкурирующем за процессорное внимание. По ходу повествования будут даны все необходимые пояснения и читателю не придётся обращаться к другим источникам, кроме первой части статьи.
https://habr.com/ru/articles/907312/
#assembler #i8086 #низкоуровневое_программирование #agalilov #прерывания #стек #видеобуфер #ассемблер #ассемблер_для_начинающих #мультизадачность
-
Низкоуровневое программирование под 8086 для любопытных, часть 2
В этой части нас ждёт погружение в один из способов организации мультипоточности на базе единственного ядра процессора. Мы научимся принудительно переключать выполнение между полностью зацикленными участками кода, ничего не "знающими" о каком-то другом коде, конкурирующем за процессорное внимание. По ходу повествования будут даны все необходимые пояснения и читателю не придётся обращаться к другим источникам, кроме первой части статьи.
https://habr.com/ru/articles/907312/
#assembler #i8086 #низкоуровневое_программирование #agalilov #прерывания #стек #видеобуфер #ассемблер #ассемблер_для_начинающих #мультизадачность
-
Низкоуровневое программирование под 8086 для любопытных, часть 1
В первой части мы: - посмотрим, как работать с памятью и регистрами 8086 - узнаем, как написать простую программу на ассемблере прямо в отладчике - изучим работу механизма прерываний и сделаем демонстрационный пример Статья рассчитана на тех, кто имеет начальный опыт программирования, но хочет понять основы низкоуровневого программирования и многозадачности. Примеры в бинарном виде доступны по ссылке https://github.com/galilov/habr/blob/main/asm-8086-galilov.zip .
https://habr.com/ru/articles/902412/
#Assembler #i8086 #низкоуровневое_программирование #agalilov #прерывания #стек #видеобуфер #регистры #ассемблер #ассемблер_для_начинающих
-
Низкоуровневое программирование под 8086 для любопытных, часть 1
В первой части мы: - посмотрим, как работать с памятью и регистрами 8086 - узнаем, как написать простую программу на ассемблере прямо в отладчике - изучим работу механизма прерываний и сделаем демонстрационный пример Статья рассчитана на тех, кто имеет начальный опыт программирования, но хочет понять основы низкоуровневого программирования и многозадачности. Примеры в бинарном виде доступны по ссылке https://github.com/galilov/habr/blob/main/asm-8086-galilov.zip .
https://habr.com/ru/articles/902412/
#Assembler #i8086 #низкоуровневое_программирование #agalilov #прерывания #стек #видеобуфер #регистры #ассемблер #ассемблер_для_начинающих
-
Низкоуровневое программирование под 8086 для любопытных, часть 1
В первой части мы: - посмотрим, как работать с памятью и регистрами 8086 - узнаем, как написать простую программу на ассемблере прямо в отладчике - изучим работу механизма прерываний и сделаем демонстрационный пример Статья рассчитана на тех, кто имеет начальный опыт программирования, но хочет понять основы низкоуровневого программирования и многозадачности. Примеры в бинарном виде доступны по ссылке https://github.com/galilov/habr/blob/main/asm-8086-galilov.zip .
https://habr.com/ru/articles/902412/
#Assembler #i8086 #низкоуровневое_программирование #agalilov #прерывания #стек #видеобуфер #регистры #ассемблер #ассемблер_для_начинающих
-
Тайны пингвина: как работают исключения и прерывания в Linux?
Привет, хабр! Моя прошлая статья о работе памяти в Linux вам понравилась. Сегодня мы разберем работу исключений и прерываний. Что это, как они работают в ОС и Linux? Давайте разберемся вместе!
https://habr.com/ru/companies/timeweb/articles/780082/
#timeweb_статьи #linux #unix #операционные_системы #системное_программирование #низкоуровневое_программирование #прерывания #исключения #ядро_linux
-
[Перевод] От математики к машине: преобразуем функцию в машинный код
В этом посте будет исследовано, как математическую концепцию можно постепенно переформулировать во всё более «вычислительных» понятиях, от высокоуровневого языка, далее до машинного кода и, наконец, до прямого исполнения компьютером. Для этого определю одну и ту же логику в нескольких разных, но перекликающихся друг с другом форматах: 1. Математика – чистая математика 2. Haskell – язык для функционального программирования 3. C – язык для императивного программирования 4. Ассемблер – сравнительно удобочитаемое представление машинного кода 5. Машинный код для архитектуры x86-64 – вот это уже интересно Если вам интересно, какие отличия бывают между языковыми стилями или любопытно, как ваш код может выглядеть после компиляции — добро пожаловать под кат!
https://habr.com/ru/articles/942064/
#ассемблер #математика #факториал #низкоуровневое_программирование #haskell
-
Низкоуровневый АД: пшием ОС. Часть 2 — модули и ввод
Всем здрасте, и сегодня у нас продолжение низкоуровневого программирования. В этой части мы все разобьем на модули, а так же напишем ввод, благодаря чем мы сможем сделать маленькую командную оболочку! Дописывать ОС
-
[Перевод] Программа «Hello World» на машинном коде под DOS
Как-то раз я послушал следующее интересное выступление (по-немецки): https://media.ccc.de/v/ds24-394-linux-hello-world-nur-mit-einem-hex-editor В нём разобрано, как написать программу «hello world» для 64-разрядного дистрибутива Linux в шестнадцатеричном редакторе. Ассемблер здесь не используется, программа пишется непосредственно на машинном коде. Правда, в ней есть издержки на использование ELF . Мне понравилась такая идея, и я решил повторить такой опыт, но немного в иной форме – а именно, под 16-разрядной DOS в реальном режиме . У меня должен был получиться файл в формате COM , а не EXE , так как (на данном этапе) меня интересовал не столько формат файла, сколько кодировка инструкций. В вышеупомянутой лекции, если честно, не сообщается почти никаких подробностей о том, как именно перейти от ассемблерного кода к машинному — поскольку в случае разбора этих тем лекция, пожалуй, растянулась бы на несколько часов. Но здесь я всё разберу подробно, и при этом собираюсь пользоваться только документацией lntel , а также дизассемблировать код в целях верификации. Также мы коротко поговорим о сегментации . В качестве шестнадцатеричного редактора на этот раз воспользуемся hexedit .
https://habr.com/ru/articles/934032/
#ассемблер #helloworld #память #низкоуровневое_программирование #программирование #машинный_код
-
[Перевод] Не стоит пугаться машинного кода
Моим первым языком программирования был ActionScript. Написание кода для Macromedia Flash максимально далеко от голого железа, и эта специфика работы глубоко засела в моём сознании. В результате меня интересовали преимущественно высокоуровневые языки для веб-программирования. Низкоуровневые же казались непостижимыми. Со временем я постепенно из разных источников узнавал о них всё больше, но это моё убеждение оставалось прежним. Низкоуровневые языки пугают, и машинный код подтверждал это наглядно. Когда я обращался к Google с запросом «понятный машинный код», то результат выдачи чаще представлял нечто пугающее и отталкивающее, нежели полезное для обучения. В конечном итоге я решил, что для достижения поставленных целей мне этот страх необходимо преодолеть. И результат приложенных усилий оказался для меня неожиданным. Машинный код вовсе не страшен. Если вы можете обеспечить, чтобы документ JSON соответствовал схеме JSON, то без проблем сможете писать машинный код.
https://habr.com/ru/companies/ruvds/articles/917202/
#Машинный_код #программирование #программирование_для_начинающих #assembler #низкоуровневое_программирование
-
Как устроен reflect.Value и что происходит, когда вы вызываете .Field(i)
Привет, Хабр! Сегодня разберём, как устроен reflect.Value изнутри и что на происходит, когда вы вызываете .Field(i) .
https://habr.com/ru/companies/otus/articles/913690/
#golang #низкоуровневое_программирование #работа_с_памятью_Go #отражение_в_Go #Go_reflection
-
[Перевод] Как специально написать чрезвычайно медленный код
Раз в несколько лет я устраиваю в нашей исследовательской группе челлендж «Напиши медленный код». Цель – написать код с минимально работоспособным количеством инструкций на цикл (IPC) с условием, чтобы этот код выполнялся на заранее подобранном сервере с архитектурой x86. На первый взгляд, это абсурд! В сущности, так и есть. Однако, есть в этой безумной задаче и некоторая методическая ценность. Инженеры, проектирующие процессоры, прилагают все усилия ради достижения наивысшего возможного IPC… даже для очень неэффективного кода . Так и задумано, что писать код с очень высоким показателем IPC непросто . Следовательно, челлендж “Напиши медленный код” оказывается заковыристым упражнением, вынуждающим задумываться, как именно работает процессор, и как применить себе на пользу его острые углы.
https://habr.com/ru/articles/906144/
#ассемблер #x86 #производительность #челлендж #низкоуровневое_программирование