ASIO/ARM: Что может вызвать ошибку «Неверный адрес» (EFAULT) после случайного количества вызовов async_write() с буфером ⇐ C++
-
Anonymous
ASIO/ARM: Что может вызвать ошибку «Неверный адрес» (EFAULT) после случайного количества вызовов async_write() с буфером
У меня есть программа на 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(ошибка)
У меня есть программа на 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(ошибка)
Мобильная версия