как выполнить задержку не понимаю
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);
}
}
}
traverse_loop
держит указатель на текущую запись в eax
, но первый же вызов PrintName
портит почти все регистры и не восстанавливает их, поэтому первый же movzx esi, byte [eax + 10h]
после этого вызова обращается мимо памяти и вызывает segfault. Проще всего это исправить каким-нибудь pusha
/ popa
вокруг тела PrintName
. После этого ты доберёшься до вызова PrintMark
, где увидишь, что эта функция ожидает в eax + 10h
текстового представления оценки, а у тебя пока есть только двоичное. Компилирую gcc -o outfile source.c -lpthread. То есть собираю без всяких статиков, чтобы были зависимости к подключенным библиотекам. Далее запускаю процесс, чекаю /proc/pid/maps. Там нет ни единого упоминания к libpthread.
-lpthread
продолжали собираться, внутри пустая. Короче, ты выбрал неудачного кандидата для экспериментов. В оригинальном ядре linux есть несвободные прошивка и блобы
какое ядро всё-таки использует Debian ?
Если права на файл не 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, сохранив при этом функционал запроса?
eval "echo {$A1}.{$A2}.{$A3}"
eval
применяет функциональность shell к произвольной строке. Речь идет именно о RS485, UART подключен к микросхеме трансивера RS485. Пин RTS используется для организации полудуплексной передачи.
Если вывод dev_err() поставить перед spin_lock_irqsave(&port->lock, flags); то всё работает.
serial8250_em485_stop_tx
вызывается после передачи только из serial8250_console_write
, а когда всё не работает эта функция не вызывается вообще?serial8250_handle_irq
я вижу, что обработка окончания передачи зависит от того, используется DMA или нет. Используется ли в вашей конфигурации DMA? Работает ли передача, если DMA отключить? Как симулировать сбои в файловой системе? … Может есть уже устоявшиеся готовые файловые решения
Есть ли закрытый исходный код в ядре linux?
WTF? Это у меня кривые руки или в ядре при переходе от 4.х к 5.х опять что-то втихушку поправили
single
-- это не параметр ядра вообще. Это параметр init. Сравнивай системы инициализации.systemd.unit=rescue
, см.grep -w single /proc/cmdline
подтверждает, что параметр в неизменном виде добрался до юзерспейса. /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. Вопрос первый: как обратно эти модули загрузить
Вопрос второй: usbserial это вообще на все порты?