Задать вопрос
Ответы пользователя по тегу Системное программирование
  • Как происходит управление перемещением программ в пользовательском пространстве?

    @Mercury13
    Программист на «си с крестами» и не только
    Программа туда не уместится, если не предусмотрено способа разбить её пополам. Перемещение происходит, если её адрес по умолчанию чем-то не нравится: или занят, или надо утрамбовать адреса плотнее (было важно в эпоху DOS), или…

    А пока — три важных ремарки.
    1. В пользовательском пространстве у нас 2 гигабайта или больше виртуальной памяти, и она условно «пуста»: в любых адресах этой памяти можно разместить что угодно. Но если мы обратимся к отсутствующей странице, получим аварийный останов — такова уж издержка виртуальности. Сначала надо обратиться к системному менеджеру памяти, и он выдаст рабочий диапазон адресов.
    2. Программа перемещается посегментно.
    3. Есть два главных способа перемещения программы: адресация от IP и relocations.

    Адресация от IP работает, понятное дело, если исходный и целевой адрес в одном сегменте. По какому адресу ни располагай сегмент — адреса от IP менять не надо. В x86, НЯЗ, она работает в одном-единственном случае: короткие переходы (±127 байтов). Ветвления все короткие, а если нужно ветвиться далеко — ответвляется на безусловный переход, который уносит далеко-далеко.

    В x64 режим адресации от IP есть во всех обращениях к памяти, переходах и вызовах, но только на ±2Г (точно не в курсе).

    Во всех версиях x86 базовый адрес при адресации от IP — это конец текущей команды, не начало.

    Relocations — это ремарки: сегмент 1 рассчитан на базовый адрес 12. Если он другой — подкорректируй адреса 34 и 56. Независимо от метода адресации — от IP или абсолютного. Если сегмент загрузился не по штатному адресу — например, 23 — к числам по адресам 34 и 56 прибавляем разницу 11. Скажем, было 78, стало 89.

    В архитектурах с сегментной памятью (x86-16) эта самая сегментная память — также метод перемещения программы. Старый добрый COM-файл имел абсолютные адреса, но только от начала текущего сегмента — и представлял собой исключительно машинный код, загружаемый по адресу не то 128, не то 256 (вот не помню). А перемещение его по памяти сводится к установке нужных значений в сегментные регистры SS/CS/DS/ES.
    (Да, *.COM не имел вообще никакого формата, это просто куча кода и данных, которая 1:1 грузится в память.)
    Ответ написан
    4 комментария
  • Можно ли написать такой драйвер под windows?

    @Mercury13
    Программист на «си с крестами» и не только
    vjoystick.sourceforge.net/site
    www.headsoft.com.au/index.php?category=vjoy
    Авось что-нибудь придумаете с этими драйверами. У обоих есть SDK.

    Есть ещё PPJoy, но сайт его какой-то мутный.

    Ну и, как сказал 123459, бывает проще сделать HID-устройство прямо внутри Arduino.
    Ответ написан
    Комментировать
  • Почему не возможен синхронизованный вывод двух потоков при использовании двух мутексов?

    @Mercury13
    Программист на «си с крестами» и не только
    А точно нельзя?
    Я бы сделал так…

    Поток 1.
    мютекс2.войди
    поток2.старт
    повторяй 10 раз
      мютекс1.войди
      writeln
      мютекс2.выйди
    поток2.дождись
    мютекс2.выйди

    Поток 2.
    повторяй 10 раз
      мютекс2.войди
      writeln
      мютекс1.выйди

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

    Единственное спорное «средство синхронизации» — в потоке 1 дождаться завершения потока 2.
    Ответ написан
    3 комментария