Задать вопрос
  • Какой 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 и посмотреть, что отображено в эту область виртуальных адресов.

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    // Получаю ошибку:
    7FFF0000: The instruction at 0x7FFF0000 referenced memory at 0x7FFF0000. The memory could not be executed -> 7FFF0000 (exc.code c0000005, tid 6332)

    В чем проблема?

    По видимому в том, что вызвать функцию получилось, но память по адресу 7FFF0000 -- не исполняемая.

    Как починить?

    Начать с того, что сделать память по адресу 7FFF0000 исполняемой. После этого вывод в лог должен заработать, но будет падать после него, потому что функция mySuperFunction не возвращается.
    Ответ написан
  • Почему ОС запускается на QEMU, а на Virtual Box нет?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему ОС не запускается на Virtual box, а на QEMU запускаеться?

    Потому что QEMU TCG не очень точно эмулирует x86. Если в командную строку qemu добавить -enable-kvm, то оно тоже не будет работать.

    А вот если добавить ret в реализацию GDT::load_gdt() и не вызывать load_tss() то оно начинает в qemu-kvm работать:
    diff --git a/src/GDT/GDT_impl.s b/src/GDT/GDT_impl.s
    index 4f69835abd9d..5476837f3d0a 100644
    --- a/src/GDT/GDT_impl.s
    +++ b/src/GDT/GDT_impl.s
    @@ -2,6 +2,7 @@
     .extern _ZN8SimpleOS3GDT7gdt_ptrE
     _ZN8SimpleOS3GDT8load_gdtEv:
            lgdt _ZN8SimpleOS3GDT7gdt_ptrE
    +       ret
     
     .global _ZN8SimpleOS3GDT8load_tssEv
     _ZN8SimpleOS3GDT8load_tssEv:

    Подозреваю, что и в virtual box оно заработает.
    Проблема в загрузке TSS, короче. Мне не знакомы дебри TSS, но для поверхностного взгляда кажется странным то, что все сегментные селекторы в твоём TSS имеют RPL=3, а селектор стека -- RPL=0.
    Если ты хочешь разбираться с тем, что происходит, то разумно было бы поменять порядок инициализации, сначала загрузить IDT, чтобы иметь возможность обрабатывать исключения, а потом загружать TSS и смотреть, что за исключение эта операция выкидывает.
    С другой стороны, непонятно зачем в текущей версии этой ОС нужен TSS. Подозреваю, что никакая функциональность не будет потеряна, если его не загружать.
    Ответ написан
    Комментировать
  • Что означает ошибка, выводящаяся при выполнении bash-скрипта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    выводится ошибка - [: missing `]'
    Что значит эта ошибка

    Эта ошибка означает, что
    1) bash разбил команду
    if [ "$projectDir" == "video" && "$flag" != "noflag" ]; then
    следующим образом: ключевое слово if, команда [ с аргументами "$projectDir" == "video", оператор &&, команда "$flag" с аргументами != "noflag" ], разделитель ;, оператор then.
    2) первая команда [ (она же test), очевидно, не нашла в своих аргументах закрывающей скобки ], которая должна там быть при таком её вызове.

    как ее можно исправить?

    использовать -a вместо &&, как говорит man test.
    Ответ написан
    Комментировать
  • Координаты сферы?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    std::copy(arr1, arr1 + n, buf);

    Все рассчитанные в циклах значения копируются в первые 9 элементов массива buf, остальные элементы этого массива остаются неинициализированными.
    Можно поправить код следующим образом, чтобы заполнить весь массив:
    int off = 0;
    ...
    for (GLfloat i = 0; i <= 3.14; i += 0.01)
        for (GLfloat j = 0; j <= 2.0 * 3.14; j += 0.01)
        {
            ...
            std::copy(arr1, arr1 + n, buf + off);
            off += n;
        }
    Ответ написан
    Комментировать
  • При размере страницы, скажем, 4 Кбайт 32-разрядное адресное пространство имеет 1 млн страниц. Верно ли это?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Без всякого деления можно понять, что 2^32 / (4 * 2^10) = 2^(32 - 12) = 2^20, а если запомнить, что 2^10 -- это "двоичная тысяча" (1024), а 2^20 -- соответственно "двоичный миллион" (1024^2), то жизнь заметно упрощается.
    Ответ написан
    Комментировать
  • Расскажите пожалуйста как реализован sin в cmath?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    кода я не нашел, или плохо искал

    вот код из glibc.

    через ряд тейлора не вариант при больших значениях угла ряд медленно сходится

    В приведённой реализации сначала аргумент приводится к диапазону ±pi/2, потом берётся фиксированное число слагаемых ряда тейлора.
    Ответ написан
    1 комментарий