ASIO/ARM: Что может вызвать ошибку «Неверный адрес» (EFAULT) после случайного количества вызовов async_write() с буферомC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 ASIO/ARM: Что может вызвать ошибку «Неверный адрес» (EFAULT) после случайного количества вызовов async_write() с буфером

Сообщение Anonymous »


У меня есть программа на C++, которая считывает данные из буфера, отображенного в память, размером 65 536 байт (64 КиБ), управляемого udmabuf. Этот драйвер ядра Linux позволяет буферу располагаться по известному адресу в физической памяти и при этом быть доступным для пользовательского пространства Linux через /dev/udmabuf0. Моя программа использует ASIO Boost 1.74 для выполнения async_write() в сокете, чтобы отправить эти данные подключенному клиенту в другом месте (клиент работает быстро и может опустошить сокет быстрее, чем этот хост сможет его заполнить).

Извините, предоставить компилируемый код слишком сложно, но я постараюсь объяснить свою программу.

Код выполняется на процессоре ARM Cortex-A53, кросс-компилированном с помощью g++. Существует некоторое оборудование, которое запрограммировано на выполнение записи DMA в буфер, и по завершении данные из буфера (которые отображаются как O_SYNC и передаются как buffer_mm) записывается в сетевой сокет с помощью такой функции:

класс Session: public std::enable_shared_from_this { частный: boost::asio::ip::tcp::socket socket_; ... публика: void write_data(void * buffer_mm, std::size_t total_bytes_transferred) { автоматический буфер = boost::asio::const_buffer(static_cast(buffer_mm)); boost::asio::async_write( разъем_, буфер, [total_bytes_transferred, me =shared_from_this()] (const error_code & ec, std::size_t bytes_transferred) { если (эк) { BOOST_LOG_TRIVIAL(ошибка)
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»