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

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если записать вывод данных в файл
    # /opt/speedtest/speedtest | tee spdt.log
    то в файле не видно промежуточных значений значений.

    Дело в том, что консольная программа может определить, направлен ли её вывод в терминал или в файл, и вести себя по разному, в зависимости от этого. Понаблюдать, что и как именно программа выводит можно запустив её под strace, например так:
    strace -f -e ioctl,write -o log <program command line>

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    … 75% cpu 2:23,52 total
    … 113% cpu 1:22,71 total
    … 73% cpu 2:20,75 total
    количество потоков в программе равно количеству потоков процессора (в моём случае - 8…

    Похоже, что твоя программа не справляется с загрузкой всех ядер, едва одно ядро она нагружает. Я бы смотрел в то как потоки взаимодействуют друг с другом и искал там явную или скрытую сериализацию.
    Ответ написан
    Комментировать
  • Нету структуры file_operation, в хедере fs.h, как исправить? как установить полные хедеры ядра?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    изучаю разработку модулей ядра,попытался скомпилировать модуль использующий структуру file_operation - ошибка,как оказалось в моих хедерах ядра(/usr/include/linux/) нету данной структуры

    Хедеры ядра которые устанавливаются в системе -- это интерфейс между ядром и юзерспейсом (uapi). Хедер который тебе нужен -- внутренний хедер ядра. Чтобы собрать модуль ядра нужно иметь сконфигурированные исходники этого ядра. Почитать можно здесь.
    Ответ написан
    Комментировать
  • Как не запрашивать логин / пароль Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как это исправить?

    добавить -f в опции login:
    login -f test

    Но вообще, пользоваться командой login для этого странно, когда есть su.
    Ответ написан
    Комментировать
  • Как в 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-файлами.
    Ответ написан
    Комментировать