Ответы пользователя по тегу Linux
  • Как в io_uring отправить sqe, чтобы sqe выполнилось через 3 секунды после io_uring_submit?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как выполнить задержку не понимаю

    Для организации таймаута в liburing есть io_uring_prep_timeout, но кроме этого нужно сериализовать таймаут и все предыдущие команды (чтобы таймаут начинался после их окончания) и следующую после таймаута команду и сам таймаут (чтобы последующие команды не стартовали вместе с таймаутом). Сериализация делается установкой флага IOSQE_IO_DRAIN для sqe, почитать об этом можно например здесь. У меня нарисовался следующий пример, который записывает в файл (stderr), делает паузу в одну секунду, а потом записывает ещё:
    #include <fcntl.h>
    #include <liburing.h>
    #include <stdio.h>
    #include <sys/mman.h>
    
    #define QUEUE_DEPTH 16
    
    int main(int argc, char **argv)
    {
            int i;
            struct io_uring ring;
            struct io_uring_cqe *pcqe;
            static const char msg0[] = "before timeout\n";
            static const char msg1[] = "after timeout\n";
            struct io_uring_sqe *sqe;
    
            io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
            io_uring_prep_write(io_uring_get_sqe(&ring), 2, msg0, sizeof(msg0), 0);
    
            sqe = io_uring_get_sqe(&ring);
            io_uring_prep_timeout(sqe, (struct __kernel_timespec[]){{.tv_sec = 1}},
                                  -1, IORING_TIMEOUT_ETIME_SUCCESS);
            io_uring_sqe_set_flags(sqe, IOSQE_IO_DRAIN);
    
            sqe = io_uring_get_sqe(&ring);
            io_uring_prep_write(sqe, 2, msg1, sizeof(msg1), 0);
            io_uring_sqe_set_flags(sqe, IOSQE_IO_DRAIN);
            io_uring_submit(&ring);
            for (i = 0; i < 3; ++i) {
                    int rv = io_uring_wait_cqe(&ring, &pcqe);
                    if (rv < 0) {
                            errno = -rv;
                            perror("io_uring_wait_cqe");
                    } else {
                            io_uring_cqe_seen(&ring, pcqe);
                    }
            }
    }
    Ответ написан
    Комментировать
  • Как написать ассембли код x86 nasm для Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Твой traverse_loop держит указатель на текущую запись в eax, но первый же вызов PrintName портит почти все регистры и не восстанавливает их, поэтому первый же movzx esi, byte [eax + 10h] после этого вызова обращается мимо памяти и вызывает segfault. Проще всего это исправить каким-нибудь pusha / popa вокруг тела PrintName. После этого ты доберёшься до вызова PrintMark, где увидишь, что эта функция ожидает в eax + 10h текстового представления оценки, а у тебя пока есть только двоичное.
    Ответ написан
    Комментировать
  • Почему нет инфы о библиотеках в procfc файле maps, которые в сишном коде подключены и используются?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Компилирую gcc -o outfile source.c -lpthread. То есть собираю без всяких статиков, чтобы были зависимости к подключенным библиотекам. Далее запускаю процесс, чекаю /proc/pid/maps. Там нет ни единого упоминания к libpthread.

    100500 лет назад libpthread объединилась с glibc и теперь хоть и существует отдельно, чтобы программы использующие -lpthread продолжали собираться, внутри пустая. Короче, ты выбрал неудачного кандидата для экспериментов.
    Ответ написан
    Комментировать
  • Какое ядро использует Debian?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В оригинальном ядре linux есть несвободные прошивка и блобы

    Это неверное заявление. Ядро Торвальдса (вы же его называете "оригинальным"?) доступно в виде исходников под набором свободных лицензий. Но часть этих исходников -- это драйвера устройств, для работы которых требуется firmware, возможно проприетарное. Если собрать такое ядро, то оно будет полностью свободным, но ряд устройств для работы потребует проприетарных блобов, не являющихся частью ядра. Несвободные компоненты в принципе не могут стать частью этого ядра из-за конфликта лицензий.

    какое ядро всё-таки использует Debian ?

    Можно тупо взять и посмотреть, например для debian 12: https://packages.debian.org/source/bookworm/linux
    Внизу страницы есть ссылки на архив с исходниками ядра (это копия ядра из ветки stable) и на архив исходников debian-пакета, а также ссылка на git последнего.
    Ответ написан
    Комментировать
  • Как проверить установленные права на /etc/shadow?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если права на файл не go-rwx

    разрешения на файл не могут быть go-rwx, эта запись означает "отнять rwx у g и o". Разрешения могут быть u=rw,go=. Получить их можно например так: stat -c %A /etc/shadow, а проверить условие -- командой test, например: if [ `stat -c %A /etc/shadow` != "-rw-------" ], или командой grep, например:
    if ! stat -c %A /etc/shadow | grep -q '^....------$'
    .

    Кроме того, можно не париться и просто всегда делать chmod go-rwx /etc/shadow.
    Ответ написан
    Комментировать
  • Как подставить в echo переменную?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как я могу данные из них подставить в echo, сохранив при этом функционал запроса?

    eval "echo {$A1}.{$A2}.{$A3}"
    Потому что расширение таких конструкций со скобками -- функция shell, поэтому они должны буквально в таком виде попасть в shell. eval применяет функциональность shell к произвольной строке.
    Ответ написан
    3 комментария
  • В чем возникает проблема при работе с драйвером порта - UART4?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Речь идет именно о RS485, UART подключен к микросхеме трансивера RS485. Пин RTS используется для организации полудуплексной передачи.

    Ок, я проглядел это место, давай попробуем ещё раз.

    Если вывод dev_err() поставить перед spin_lock_irqsave(&port->lock, flags); то всё работает.

    Верно ли, что когда всё работает (со вставленным dev_err), serial8250_em485_stop_tx вызывается после передачи только из serial8250_console_write, а когда всё не работает эта функция не вызывается вообще?

    Глядя в функцию serial8250_handle_irq я вижу, что обработка окончания передачи зависит от того, используется DMA или нет. Используется ли в вашей конфигурации DMA? Работает ли передача, если DMA отключить?
    Ответ написан
  • Как раздать блочное устройство с 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.
    Ответ написан
    Комментировать
  • Как исправить ошибку debian/rules build subprocess returned exit status 2?

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

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можно как-то дождаться завершения всех?

    Если они не демонизируются, можно ждать их завершения командой wait, см. man bash. Если демонизируются -- надо наблюдать за их PID-файлами.
    Ответ написан
    Комментировать
  • Есть ли закрытый исходный код в ядре linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть ли закрытый исходный код в ядре linux?

    Нужно понимать, что такое исходный код ядра и как он превращается в исполняемый код в каком-нибудь дистрибутиве, чтобы видеть, что без уточнения, в каком именно коде ядра, вопрос не имеет смысла.
    В исходном коде доступном на kernel.org нет ничего проприетарного. Но сборщик дистрибутива может собрать какие угодно модули вместе с ядром, а также добавить произвольный код к оригинальному коду ядра.
    Ответ написан
    Комментировать
  • Как скомпилировать код C в .ko?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответ написан
    Комментировать
  • Почему я не могу попасть в single-user mode [решено]?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    WTF? Это у меня кривые руки или в ядре при переходе от 4.х к 5.х опять что-то втихушку поправили

    single -- это не параметр ядра вообще. Это параметр init. Сравнивай системы инициализации.
    С systemd для этого эффекта можно использовать параметр systemd.unit=rescue, см.

    Ну и имеет смысл проверить, что grep -w single /proc/cmdline подтверждает, что параметр в неизменном виде добрался до юзерспейса.
    Ответ написан
    9 комментариев
  • Происходит ошибка сборки GNU M4, почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    /mnt/lfs/usr/include/bits/stdlib.h:86:3: error: #error "Assumed value of MB_LEN_MAX wrong"

    Ну что, нужно взять /mnt/lfs/usr/include/bits/stdlib.h и почитать внимательно, что там вокруг 86й строчки написано и где это assumed value зашито. Вообще эта ошибка не выглядит специфичной для m4, больше похоже на глюк libc.
    Ответ написан
  • Как запустить executable в линукс?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Судя по отсутствию каталога /lib64 в корне системы где выводится not found там не установлена поддержка ABI amd64. Нужно либо доустановить 64-биные библиотеки, либо слинковать server-linux статически.
    Ответ написан
    Комментировать
  • Что будет если запустить init через exec?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что будет если запустить init через exec?

    Вне контекста процесса с PID 1 -- всё то же самое, что будет, если просто запустить его руками из оболочки.
    Ответ написан
    Комментировать
  • Как вернуть модуль ядра после rmmod?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вопрос первый: как обратно эти модули загрузить

    командой insmod.

    Вопрос второй: usbserial это вообще на все порты?

    usbserial может управлять устройствами произвольного типа, но по умолчанию он управляет только небольшим набором типов устройств.
    Ответ написан
    Комментировать