• Эксперименты с malloc

      image

      Как известно, в современных архитектурах x86(_64) и ARM виртуальная память процесса линейна и непрерывна, ибо, к счастью, прошли времена char near* и int huge*. Виртуальная память поделена на страницы, типичный размер которых 4 KiB, и по умолчанию они не отображены на физическую память (mapping), так что работать с ними не получится. Чтобы посмотреть текущие отображённые интервалы адресов у процесса, в Linux смотрим /proc/<pid>/maps, в OS X vmmap <pid>. У каждого интервала адресов есть три вида защиты: от исполнения, от записи и от чтения. Как видно, самый первый интервал, начинающийся с load address (соответствующий сегменту .text у ELF в Linux, __TEXT у Mach-O в OS X), доступен на чтение и исполнение — очень логично. Ещё можно увидеть, что стек по сути ничем не отличается от других интервалов, и можно быстро вычислить его размер, вычтя из конечного адреса начальный. Отображение страниц выполняется с помощью mmap/munmap, а защита меняется с помощью mprotect. Ещё существуют brk/sbrk, deprecated древние пережитки прошлого, которые изменяют размер одного-единственного интервала «данных» и в современных системах эмулируются mmap’ом.

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

      • оптимально управляет уже выделенной памятью;
      • значительно уменьшает количество обращений к ядру (ведь mmap / sbrk — это syscall);
      • вообще абстрагирует программиста от виртуальной памяти, так что многие пользуются malloc’ом, вообще не подозревая о существовании страниц, таблиц трансляции и т. п.

      Довольно теории! Будем щупать malloc на практике. Проведём три эксперимента. Работа будет возможна на POSIX-совместимых операционках, в частности была проверена работа на Linux и на OS X.
      Читать дальше →
    • Подготовка к собеседованиям в IT-гиганты: как я преодолела проклятье алгоритмического собеседования


      Дисклеймер:


      Я не программирую с трёх лет, не знаю наизусть Кнута, не являюсь призёром олимпиад по информатике и чемпионатов по спортивному программированию, не училась в MIT. У меня за плечами образование по информатике и 6 лет опыта в коммерческой разработке. И до недавнего времени я не могла пройти дальше первого технического скрининга в IT-гиганты из FAANG (Facebook, Amazon, Apple, Netflix, Google и подобные), хотя предпринимала несколько попыток. 

      Но теперь всё изменилось, я получила несколько офферов и хочу поделиться опытом, как можно к этому прийти. Речь пойдёт о позиции Software Engineer в европейских офисах перечисленных компаний.
      Читать дальше →
    • Массовая оптимизация запросов PostgreSQL. Кирилл Боровиков (Тензор)

        В докладе представлены некоторые подходы, которые позволяют следить за производительностью SQL-запросов, когда их миллионы в сутки, а контролируемых серверов PostgreSQL — сотни.

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


        Кому интересен разбор конкретных проблем и разные техники оптимизаций SQL-запросов и решения типовых DBA-задач в PostgreSQL — можно также ознакомиться с серией статей на эту тему.
        Читать дальше →
      • Мелкая питонячая радость #8: мелкие удовольствия для работы с БД

          Беглый опрос коллег на моем текущем проекте показал, что при словах "ORM и работа с БД" в подавляющем большинстве случаев звучат слова "Алхимия" и "Django ORM". Знания этих двух слов, в общем, достаточно, чтобы писать чистый, аккуратный и рабочий код. Но расширение инженерного кругозора пока еще никому не вредило, поэтому сегодня мы добавим в нашу картину мира несколько (возможно, до этого дня незнакомых) классных штук для работы с БД.


          Читать дальше →
        • CreateRemoteThread для Linux

          • Tutorial

          Мицуха несёт новые потокиВ WinAPI есть функция CreateRemoteThread, позволяющая запустить новый поток в адресном пространстве другого процесса. Её можно использовать для разнообразных DLL-инъекций как с нехорошими целями (читы в играх, кража паролей, и т. д.), так и для того, чтобы на лету исправить баг в работающей программе, или добавить плагины туда, где они не были предусмотрены.


          В целом эта функция обладает сомнительной прикладной полезностью, поэтому не удивительно, что в Linux готового аналога CreateRemoteThread нет. Однако, мне было интересно, как он может быть реализован. Изучение темы вылилось в неплохое приключение.


          Я подробно расскажу о том, как с помощью спецификации ELF, некоторого знания архитектуры x86_64 и системных вызовов Linux написать свой маленький кусочек отладчика, способный загрузить и исполнить произвольный код в уже запущенном и работающем процессе.


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

          Читать дальше →
        • Объясняя необъяснимое. Часть 4

          • Translation
          Конференция PG Day’16 с каждым днем всё ближе, а мы продолжаем публиковать серию статей Hubert Lubaczewski об анализе explain и его основных операциях.

          В этом, надеюсь, предпоследнем посте серии я расскажу об оставшихся наиболее распространенных операциях, которые вы можете встретить в выводе explain.


          Читать дальше →
          • +14
          • 15.8k
          • 4
        • Доступ к таблицам из Си расширений для Postgres

          • Tutorial

          Всем привет!


          В этот раз я расскажу не про использование Python или очередной трюк с CSS/HTML и, увы, не про то, как я 5 лет портировал Вангеры, а про один важный аспект написания расширений для замечательной СУБД PostgresSQL.

          На самом деле, уже есть достаточно много статей о том, как написать расширение для Postgres на Си (к примеру, эта), в том числе и на русском языке. Но, как правило, в них описываются достаточно простые случаи. В этих статьях и инструкциях авторы реализуют функции, которые получают на вход данные, как-то их обрабатывают, а затем возвращают одно число, строку или пользовательский тип. В них нет пояснений, что делать, если из Си кода нужно пробежаться по обычной таблице, существующей в базе, или индексу.

          К таблицам из Си можно получить доступ через хорошо описанный но медленный SPI (Server Programming Interface), также есть очень сложный способ, через буферы, а я расскажу про компромиссный вариант. Под катом я постарался дать примеры кода с подробными пояснениями.
          Читать дальше →
          • +21
          • 8.6k
          • 3
        • Каждому яду — свой антидот. Как спастись или хотя бы попытаться (upd: про противоядия при бытовых отравлениях)

          • Tutorial
          Всем бойцам РХБЗ (радиационной, химической и биологической защиты) не посрамившим честь своего ОЗК посвящается...

          С интересом читая статьи коллеги gjf про самые интересные, самые страшные и самые нестрашные яды испытываю ностальгию :). Потому что любой правильный химик, начиная свой творческий путь в первую очередь интересуется либо ядами, либо взрывчатыми веществами, либо наркотиками. Вот не встречал людей, которых в химию бы привело что-то другое, честно. Правда с годами, если хобби становится профессией, вся информация как-то переосмысливается и упорядочивается, возникают совершенно иные приоритеты. Вот и теперь, читая упомянутые статьи я вспоминал свой бумажный блокнотик, в котором в том числе были и описания необычных ядов. Все течет, все изменяется, теперь в моем «рабочем» блокноте чаще встречаются «противоядия». Ибо человеком придуманы тысячи способов уничтожить жизнь и пока не придумано ни одного — ее создать. Сила — в равновесии, поэтому если на Хабре есть яды — должны быть и противоядия. Ну и проснулся ж во мне перманентно дремлющий сержант белорусского РХБЗ. Статья коротенькая, почти без воды, но может так оказаться, что жизненно важная (=«закладочная», FAQ по метанолу)! За противоядием — идем под кат.


          Читать дальше →
        • HBO, cпасибо что напомнил… «Чернобыльская аптечка» беларуского фармацевта

          • Tutorial
          Что бы ни сказали — не станем спорить
          Что бы ни дарили — не станем верить

          Егор Летов «Как листовка»

          Думаю не стоит лишний раз говорить о нашумевшем сериале Чернобыль и эффективности такого «сериального» воздействия на массы. Особенно на массы, проживающие на территориях, показанных в фильме. Выход каждой новой серии сопровождается всплеском публикаций в FB. В каждой из которых горечь, страх, боль. Что в такой ситуации я могу сделать ("кто виноват и что делать?")? Могу только описать свой взгляд на терапию лучевых поражений. Спасибо родненькой кафедре химии высоких энергий и проф. Шадыро О.И., которые пестовали в своих лабораториях нас, непутевых фармацевтов-радиохимиков. Надеюсь своей статьей честь этой, легендарной некогда, кафедры я не опорочу.

          Ну и пишу, пишу, потому что стали забывать… Пугающе быстро стали забывать. Сначала в аптеках исчез йодид калия (я уж не говорю про описываемые в статье антидоты), потом так же неотвратимо исчезли льготы у ликвидаторов, знания у людей и т.д. и т.п.

          В общем, спасибо, сценаристы HBO, за то, что всколыхнули Память. Мой посильный вклад — под катом. Рейтинг доступных (и не очень) антидотов, способных сработать при радиационном выбросе. В закладки — класть строго ВСЕМ! И прочитал сам — перекинь другу.

          Читать дальше →
        • Кто такие дата-инженеры, и как ими становятся?

          • Translation
          И снова здравствуйте! Заголовок статьи говорит сам о себе. В преддверии старта курса «Data Engineer» предлагаем разобраться в том, кто же такие дата-инженеры. В статье очень много полезных ссылок. Приятного прочтения.



          Простое руководство о том, как поймать волну Data Engineering и не дать ей затянуть вас в пучину.

          Складывается впечатление, что в наши дни каждый хочет стать дата-саентистом (Data Scientist). Но как насчет Data Engineering (инжиниринга данных)? По сути, это своего рода гибрид дата-аналитика и дата-саентиста; дата-инженер обычно отвечает за управление рабочими процессами, конвейерами обработки и ETL-процессами. Ввиду важности этих функций, в настоящее время это очередной популярный профессиональный жаргонизм, который активно набирает обороты.

          Высокая зарплата и огромный спрос — это лишь малая часть того, что делает эту работу чрезвычайно привлекательной! Если вы хотите пополнить ряды героев, никогда не поздно начать учиться. В этом посте я собрал всю необходимую информацию, чтобы помочь вам сделать первые шаги.

          Итак, начнем!
          Читать дальше →
          • +8
          • 52.5k
          • 3
        • Пишем операционную систему на Rust. Реализация страничной памяти (новый вариант)

          • Translation
          В этой статье разберёмся, как реализовать поддержку страничной памяти в нашем ядре. Сначала изучим различные методы, чтобы фреймы физической таблицы страниц стали доступны ядру, и обсудим их преимущества и недостатки. Затем реализуем функцию преобразования адресов и функцию создания нового сопоставления.

          Этот цикл статей опубликован выложен на GitHub. Если у вас какие-то вопросы или проблемы, открывайте там соответствующий тикет. Все исходники для статьи лежат в этой ветке.

          Ещё одна статья о страничной организации памяти?
          Если вы следите за этим циклом, то видели статью «Страничная память: продвинутый уровень» в конце января. Но меня раскритиковали за рекурсивные таблицы страниц. Поэтому решил переписать статью, применив иной подход для доступа к фреймам.

          Читать дальше →
          • +39
          • 5.8k
          • 1
        • OS1: примитивное ядро на Rust для x86

          Я решил написать статью, а если получится — то и серию статей, чтобы поделиться своим опытом самостоятельного исследования как устройства Bare Bone x86, так и организации операционных систем. На данный момент мою поделку нельзя назвать даже операционной системой — это небольшое ядро, которое умеет загружаться из Multiboot (GRUB), управлять памятью реальной и виртуальной, а также выполнять несколько бесполезных функций в режиме многозадачности на одном процессоре.


          При разработке я не ставил себе целей написать новый Linux (хотя, признаюсь, лет 5 назад мечтал об этом) или впечатлить кого-либо, поэтому особо впечатлительных прошу дальше не смотреть. Что мне на самом деле захотелось сделать — разобраться, как устроена архитектура i386 на самом базовом уровне, и как именно операционные системы делают свою магию, ну и покопать хайповый Rust.


          В своих заметках я постараюсь поделиться не только исходными текстами (их можно найти на GitLab) и голой теорией (ее можно найти на многих ресурсах), но и тем путем, который я прошел, чтобы найти неочевидные ответы. Конкретно в этой статье я расскажу о компоновке файла ядра, его загрузке и инициализации.


          Мои цели — структурировать информацию у себя в голове, а так же помочь тем, кто идет похожим путем. Я понимаю, что аналогичные материалы и блоги уже есть в сети, но чтобы прийти к моему текущему положению, мне пришлось долго собирать их воедино. Всеми источниками (во всяком случае, которые вспомню), я поделюсь прямо сейчас.

          Читать дальше →
        • Простейшая командная строка на NASM и QEMU

          image


          Итак, сразу к делу. Писать будем под Linux, на NASM и с использованием QEMU. Установить это легко, так что пропустим этот шаг.


          Подразумевается, что читатель знаком с синтаксисом NASM хотя бы на базовом уровне (впрочем, ничего особо сложного здесь не будет) и понимает, что такое регистры.

          Читать дальше →
        • VShard — горизонтальное масштабирование в Tarantool



            Меня зовут Владислав, я участвую в разработке Tarantool — СУБД и сервера приложений в одном флаконе. И сегодня расскажу вам, как мы реализовали горизонтальное масштабирование в Tarantool при помощи модуля VShard.
            Читать дальше →
            • +58
            • 5.9k
            • 5
          • Остров Пику: как из базальтового ада сделали уютный Туссент


              Гора Пику образовалась очень задолго до прихода колонистов, ещё когда ломалась геологическая плита на Азорах. Высота Эвереста 8848 метров. А Пику — 8449 метров. Из которых 2351 метр приходятся на надводную часть, а остальное — гора под водой. То есть люди уже живут на склоне где-то в районе верхушки.

              Представьте, что вы португальский колонист. Вам достался совершенно офигенный остров, состоящий почти полностью из базальта. И совсем немного — из почвы. Куда ни ткнись, везде атмосфера, напоминающая замок «Инферно» из Героев. Если просто стоять на берегу, скоро на зубах начнёт скрипеть от базальтовой и туфовой крошки. Потому что остров образовался всего 60-70 тысяч лет назад.

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

              Потом вы живёте тут год и успеваете построить дом из окаменелой лавы. Посадить немного растений (на земле, которую вы очистили от лавы) и сделать себе новую лодку. Но не из лавы, а из дерева.

              А потом вы вдруг понимаете, какое это крутое место. И вот на вечеринку приплыл неизвестный капитан, осмотрелся, и решил, что раз вы выжили, то выживут и остальные. И так появилось первое поселение.
              Читать дальше →
            • Пишем операционную систему на Rust. Страничная организация памяти

              • Translation
              В этой статье представляем страницы, очень распространённую схему управления памятью, которую мы тоже применим в нашей ОС. Статья объясняет, почему необходима изоляция памяти, как работает сегментация, что такое виртуальная память и как страницы решают проблему фрагментации. Также исследуем схему многоуровневых таблиц страниц в архитектуре x86_64.

              Этот блог выложен на GitHub. Если у вас какие-то вопросы или проблемы, открывайте там соответствующий запрос.
              Читать дальше →
            • Я так хотел попасть в программный комитет конференции, и вот я здесь, и что мы будем делать?



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

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

                Я говорю о работе с нормальными людьми, профессионалами в своём деле, а не в выступлениях. О работе с теми, кто сам подаёт заявку на доклад через форму подачи заявок. О работе с теми, кто на самом деле обеспечивает конференциям приток свежей крови и новых знаний, без которых весь процесс очень быстро выродится.
                Читать дальше →
              • Загрузка ядра Linux. Часть 1

                • Translation
                От загрузчика к ядру

                Если вы читали предыдущие статьи, то знаете о моём новом увлечении низкоуровневым программированием. Я написал несколько статей о программировании на ассемблере для x86_64 Linux и в то же время начал погружаться в исходный код ядра Linux.

                Мне очень интересно разобраться, как работают низкоуровневые штуки: как программы запускаются на моём компьютере, как они расположены в памяти, как ядро управляет процессами и памятью, как работает сетевой стек на низком уровне и многое другое. Итак, я решил написать еще одну серию статей о ядре Linux для архитектуры x86_64.

                Обратите внимание, что я не профессиональный разработчик ядра и не пишу код ядра на работе. Это всего лишь хобби. Мне просто нравятся низкоуровневые вещи и интересно в них копаться. Поэтому если заметите какую-то путаницу или появилятся вопросы/замечания, свяжитесь со мной в твиттере, по почте или просто создайте тикет. Буду благодарен.
                Читать дальше →
              • Бэкдоры в микрокоде ассемблерных инструкций процессоров x86

                  Софту мы не доверяем уже давно, и поэтому осуществляем его аудит, проводим обратную инженерию, прогоняем в пошаговом режиме, запускаем в песочнице. Что же насчёт процессора, на котором выполняется наш софт? – Мы слепо и беззаветно доверяем этому маленькому кусочку кремния. Однако современное железо имеет те же самые проблемы, что и софт: секретную недокументированную функциональность, ошибки, уязвимости, малварь, трояны, руткиты, бэкдоры.



                  ISA (Instruction Set Architecture) x86 – одна из самых долгих непрерывно изменяющихся «архитектур набора команд» в истории. Начиная с дизайна 8086, разработанного в 1976 году, ISA претерпевает постоянные изменения и обновления; сохраняя при этом обратную совместимость и поддержку исходной спецификации. За 40 лет своего взросления, архитектура ISA обросла и продолжает обрастать множеством новых режимов и наборов инструкций, каждый из которых добавляет к предшествующему дизайну, и без того перегруженному, новый слой. Из-за политики полной обратной совместимости, в современных процессорах x86 присутствуют даже те инструкции и режимы, которые на сегодняшний день уже преданы полному забвению. В результате мы имеем архитектуру процессора, которая представляет собой сложно переплетающийся лабиринт новых и антикварных технологий. Такая чрезвычайно сложная среда – порождает множество проблем с кибербезопасностью процессора. Поэтому процессоры x86 не могут претендовать на роль доверенного корня критической киберинфраструктуры.

                  Читать дальше →
                • Как распознать кракозябры?

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

                    Итак, вуаля!


                    За источник информации была взята статья из вики. В блок-схеме «UTF-16 → CP 866» означает, что исходная кодировка была «UTF-16», а распозналась она как «CP 866».

                    Как всегда — кликабельно. Исходник в .docx: здесь.