Задать вопрос
  • Что делать если истек срок годности SUB ключ?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    А как быть, если истек срок годности sub ключа, которым шифровались пароли?

    Срок годности имеет смысл для ключа которым ставят подписи. В любом случае ключ не перестанет работать от того, что у кого-то какая-то текущая дата, потому что у кого-то другого текущая дата может быть другой.

    Ну или другой вариант, украли телефон и всё.
    При этом есть секретный ключ.

    Непонятно, что ты хотел сказать. При чём тут телефон? У кого есть секретный ключ?
    Ответ написан
  • Какой приоритет операций, разворачивающихся из fold-expression?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Согласно eel.is/c++draft/expr.prim.fold#nt:fold-operator и eel.is/c++draft/temp.variadic#14 чтобы получить то что ты хотел (и что стандарт называет термином "binary left fold") вместо cout << (args << ...) << endl; надо было написать (cout << ... << args) << endl;

    почему ж в результате оно себя ведёт так, как будто скобки есть??

    Потому что у тебя получился binary right fold.

    Какой приоритет операций, разворачивающихся из fold-expression?

    Поскольку операция одна и та же, приоритет одинаковый. Свойство о котором ты говоришь называется "ассоциативность". binary right fold ассоциирует подвыражения справа налево, binary left -- слева направо.
    Ответ написан
    3 комментария
  • Почему не собирается kaldi?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вот вывод ошибки make test в директории src

    1) зачем запускать make test в каталоге src, когда у проекта есть система сборки основанная на CMake и можно запускать make test в каталоге где выполняется сборка?
    2) на ubuntu 22.04.5 c libblas-3.10.0, liblapack-3.10.0 и libatlas-3.10.3 сборка завершается успешно и make test в каталоге сборки тоже завершается успешно: 100% tests passed, 0 tests failed out of 132

    Команда компиляции для первого файла из приведённого лога с ошибкой при этом такая:
    cd /home/jcmvbkbc/tmp/tests/1390844/kaldi/build/src/matrix && /usr/bin/c++ -DHAVE_CLAPACK=1 -DKALDI_NO_PORTAUDIO=1 -Dkaldi_matrix_EXPORTS -I/home/jcmvbkbc/tmp/tests/1390844/kaldi/build/_deps/openfst-src/src/include -I/home/jcmvbkbc/tmp/tests/1390844/kaldi/tools/CLAPACK -I/home/jcmvbkbc/tmp/tests/1390844/kaldi/src/matrix/.. -I/home/jcmvbkbc/tmp/tests/1390844/kaldi/src/base/.. -fPIC -std=c++14 -MD -MT src/matrix/CMakeFiles/kaldi-matrix.dir/kaldi-matrix.cc.o -MF CMakeFiles/kaldi-matrix.dir/kaldi-matrix.cc.o.d -o CMakeFiles/kaldi-matrix.dir/kaldi-matrix.cc.o -c /home/jcmvbkbc/tmp/tests/1390844/kaldi/src/matrix/kaldi-matrix.cc
    Ответ написан
    1 комментарий
  • Как link`овать fasm + c(++)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    я починил эту ос, теперь хотел понемногу добавлять C, т.к. на чистом ассемблере далеко не уйдешь. Если получится запустить хоть Hello, World! - буду очень благодарен

    Я положил эту ос на github и приделал к ней Makefile и hello world на C: https://github.com/jcmvbkbc/toster-1388736
    Потестировать можно набрав make run и введя команду hello в консоли внутри qemu.

    Я, однако, не стал интегрировать этот код на С с кодом на ассемблере. Потому что у кода на ассемблере есть пара проблем:
    - код на ассемблере хардкодит координаты бинарников на диске, загружает их в фиксированные адреса в памяти и переходит прямо на них. Это стрёмная практика, я не стану её поощрять.
    - этот код 16-битный, для реального режима, можно, конечно, растить его дальше, но куда практичнее было бы переключиться в нормальный защищённый режим, 32- или 64-битный, что одно, что другое не так уж сложно.
    - код "ядра" не предоставляет никаких сервисов "приложениям", он только загружает их в память и запускает. Фактически это не ядро а загрузчик для baremetal приложений.

    Иными словами, в ответ на вопрос из топика "Как link`овать fasm + c(++)?" скажу, что в данном случае линковать, в смысле используемом в контексте компиляторов, не имеет смысла.
    Ответ написан
    7 комментариев
  • Почему не работает препроцессорное ветвление в GAS?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не работает препроцессорное ветвление в GAS?
    .macro my_macro arg1,arg2
    ...
    .if arg2 == 1


    Нужно добавить \ чтобы gas выполнил макроподстановку: .if \arg2 == 1.
    Ответ написан
    Комментировать
  • Почему приходит прерывание 0x20 в QEMU сразу после запуска ядра?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может это нормальное поведение или проблема не с контроллером?

    INT 0x20 это IRQ0 в твоей конфигурации, как я понимаю. IRQ0 на PC обычно таймер дёргает. Если прерывание не нужно -- не разрешай его в PIC. Если нужно настроить по-другому -- настраивай канал 0 таймера через порты 0x40 и 0x43.
    Ответ написан
    Комментировать
  • Какой atomic::Ordering нужен в этих ситуациях?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я ничего не знаю про rust, но это же вопрос про memory model, а эта тема уже обсосана C и С++. Например: eel.is/c++draft/atomics.order Самый строгий вариант ордеринга (sequential consistency) будет работать корректно всегда, и если вопрос не стоит как "насколько его можно ослабить", то разумно использовать его. Кроме того, для CAS это же единственная возможная опция, наксколько мне известно.
    Ответ написан
  • Проблема с обработкой клавиатурных прерываний в QEMU?

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

    Пишут такое:
    In the default configuration, break codes are the make scan codes with the high bit set; make codes 60h,61h,70h, etc. are not available because the corresponding break codes conflict with prefix codes (code 2Ah is available because the self-test result code AAh is only sent on keyboard initialization). An alternate keyboard configuration can be enabled on AT and later systems with enhanced keyboards, in which break codes are the same as make codes, but prefixed with an F0h scan code.

    т.е. понимаешь правильно, но это 1) настройка для альтернативной конфигурации и 2) бывают многобайтовые скан-коды (см. например).
    Ответ написан
    1 комментарий
  • Что не так с этим кодом? Или у lvgl сломан SDL рендерер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    вместо темно-синего фона и hello world выводиться черное окно, проблема в коде или в lvgl?

    Я вижу вот такое:
    6777b62c0681b961507674.png
    вроде всё на месте. Debian 12. Собирал так: gcc test.c -o test -L lvgl/build/lib -llvgl -lSDL2, в lvgl скопировал lv_conf.h из lv_conf_template.h и включил в нём LV_USE_SDL.
    Ответ написан
  • Как происходит сброс и заполнение регистров ip и cs когда CPU получает сигнал reset при включении ПК?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можно посмотреть в Intel developer manual и в разделе 11.1.1 Processor State After Reset третьего тома увидеть следующее:
    677467b8789a3779090596.png

    Откуда процессор берёт значения которые указывают адрес reset vector. Где они хранятся пока процессор выключен.

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

    Чтобы ощутить сложность можно посмотреть на то, как устроен сброс в реализации i8080 (куда более простого, чем x86) на верилоге, сделанной на основе реверс-инжениринга этого ядра по фото его кристалла. Спойлер: устроен неочевидно, тупым поиском стейт-машины по слову reset не найти.
    Ответ написан
    Комментировать
  • STM32 общается с микросхемой по SPI. Считываем регистр. Почему вместо ведомого снова говорит мастер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    STM32 общается с микросхемой по SPI.

    Что за микросхема?

    Почему вместо ведомого снова говорит мастер?

    Интерфейс с двумя сигналами MISO и MOSI дуплексный, мастер всегда может выставлять какие-то данные на MOSI, это не имеет значения для приёма данных с MISO. Т.е. в вашем случае возможно устройство на том конце отвечает нулями.

    Может у вас есть мысли какие-то?

    Я смотрю на сигналы на картинке и вижу, что они начинаются с младших битов, т.е. 0xB0 передаётся как 0-0-0-0-1-1-0-1. Это нетипичный порядок битов, нужно проверить, что устройство ожидает данные именно в этом порядке. На диаграмме из мануала порядок битов, кстати, противоположный -- от D7 к D0.
    Ответ написан
    Комментировать
  • Как сделать дальний прыжок при переключении из 16 битного в 32 битный режим?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В отладчике я видел это:

    gdb здесь ожидает увидеть 64-битный код, чтобы он корректно интерпретировал 32-битный код надо ему скомандовать что-то типа set arch i386:x86-64 перед соединением.
    Ответ написан
  • Какая ошибка в коде на С?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В строке
    while (isspace(c = getch())); // Пропуск пробелов
    \n принимается за пробел и не возвращается из функции. В результате счётчик номеров строк не меняется.
    Ответ написан
    1 комментарий
  • Как скомпоновать код ассемблере с кодом на С для ядра?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может надо сделать их объектными elf файлами, затем скомпоновать и зачистить формат?

    Использование стандартных форматов и инструументов для работы с ними -- это традиционный способ облегчить себе жизнь. Стандартная связка при использовании gnu-тулчейна -- использовать gcc для компиляции исходников на С (*.c) и ассемблере (*.S), gcc или ld для линковки, objcopy для преобразования ELF-файла с выхода линковщика в бинарник.
    Кроме того, в QEMU можно прямо ELF загружать.
    Ответ написан
    Комментировать
  • Как выполнить кросс-компиляцию при помощи CMake?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как Cmake передать расположение библиотеки openssl под нужную архитектуру (я попытаюсь собрать openssl из исходников под aarch64).
    В CMakeLists.txt модуль обнаруживается при помощи find_package(OpenSSL REQUIRED).

    С помощью переменной CMAKE_FIND_ROOT_PATH. Если последовательно идти этой дорожкой, в конце концов можно обнаружить себя собирающим sysroot для целевой системы.

    Кроме того, см. раздел мануала cmake о настройке кросс-компиляции.
    Ответ написан
    Комментировать
  • Почему может падать качество преобразования АЦП при повышении частоты сигнала?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если сигнал синусоидальный то погрешность не превышает 0,3% на 2 КГц, но если цифровой сигнал(мендр) то погрешность может достигать 2% на 2 КГц.

    Потому что в прямоугольном сигнале присутствуют составляющие гораздо более высоких частот, чем частота этого меандра. См.
    Ответ написан
    3 комментария
  • Почему не работают цепные команды в ассемблере?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему у меня не хотят работать корректно цепные команды?

    Что конкретно не работает? В формате: "ожидаю X, происходит Y".

    В коде два странных места. Первое:
    mov      ax,Data2
    mov      es,ax     ; запис адреси data2 в ds
    ...
    lea si, node1  ;  <---

    node1 находится в сегменте Data2, адрес которого загружен в es, но команда lodsb загружает данные из ds:si.

    Второе:
    @finish_cycle_namex:
    inc I_struc ;+1 до ітерації
    add si, 5

    Зачем здесь добавлять 5 к si? si указывает на область памяти в которой лежит массив 5-символьных имён, внутренний цикл как раз перемещает si на следующее имя.
    Ответ написан
  • Почему от добавления функций помимо main() в начало кода ядро перестает работать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему от добавления функций помимо main() в начало кода ядро перестает работать?

    смотри: ты собираешь образ kernel следующей командой:
    i686-elf-ld -Ttext 0x7E00 --oformat binary kernel.o -o kernel -e main

    а запускаешь следующей:
    ; Jump to the kernel's entry point
        JMP 0x0000:0x7E00

    как по-твоему здесь используется информация о точке входа -e main?

    Ответ
    никак, выполнение всегда начинается с начала образа kernel, куда выполняет переход начальный загрузчик; что там будет, то и начнёт выполняться. Эта информация даже никуда не записывается, потому что файл формата binary -- это тупо склеенные вместе загружаемые сегменты, там нет места для метаинформации. Если бы ты собирал ELF, то этот адрес был бы записан в поле e_entry заголовка ELF.

    Если не модифицировать загрузчик, то образ ядра должен начинаться с кода точки входа, в твоём случае -- с кода main(). Чтобы поместить нужный код в нужное место собранного образа обычно используют скрипт линковщика.
    Ответ написан
    Комментировать
  • Как с помощью buildroot можно автоматически запускать bash скрипт после загрузки ядра linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как ... автоматически запускать bash скрипт после загрузки ядра linux?

    В зависимости от используемого init и требуемых деталей запуска -- через файл /etc/inittab или добавлением файла с именем вида S[0-9][0-9]* в /etc/init.d (если busybox), либо добавлением юнита systemd если systemd.

    С помощью buildroot

    В buildroot есть несколько вариантов это сделать, они описаны здесь. Самый простой на мой взгляд -- BR2_ROOTFS_OVERLAY. Если добавить путь в эту переменную конфигурации, то файловая иерархия по этому пути будет скопирована в будущую корневую фс.
    Ответ написан
    Комментировать
  • Как регистры SOC отображаются на память Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как узнать, какой адрес этих регистров уже после инициализации устройств и загрузки ОС?

    Физический адрес -- как и написано в dts: 0xfe600000. Виртуальный адрес -- какой-то сравнительно случайный, выделенный вызовом ioremap() или какой-нибудь его обёрткой. Если драйверу нужен доступ к регистрам -- драйвер просто вызывает ioremap() сам и получает адрес. Если доступ нужен в юзерспейсе -- можно (при наличии разрешений) сделать mmap() файлу /dev/mem по смещению равному физическому адресу устройства.

    Или обратная задача: есть процесс, который пишет в некоторую область памяти, как узнать, возможно, это какие-то регистры SOM

    Сделать cat /proc/<pid>/maps и посмотреть, что отображено в эту область виртуальных адресов.

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