Задать вопрос
  • Почему ОС запускается на 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. Подозреваю, что никакая функциональность не будет потеряна, если его не загружать.
    Ответ написан
    Комментировать
  • Проблема с обработкой клавиатурных прерываний в 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 комментарий
  • Как писать код в llvm asm формате?

    @business-gl Автор вопроса
    Ответ написан
    Комментировать
  • Как создать файл без формата с скомпилированным C кодом?

    15432
    @15432
    Системный программист ^_^
    Возможно, вам поможет кусок из моей статьи, к которому я сам часто возвращаюсь. Правда, там ARM, но gcc везде +/- одинаковый

    arm-none-eabi-gcc.exe echo.c -nostdlib -O2 -o echo.out
    arm-none-eabi-objcopy.exe -O binary echo.out echo.bin


    По-хорошему нужно явно указать компилятору, по какому адресу будет расположен код директивой -Wl,--section-start=.text=0x30400000 (последнее - требуемый адрес)
    Ответ написан
    Комментировать
  • Как сделать дальний прыжок при переключении из 16 битного в 32 битный режим?

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

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

    Исключение будет - специальный флаг поднимается.
    Компилятор Си в программу, естественно, встраивает проверку этого флага и аварийно завершает.
    Аналогично с лиспом.

    https://software.intel.com/content/dam/www/public/...

    https://software.intel.com/content/dam/www/public/...

    Поведение также зависит от других флагов, так что читай мануалы)
    Для одного только IDIV в мануале целых три страницы расписано.

    Описание инструкцию во втором томе подробно описаны. Для деления тебя должны интересовать семейство FDIV* для чисел с плавающей точкой и IDIV/DIV для целых чисел.
    Ещё можешь посмотреть на всякие AVX и SSE - там тоже по своему происходит проверка на деление на ноль.
    Ответ написан
    2 комментария
  • Что делает компьютер, когда получает машинную инструкцию поделить на ноль?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что же сделает программа на чистом ассемблере?

    Программа "на чистом ассемблере" всё равно выполняется в каком-то окружении. От этого окружения и зависит, что именно произойдёт. С программой запущенной на x86 в реальном режиме произойдёт одно (прерывание int 0), запущенной под windows -- другое (исключение -> SEH -> завершение программы), запущенной под linux -- третье (но довольно похожее -- исключение -> сигнал -> завершение программы), а запущенной на микроконтроллере с ядром arm -- так и вообще ничего не произойдёт: разделит и глазом не моргнёт, вернёт 0 в качестве результата деления.
    Ответ написан
    Комментировать
  • Как скомпоновать код ассемблере с кодом на С для ядра?

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

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

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    Например, поставить трансформатор ;-)
    Если считаете, что вам такой ответ не подходит - уточняйте условия задачи.
    Ответ написан
    1 комментарий
  • Понимание физики работы простых электрических схем?

    @VT100
    Embedded hardware & software.
    ... но почему после открытия транзистора конденсатор разряжается ...?

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

    Закон Ома, правила Кирхгофа, интегрирование тока конденсатором в напряжение, интегрирование напряжения индуктивностью в ток - помогут рассеять мрак. Предполагаю, что где-то во вводных главах это было рассмотрено, но пропущено при чтении "детской книжки".
    Также - решение систем линейных уравнений (если не вдаваться глубоко в конденсаторы и индуктивности).
    Ответ написан
    Комментировать
  • Возможно ли подключится к UDP серверу и прослушивать его через сторонне ПО?

    hint000
    @hint000
    у админа три руки
    Подключиться ты конечно можешь
    Нет, не может, потому что вопрос не про TCP, а про UDP, который не устанавливает соединение. Т.е. чтобы хоть что-то получить в ответ, нужно сначала отправить туда что-то в правильном формате. А формат неизвестен. На случайный "мусор" сервер может ничего и не отвечать.
    Можно наугад послать что-нибудь на сервер, но нельзя "подключиться".
    Ответ написан
    1 комментарий
  • Возможно ли подключится к UDP серверу и прослушивать его через сторонне ПО?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Подключиться ты конечно можешь, но этого явно будет не достаточно. Надо общаться с сервером, и тут нужны не базовое понимание, а конкретный протокол взаимодействия.
    Ответ написан
    Комментировать
  • Как увидеть код выполненный до breakpoint?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Возможно ли это?

    В gdb есть вот такая штука: https://www.sourceware.org/gdb/news/reversible.html
    Т.е. ответ для gdb -- возможно, но при определённой подготовке и с определёнными ограничениями.
    С другой стороны, во всяких coresight есть возможность записывать выполненные процессором переходы, но это нужна железка с поддержкой этой технологии и железка которая будет собирать эти логи.
    Ответ написан
    Комментировать
  • Как защититься от метода CloseConnection?

    Griboks
    @Griboks Куратор тега Unity
    В нем "читер" сначала выдает себе права MasterClient от сервера

    Вы ошиблись, читер не может получить права от сервера - у вас нет сервера, у вас есть клиенты и главный клиент. Для решения проблемы достаточно перевести архитектуру в клиенты + выделенный сервер.
    Ответ написан
    Комментировать
  • Как защититься от метода CloseConnection?

    MvcBox
    @MvcBox
    Software Engineer [C/C++/JS(for Node.js)/etc]
    Можно ли защититься от этого и как?

    Нормально реализовать серверную часть. Судя по Вашему описанию это какое-то решето, а не сервер.
    Ответ написан
    Комментировать
  • Что находится по этому адресу в памяти?

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

    Потому что это адреса. 8 байт адреса, на втором скрине первый -- 0x12df11a80, второй -- 0x12df11a60
    Ответ написан
    2 комментария
  • Как обойти iOS ASLR используя LLDB?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Начало TEXT минус конец PAGEZERO, получается 0x104a60000 - 0x100000000 = 0x4a60000 (делта смещение)

    Ты что-то странное тут посчитал. TEXT у тебя лежит начиная с адреса 0x104a60000, вот этот адрес и надо использовать.

    Вот адрес ,к примеру, на котором я хочу установить breakpoint

    Тебе ещё надо знать, с какого адреса T начинается TEXT в дизассемблере. Тогда для произвольного адреса A внутри TEXT адрес в отладчике будет A - T + 0x104a60000.
    Ответ написан
    Комментировать
  • Изминение запроса Amazon DynamoDB?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Слишком мало информации.
    Я долго изучал код

    Только по выводу дизассемблера или отладчиком ходил?
    пытался менять ... "0x013ded84 ldr x1, [x8, 0x250]"

    Выглядит разумно, но стоило бы под отладчиком посмотреть, что в x1 оказывается после этой инструкции. Я подозреваю, что адрес строки в памяти, а значит случайные изменения адреса откуда x1 загружается почти наверняка ничего не дадут.
    Задача либо понять "1" на любое нужное число, либо сделать так чтобы количество скачиваний было равным цене товара.

    Можно попробовать сохранить x1 каким он приходит к адресу 0x13ded40 в каком-нибудь callee-saved регистре (например x24) и перезагрузить обратно его вместо инструкции по адресу 0x13ded84. Как раз между этими адресами есть один nop и adrp x8, 0x2d71000 который теперь будет не нужен.
    Ответ написан
    1 комментарий
  • Почему метод Last в любом случае возвращает 0?

    Adler_lug
    @Adler_lug
    int res = str[str.Length - 1] - '0';

    Имхо, более правильный пример:
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        string s = "рублей";
        if (n % 10 == 1) s = "рубль";
        if (n % 10 >= 2 && n % 10 <= 4) s = "рубля";
        if (n % 100 >= 11 & n % 100 <= 20) s = "рублей";
        Console.WriteLine("{0} {1}", n, s);
        Console.ReadKey();
    }
    Ответ написан
    2 комментария
  • Проблема с кодом на C#?

    QuiShimo
    @QuiShimo
    Держу путь на бекэнд :)
    Привет!

    Думаю, вы тут перемудрили с кодом. Конкретно по вашей проблеме, блоки if для евро и доллара находятся внутри блока для рублей. Поэтому не читаются, т.е. примерно так:
    if (list == "r")
     { ...
       if (list == "e") {...}
       if (list == "d") {...}
    }


    А нужно сделать так
    if (list == "r") { ... }
    if (list == "e") {...}
     if (list == "d") {...}


    И для одинакового кода лучше использовать методы или почитать больше уроков, чтобы понять как сделать этот код проще и лучше :)

    P.S. Вопросы лучше оформлять, так больше шансов на ответ или комментарии
    Ответ написан
    1 комментарий