Как узнать, какой адрес этих регистров уже после инициализации устройств и загрузки ОС?
ioremap()
или какой-нибудь его обёрткой. Если драйверу нужен доступ к регистрам -- драйвер просто вызывает ioremap()
сам и получает адрес. Если доступ нужен в юзерспейсе -- можно (при наличии разрешений) сделать mmap()
файлу /dev/mem
по смещению равному физическому адресу устройства.Или обратная задача: есть процесс, который пишет в некоторую область памяти, как узнать, возможно, это какие-то регистры SOM
cat /proc/<pid>/maps
и посмотреть, что отображено в эту область виртуальных адресов.Если записать вывод данных в файл
# /opt/speedtest/speedtest | tee spdt.log
то в файле не видно промежуточных значений значений.
strace -f -e ioctl,write -o log <program command line>
… 75% cpu 2:23,52 total
… 113% cpu 1:22,71 total
… 73% cpu 2:20,75 total
количество потоков в программе равно количеству потоков процессора (в моём случае - 8…
изучаю разработку модулей ядра,попытался скомпилировать модуль использующий структуру file_operation - ошибка,как оказалось в моих хедерах ядра(/usr/include/linux/) нету данной структуры
как выполнить задержку не понимаю
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 отключить? Как симулировать сбои в файловой системе? … Может есть уже устоявшиеся готовые файловые решения
WTF? Это у меня кривые руки или в ядре при переходе от 4.х к 5.х опять что-то втихушку поправили
single
-- это не параметр ядра вообще. Это параметр init. Сравнивай системы инициализации.systemd.unit=rescue
, см.grep -w single /proc/cmdline
подтверждает, что параметр в неизменном виде добрался до юзерспейса.