• Не могу понять почему не работает USER тред?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему не работает USER тред?

    Потому что, опять, ты вызываешь makecontext не задав uc_link. thread_func1 отрабатывает, а дальше гонка между вызовом thread_func2 из monitor_thread и завершением программы из-за возврата из функции контекста в контексте созданном с uc_link == NULL.

    Но и без этого код выглядит загадочно. Непонятно зачем мешать в одну кучу контексты и clone. Непонятно зачем дублировать указатель на функцию в Thread::func и в Thread::context. Непонятно зачем контексты, если schedule их не использует. Непонятно, зачем monitor_thread занимается активным ожиданием Thread::active. Непонятно, зачем функции потоков лезут в потроха Thread. Короче, этому коду не хватает идеи.
    Ответ написан
  • Как раздать блочное устройство с linux-компьютера через usb-c порт?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответ написан
    Комментировать
  • Эмулятор веб-камеры для Линукса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответ написан
    Комментировать
  • Как симулировать сбои в файловой системе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как симулировать сбои в файловой системе? … Может есть уже устоявшиеся готовые файловые решения

    В тегах linux, у него есть встроенный механизм fault injection.
    Ответ написан
    Комментировать
  • Как выявить нужные данные из таблицы в отладчике Turbo Assembler при произведении трассировки программы CPU?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    у меня получилось найти только…

    Если ты нашёл машинный код, то его длину ты легко получишь посчитав символы, 6 16-ричных цифр -- это 3 байта. Ну или вычтя из адреса следующей инструкции пдрес текущей.
    Физический адрес в реальном режиме можно посчитать как cs * 10h + ip. В твоём случае получается 48ff9.
    Из твоей записи непонятно, нашёл ты значения регистров или нет, если что, вон они, в среднем окошке в верхнем ряду, а флаги -- в правом.
    Ответ написан
  • Как исправить проблему с шаблонами?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ошибки вылезают в месте оператора перегрузки () и Image operator!() возникает ошибка.

    Это правильно. Нельзя перегрузить функцию (или оператор) только типом возвращаемого значения.

    Если убрать Image operator!(), то только одна ошибка ("невозможно преобразовать const_Ty в T&")

    Приведённый код эту ошибку не воспроизводит. Но вообще ничто не мешает добавить const в определение оператора !(), поскольку ему не требуется менять исходный объект:
    Image<T> operator!() const

    Но я вижу другую ошибку: оператор вызова функции определён как константный: T& operator()(int i, int j) const, но возвращает потенциально неконстантную ссылку на внутренности объёкта -- T&. Следующий код поэтому не будет работать: result(i, j) = -_data[i][j];. Нужно либо выбросить ссылку из возвращаемого значения оператора T& operator()(int i, int j) const и переписать реализацию оператора !(), либо добавить неконстантную реализацию оператора вызова функции.
    Ответ написан
    Комментировать
  • Как правильно подменить (скопировать) скрипта в самом скрипте?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть ли способ из самого скрипта подменить сам скрипт чтобы он не портился?

    Когда cp или mv заменяет открытый интерпретатором файл, исходный файл не портится. Если интерпретатор взаимодействует с файлом через один и тот же файловый дескриптор, то никакого значения замена файла не имеет. Нужно разбираться с деталями того что портится, чтобы понять, как это пофиксить.
    Ответ написан
    Комментировать
  • Как решать подобные задачи по криптографии?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как решать подобные задачи по криптографии?

    Для начала прочитать условия и заглянуть в код. Увидеть в нём вот это:
    key_val = b""
        seed_val = plain_text[0]
        random.seed(seed_val)
        for i in range(16):
            key_val += random.randrange(1, 255).to_bytes()

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

    Флаг имеет формат вида ntcontest{FLAG_VALUE}

    Я не понял эту часть, имеется в виду, что первый символ открытого текста флага -- 'n'? Если так, то вообще решение в одно действие, если нет, то в любом случае можно организовать перебор всех возможных первых символов, генерировать по ним key_val, расшифровывать им и проверять, что первый символ полученного текста совпадает с символом использованным для генерации ключа.
    Ответ написан
    Комментировать
  • Как организована память компьютера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    мне не понятно почему рисунок не выглядит примерно следующим образом?

    Потому что числовые значения в обоих случаях должны быть одинаковыми -- 00000021 и 00000104. То что ты записал -- это 21000000 и 04010000.
    Ну и заодно, в "тексте перед рисунком" перепутаны направления нумерации байтов: на рисунке "а" байты пронумерованы, очевидно, слева направо, а на рисунке "б" -- справа налево.
    Ответ написан
  • Как исправить ошибку debian/rules build subprocess returned exit status 2?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    2 -- это "файл не найден". В приведённом логе нет самой ошибки, только её последствия. Нужно читать лог сборки раньше, чтобы понять, что произошло.
    Ответ написан
  • Реализую свойства, но почему у string требует перегрузку для cout?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Property<std::string> Name = Property<std::string>(_name);
    …
    std::cout << person.Name << std::endl;  // тут ошибки

    почему у string требует перегрузку для cout?

    Потому что Property<std::string> -- это не string. Хоть у тебя и есть Property<T>::operator T() const ничто в твоём коде не говорит о том, что Property<std::string> нужно пытаться приводить к string а не к какому-нибудь другому типу.
    Ответ написан
    1 комментарий
  • Почему не печатается?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не печатается "custom thread completed"

    Потому что thread->context.uc_link = NULL; в строке 27, а, согласно man swapcontext:
    If the successor context pointer is NULL, the thread exits.


    Исправить можно, например, так:
    int custom_thread_create(custom_thread *thread, ucontext_t *link, void (*start_routine)(void*), void *arg) {
        …
        thread->context.uc_link = link;
        …
    }
    …
        ucontext_t main_context;
        getcontext(&main_context);
    
        if (custom_thread_create(&thread, &main_context, print_message, (void*)message) == 0) {
    …
    Ответ написан
  • Почему SFML не линкуется к проекту?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Собрал SFML из исходников…
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl sf::VideoMode::VideoMode(unsigned int,unsigned int,unsigned int)" (__imp_??0VideoMode@sf@@QEAA@III@Z) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __cdecl sf::WindowBase::isOpen(void)const " (__imp_?isOpen@WindowBase@sf@@QEBA_NXZ) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __cdecl sf::WindowBase::pollEvent(class sf::Event &)" (__imp_?pollEvent@WindowBase@sf@@QEAA_NAEAVEvent@2@@Z) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl sf::Window::Window(class sf::VideoMode,class sf::String const &,unsigned int,struct sf::ContextSettings const &)" (__imp_??0Window@sf@@QEAA@VVideoMode@1@AEBVString@1@IAEBUContextSettings@1@@Z) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl sf::Window::~Window(void)" (__imp_??1Window@sf@@UEAA@XZ) referenced in function main
    main.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual void __cdecl sf::Window::close(void)" (__imp_?close@Window@sf@@UEAAXXZ) referenced in function main

    В моей версии sfml эти символы определены в библиотеке sfml-window, которой у вас нет.
    Ответ написан
  • Как узнать новый ли жесткий диск?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    start/stop count 4

    Его, похоже, включали всего дважды.

    Erase Time ~ 3 hours 30 minutes

    Это время требуемое для секьюрного стирания диска заблокированного паролем, к истории использования не имеет отношения.
    Ответ написан
    8 комментариев
  • Утечка памяти gdiplus?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что я должен удалять или очищать и как я должен это делать?

    MSDN говорит, что у каждого GdiplusStartup должен быть парный вызов GdiplusShutdown.
    Ответ написан
    1 комментарий
  • Почему файл не выполняется под пользователем user1?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Биты setuid/setgid не работают со скриптами. Они работают только с двоичными исполняемыми файлами. Скрипт -- это текстовый файл интерпретируемый другой программой. Чтобы выполнить скрипт под другим пользователем воспользуйтесь командой sudo.
    Ответ написан
    Комментировать
  • Где найти такую CLI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Хочется как-то отойти от указания всех параметров а считать что есть некий контекст.

    Я вот так делаю в подобных случаях. Т.е. загружаю конфигурацию из конфиг-файла если он есть, а потом поверх неё -- из параметров командной строки. Среди которых могут быть другие конфиг-файлы.
    Ответ написан
    Комментировать
  • Где хранить iv, если я могу запомнить только пароль?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    где обязательным условием для расшифровки является наличие iv.

    А именно, того же IV, что был использован при шифровании.

    какие есть варианты решения данной проблемы?

    - использовать фиксированный IV (например все нули).
    - генерировать его из хранимых данных (например какой-нибудь хеш от пароля). В википедии упоминается похожий вариант: "a cipher or a hash function is used to generate the IVs from the key and the current sector number".
    - использовать режим CTR.
    Ответ написан
    Комментировать
  • Ассемблер, почему дизассемблированном коде много ненужных операций?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не переписать вместо этого
    add ebx,dword ptr [rbp+ECX*4+10h]

    Буквально так написать нельзя, потому что нет такого режима адресации в котором можно было бы использовать вместе Rbp (64-битный) и Ecx (32-битный). Можно было бы написать add ebx,dword ptr [rbp+rcx*4+10h], но для этого счётчик цикла должен был бы быть 64-битным, а он, как мы видим, 32-битный (int i). Т.е. ответ на вопрос "для чего это": для беззнакового расширения 32-битного счётчика цикла в регистр, который можно использовать для доступа к памяти.

    Другое дело, что из исходного кода очевидно, что при обращениях к памяти i не выходит из диапазона 0..9, так что разницы между ecx и rcx нет и не может быть. Возможно я что-то упускаю и у компилятора другое мнение на этот счёт, но может быть он просто туповат и не имеет кода который бы мог использовать эту возможность оптимизации, а может такая оптимизация и есть, но она не была включена во время генерации этого кода.
    Ответ написан
    Комментировать
  • Как эмуляторы транслируют клиентский код в машинный?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Когда эмулятор собирает и компилирует код jit, то как он этот код в машинных инструкциях составляет.

    Если ты посмотришь на QEMU, то у него есть фронт-енды (https://github.com/qemu/qemu/tree/v8.1.0/target), каждый из которых транслирует инструкции эмулируемой машины в промежуточный код. И есть бэк-енды (https://github.com/qemu/qemu/tree/v8.1.0/tcg), каждый из которых транслирует инструкции промежуточного кода в инструкции хостовой машины. Каждая гостевая инструкция может превратиться во множество промежуточных, а каждая промежуточная -- во множество хостовых. У разработчиков есть правило, что если на гостевую инструкцию требуется больше 20 промежуточных, то вместо прямой трансляции такая инструкция реализуется как вызов функции на C. Инструкции транслируются базовыми блоками, с заданного адреса и до достижения одного из следующих условий: 1) встречена инструкция выполняющая переход (условный или безусловный, вызов функции, возврат из функции, сюда же относятся инструкции гарантированно вызывающие исключение), или 2) PC переходит через границу страницы виртуальной памяти, или 3) количество инструкций в базовом блоке превышает заданный предел. Вдобавок с каждым оттранслированным базовым блоком ассоциируется дополнительный набор флагов, определяемый фронт-ендом, который кодирует состояние, в котором была машина при трансляции этого кода. Это позволяет иметь несколько вариантов трансляции для кода начинающегося с одного и того же адреса, например для разных уровней привилегий. Оттранслированные базовые блоки помещаются в кеш с функцией поиска по комбинации адреса и дополнительного набора флагов. В цикле выполнения эмулятор ищет транслированный базовый блок кода в кеше (а если не находит его, то транслирует и помещает в кеш), запускает его и получает контроль после завершения его выполнения.

    надо к примеру Перед выполнением каждой инструкции проверять наличие прерывания

    Вовсе не каждой, даже в 100% точной эмуляции нужно проверять IRQ только когда прерывания разрешены. QEMU обычно проверяет запрос на прерывание только перед входом в оттранслированный базовый блок.

    Или же есть несколько блоков, где линейно выполняется весь блок, а последняя инструкция прыгнет в другой блок.

    Да, QEMU выполняет трансляцию базовыми блоками.

    к примеру для вот такого примера графа, сколько базовых блоков можно построить?

    В этом графе не обозначены безусловные переходы, если их нет, то QEMU мог бы выделить такие базовые блоки: 0-1-2-3, 4-5-6, 7-8-1-2-3, 9-10, 11-12-13, 14-15-16-2-3, 17, всего 7 блоков.
    Если безусловные переходы -- это все переходы от узлов с бОльшими номерами к узлам с меньшими, то картина была бы такой: 0-1-2-3, 4-5-6, 7-8, 1-2-3, 9-10, 11-12-13, 14-15-16, 2-3, 17. Да, фрагмент 2-3 оттранслирован три раза: сам по себе и в составе других блоков.
    Ответ написан
    2 комментария