• Как увеличить памяти для переменных и функций ядра на C?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    При достижении или больше определённого количества переменных или функций, перестают работать все string literals в ядре C

    Определённого -- это какого?

    Вот тут
    mov bx, KERNEL_OFFSET ; Read from disk and store in 0x1000
        mov dh, 54 ;31 or 54

    ты 54 сектора ядра загружаешь в память. Есть какая-нибудь корреляция?

    как можно увеличить память для них?

    код ядра ты не привёл, что там ломается можно только догадываться, ну ты понял.
    Ответ написан
  • Почему после вызова Message Box, GetKeyState() не считывает состояние клавиши?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему … GetKeyState() не считывает состояние клавиши?

    Потому что чтобы GetKeyState работал, поток должен обрабатывать свою очередь сообщений (например, циклом, наподобие этого).
    Из man GetKeyState:
    The key status returned from this function changes as a thread reads key messages from its message queue. The status does not reflect the interrupt-level state associated with the hardware. Use the GetAsyncKeyState function to retrieve that information.
    Ответ написан
    Комментировать
  • Как распаковать все файлы из qcow2?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    qcow2 -- это формат представления блочного устройства, на нём нет файлов, на нём может быть файловая система или разделы с файловыми системами. Можно превратить qcow2 в обычный raw образ командой qemu-img: qemu-img dd -O raw if=file.qcow2 of=file.raw.
    Получившийся сырой образ можно анализировать стандартными средствами. Если там одна файловая система, можно её просто примонтировать через loop: mkdir fs ; sudo mount file.raw fs. Если там таблица разделов, можно каким-нибудь kpartx создать устройства для каждого из разделов и примонтировать нужные:
    $ mkdir fs ; sudo kpartx -av file.raw 
    add map loop0p1 (254:4): 0 65536 linear 7:0 2048
    add map loop0p2 (254:5): 0 2029568 linear 7:0 67584
    $ sudo mount /dev/mapper/loop0p2 fs

    Естественно, если на разделах какой-нибудь LVM или LUKS прийдётся делать дополнительные телодвижения чтобы добраться до файлов.
    Ответ написан
    Комментировать
  • Какое приложение/процесс отправляет arp запросы?

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

    Cтандартным образом -- будет отвечать вот это место в сетевом стеке.

    В качестве альтернативы, кто угодно с привилегией CAP_NET_RAW может создать сырой сокет и через него получать и посылать всё что угодно, включая ARP-запросы и ответы.

    за получение ip по DHCP отвечает клиент

    можно попросить ядро сконфигурировать сеть через DHCP опцией командной строки ядра ip=dhcp, тогда будет работать код вот из этого файлика.
    Ответ написан
    1 комментарий
  • Почему для драйвера мыши используется тот же порт, что и в драйвере клавиатуры?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Такие же порты используются при нахождении нажатой клавиши на клавиатуре, так как они могут быть и там и тут?

    Это называется мультиплексирование. В конце концов PS/2 -- довольно сложный интерфейс, работающий с командами, а не то чтобы клавиатура была напрямую подсоединена к одному из портов PC. См. https://wiki.osdev.org/Mouse_Input#Keyboard.2FAux_...
    Ответ написан
    Комментировать
  • Почему scanf некорректно работает в FASM?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Функция scanf крушит программу

    Скорее всего ты ошибаешься, и "программу крушит" вот это:
    push numderA
    call [printf]

    printf ожидает первым параметром форматную строку.
    Ответ написан
    6 комментариев
  • У меня программа не выводит числа в консоль, как исправить?

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

    1) посмотреть, какие параметры ожидает функция printf которую ты используешь. Форматная строка для двух целых чисел -- "%d %d".
    2) узнать, как параметры передаются в функцию и что делать после возвращения из неё. Ты используешь push razmer чтобы передать адрес переменной razmer в scanf, но в printf нужно передать не адрес переменной, а её значение. Например так:
    mov eax, [razmer]
    push eax


    Помимо этого в коде есть и другие ошибки: razmer и razmer2 определены как rb 1, а должны бы быть определены как rd 1, поскольку формат %d для scanf приведёт к записи 4 байт. %t -- нет такого формата в scanf, имелся в виду, наверно, %d.
    Ответ написан
    Комментировать
  • Корректно ли сравнивать цифры объявленные как строки, т.е объектом string?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как в ситуации ниже, поступает компилятор?

    Компилятор вставляет вызов string::operator <. Если это std::string, то оператор выполняет лексикографическое сравнение, т.е. сравнивает символы обеих строк по очереди до первой различающейся пары, меньшей будет та строка, которой принадлежит символ с меньшим кодом.
    В примере "100.05" < "100.03" результат будет false потому что 5 > 3.

    Могут ли быть какие-то проблемы

    Для такого сравнения строковые представления чисел должны начинаться разрядами одного веса. Т.е. можно сравнивать "100.05" и "099.1" (первая цифра и слева и справа -- сотни), но нельзя сравнивать "100.05" и "99.1" (слева первая цифра -- сотни, справа -- десятки).
    Ответ написан
    Комментировать
  • Почему не получается деление div на ассемблере в С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не получается деление div на ассемблере в С++?
    char b1 = 3, b2, b3 = 1 , res2; //1 байт el, bl, ah    ]]  cbw -> short
      short w1= 1000, w2 = 500, w3 = 2;
    //(w1 - w2) * w3 / b1

    div bl

    Потому что (1000 - 500) * 2 / 3 = 333, а это не влезает в один байт результата, а значит ты получаешь исключение. См.
    Ответ написан
    Комментировать
  • Как исправить ошибку "Кадр не находится в модуле" при создании потока?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    "Кадр не находится в модуле". Подскажите с чем это может быть связано
    HANDLE h = CreateThread(
        NULL,
        0,
        factorial(gn),
        NULL,
        NULL,
        NULL
    );

    Третий параметр CreateThread -- указатель на функцию, которая будет запущена в создаваемом потоке. А у тебя записано скорее всего что-то другое. Если ты хотел запустить функцию factorial в потоке, она должна 1) иметь определённый прототип (вот такой), и 2) в функцию CreateThread надо передать её адрес, а не результат её вызова (например, так: CreateThread(NULL, 0, factorial, NULL, NULL, NULL)). 3) если ты сделаешь эти два изменения, тебе прийдётся также переделать передачу параметра в функцию factorial и получение результата её работы.
    Ответ написан
  • Как реализовать _open() для добавления своих потоков ввода-вывода?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почитать про libgloss, понять что надо самому разбирать пути переданные в параметре name и где-то хранить данные о том, что за файл и как был открыт. Понять, как именно ты хочешь "реализовать работу со своими устройствами" и… реализовать её.
    Ответ написан
  • Как использовать регулярные выражения в find?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    При вводе find -name "10{3}" ничего не выдает, как использовать регулярные выражения в find

    опция -name find не поддерживает регулярные выражения. Поддерживает опция -regex, см.
    Ответ написан
    Комментировать
  • Почему не работает inportb(0x60)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    во-первых компилятор даёт предупреждение, … , но ошибки не производит. Я спокойно линкую файл недо-драйвера с основным ядром, (конечный результат - .efi),

    Дело в том, что у EFI-приложений нет динамической линковки, а неопределённый символ после копирования из .so в .efi просто ссылается в никуда. Если вывести неопределённые символы для bootx64.so, то inportb будет среди них:
    objdump -t bootx64.so | grep UND
    0000000000000000         *UND*  0000000000000000 inportb


    В qemu результат вызова этой функции выглядит так:
    Trace 0: 0x7fb15d338e80 [0000000000000000/000000007e6e22de/0x40c2b0]
    ----------------                      
    IN: 
    0x7e6e2081:  bf 60 00 00 00           movl     $0x60, %edi
    0x7e6e2086:  b8 00 00 00 00           movl     $0, %eax
    0x7e6e208b:  e8 90 57 00 00           callq    0x7e6e7820
    
    Trace 0: 0x7fb15d3390c0 [0000000000000000/000000007e6e2081/0x40c2b0]
    ----------------                      
    IN: 
    0x7e6e7820:  af                       scasl    (%rdi), %eax
    0x7e6e7821:  af                       scasl    (%rdi), %eax
    0x7e6e7822:  af                       scasl    (%rdi), %eax
    0x7e6e7823:  af                       scasl    (%rdi), %eax
    0x7e6e7824:  af                       scasl    (%rdi), %eax
    0x7e6e7825:  af                       scasl    (%rdi), %eax
    0x7e6e7826:  af                       scasl    (%rdi), %eax
    0x7e6e7827:  af                       scasl    (%rdi), %eax
    0x7e6e7828:  af                       scasl    (%rdi), %eax
    0x7e6e7829:  af                       scasl    (%rdi), %eax
    0x7e6e782a:  af                       scasl    (%rdi), %eax
    0x7e6e782b:  af                       scasl    (%rdi), %eax
    …


    С другой стороны, если предоставить такую функцию:
    unsigned char
    inportb(unsigned short port)
    {
            unsigned char v;
            asm volatile ("in {%1|%b0}, {%b0|%1}\n" : "=a"(v) : "d"(port));
            return v;
    }

    то она прекрасно вызывается и возвращает значение.

    Можно добавить опцию -zdefs в команду линковки чтобы получать ошибку линковки при наличии ссылок на неопределённые символы.

    Чтобы посмотреть, какой именно код выполняется, я запускаю qemu с монитором в консоли (дополнительным ключом -monitor stdio). Я нажимаю ESC когда в QEMU запускается tianocore и выбираю Boot Manager -> EFI Internal Shell, а там пишу fs0:efi\boot\bootx64.efi, после этого в мониторной консоли включаю логгирование (командами logfile log, log in_asm,exec), после чего нажимаю enter в консоли EFI. После этого можно смотреть в файл log и искать в нём знакомые байты из objdump.
    Ответ написан
  • Как правильно проинициализировать контроллер прерывания?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    По сути pic должен генерировать прерывания 18 раз в секунду

    По сути не PIC, а таймер. А в твоём коде не видно ни как ты инициализировал таймер, ни что таймерное прерывание разрешено в PIC.
    Ответ написан
    2 комментария
  • Инициализация объединения из двух энумераций?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Второй вариант инициализации не работает

    Ну да, не работает. Таким образом можно инициализировать только первый элемент union. Есть ещё вот такой вариант инициализации, начиная с C++20.
    Ответ написан
    Комментировать
  • Есть ли аналог std::string в драйвере уровня ядра windows?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть UNICODE_STRING: см.
    Ответ написан
    Комментировать
  • GetWindowText() записывает в массив char'ов через символ, как решить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    GetWindowText() записывает в массив char'ов через символ
    GetWindowText(obj.hEDIT,(LPWSTR)&msg, sizeof(msg));

    Если это массив char, то надо использовать GetWindowTextA и не приводить указатель на массив к типу LPWSTR.

    Последний аргумент GetWindowText, кстати, это не размер буфера, а количество символов в нём, так что туда надо (было бы) передавать не sizeof(msg) а sizeof(msg)/sizeof(*LPWSTR).
    Ответ написан
    Комментировать
  • Как происходит разрешения на папку в Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как происходит разрешения на папку а конкретно момент с Read и eXecute

    Read -- возможность прочитать содержимое каталога. eXecute -- возможность сделать каталог текущим.
    См.
    Ответ написан
    Комментировать
  • Как использовать одну переменную в нескольких make файлах?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У меня есть два make-файла, первый вызывает второй.
    Мне хотелось бы получить некоторые данные из второго make-файла.

    Не предусмотрено такое логикой make, разве что через eval это можно накостылить. Обычно, когда нужна тесная связь между разными Makefile, один из них подключают в другой (и получают большой логический Makefile поделённый на несколько файлов).
    Ответ написан
    Комментировать
  • Как вывести индикацию speed ethernet в linux kde?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Готов даже как-то поучаствовать в разработке/допиливанию net_applet, но нигде не нашёл не то что исходников, но и какого-то места или человека, кому задать такой вопрос.

    Вот исходник пакета drakx-net из mageia 7: sophie.zarb.org/rpms/1a149924e962ca57b572b11802f8f...
    В spec-файле есть URL с которого берутся исходники: gitweb.mageia.org/software/drakx-net
    Ответ написан
    1 комментарий