Вопрос или проблема
Я работаю над встроенной системой Linux (kernel-5.10.150), в системе есть модуль bluetooth+WIFI.
В ходе тестирования wifi+BT я обнаружил ошибку ядра oops
, как показано ниже:
[ 101.717826] CPU 0 Не удалось обработать запрос на страничный доступ ядра по виртуальному адресу 000002d4, epc == 805be290, ra == 805be560
[ 101.717838] Ошибка[#1]:
[ 101.717851] CPU: 0 PID: 1763 Команда: bttest Не испорчено 5.10.150 #4
[ 101.717858] $ 0 : 00000000 00000001 00000010 a8be6d21
[ 101.717894] $ 4 : a8be6d21 00000001 81015fa0 005f5000
[ 101.717919] $ 8 : 00000000 00000000 05355555 00000000
[ 101.717943] $12 : ffffffff 00000000 ffffffea 00000000
[ 101.717969] $16 : 8166f000 00000000 8224dd80 00000000
[ 101.717995] $20 : 00000000 00000019 81c2f308 81e11020
[ 101.718023] $24 : 00000000 8001190c
[ 101.718043] $28 : 8224c000 8224dc88 82134380 805be560
[ 101.718061] Hi : 02f5db53
[ 101.718066] Lo : 24a9f11c
[ 101.718084] epc : 805be290 hci_send_acl+0xa0/0x43c
[ 101.718093] ra : 805be560 hci_send_acl+0x370/0x43c
[ 101.718098] Статус: 34001c03 KERNEL EXL IE
[ 101.718115] Причина : 00800008 (ExcCode 02)
[ 101.718119] BadVA : 000002d4
[ 101.718124] PrId : 00132000 (MiPs)
[ 101.718129] Загруженные модули:
[ 101.718142] Процесс bttest (pid: 1763, threadinfo=58765d16, task=15407a97, tls=6f9fd920)
[ 101.718147] Стек : 8224ddf0 8166f3c8 00000001 8224dae0 80820000 805e2944 82189c00 00000019
[ 101.718175] 8224dd80 8224dd78 00000000 00000019 81c2f308 821f1900 81e11020 805e7b48
[ 101.718203] 8224dd08 82189c00 00000019 81d8b0f0 8224dd80 a8be6d21 80bfcc00 81c9d400
[ 101.718229] 80990000 805b5298 80990000 81c9d400 a8be6d21 00000001 00000000 6f9f5d28
[ 101.718256] 00000000 a8be6d21 82189e04 00000000 8224dd78 00000019 82189c00 00000001
[ 101.718281] ...
[ 101.718292] Вызов трассы:
[ 101.718301] [<805be290>] hci_send_acl+0xa0/0x43c
[ 101.718315] [<805e7b48>] l2cap_chan_send+0x1f4/0xf34
[ 101.718325] [<805f30d0>] l2cap_sock_sendmsg+0xac/0x11c
[ 101.718333] [<804bd550>] sock_write_iter+0xc8/0x14c
[ 101.718344] [<80130544>] do_iter_readv_writev+0x1c8/0x1ec
[ 101.718351] [<80131920>] do_iter_write+0xb0/0x1f8
[ 101.718358] [<80131b08>] vfs_writev+0x80/0x280
[ 101.718365] [<80131d80>] do_writev+0x78/0x134
[ 101.718375] [<8002a2f8>] syscall_common+0x34/0x58
[ 101.718382]
[ 101.718387] Код: 2c441000 148000a5 3c048090 <8c5402c4> 2e821000 144000c8 3c048090 02203825 03c03025
[ 101.718422]
[ 101.718538] ---[ конец трассы 87e7cd85f44c4db0 ]---
Я думаю, должна быть ошибка use-after-free
в кодах BT ядра, и я нашел следующие ссылки, похожие на эту Oops
.
https://bugzilla.kernel.org/show_bug.cgi?id=216686
— Я действительно нашел исправление этой ошибки.
И,
https://groups.google.com/g/syzkaller-bugs/c/SH1vfz5mhtA/m/_nzs-IpaAwAJ
— Похоже, использовалась другая версия ядра, и я не уверен, было ли какое-либо обратное портирование исправления в kernel-5.10, я не знаю много о BT и не знаю, как получить исправления из этой ссылки.
Есть ли какой-либо официальный сайт bluetooth-next
, где я могу найти все коммиты для исправления этой проблемы?
Так как же мне исправить эту проблему Oops
в моей системе?
Ответ или решение
Решение проблемы Kernel Oops в hci_send_acl() для системы Linux
Ваша проблема, связанная с возникновением ядрового «Oops» в функции hci_send_acl()
, может говорить о наличии критической ошибки в работе Bluetooth стека в вашей системе на базе Linux (ядро 5.10.150). Давайте рассмотрим, что может вызвать эту ошибку и как вы можете её устранить.
Анализ ошибки
Сообщение, которое вы предоставили, указывает на ошибку, связанная с нарушением доступа к памяти, вероятно из-за use-after-free. Строка Unable to handle kernel paging request at virtual address 000002d4
указывает на то, что процесс попытался обратиться к несуществующей или освобождённой памяти. Это может происходить в результате неправильного управления памятью в стеке Bluetooth.
Вы упомянули несколько ссылок на похожие проблемы, что подтверждает, что вы не одиноки в данном вопросе. Лучше всего, что вы уже сделали — это проверить наличие известных фиксированных патчей для вашего ядра.
Поиск исправлений
-
Патчи и исправления: Чтобы найти официальные исправления для вашей версии ядра, вам стоит исследовать ссылки, которые вы указали. Кроме того, рекомендуется посетить официальный репозиторий Linux на Git, где можно найти ветвь
bluetooth-next
, которая обычно содержит последние обновления и исправления для Bluetooth. -
Обновление ядра: Если исправление было добавлено в более поздние версии ядра, одним из лучших решений будет обновление до более новой стабильной версии, которая включает необходимые вам исправления. Проверка changelog и коммитов может помочь выявить, включает ли новая версия необходимые исправления.
-
Бекпортирование: Если вы не можете обновить ядро до более новой версии, вы можете рассмотреть возможность бэктестирования исправления с использованием исходного кода, содержащего патч. Однако это потребует определенных навыков программирования и понимания структуры кодовой базы ядра.
Действия для устранения ошибки
-
Сборка и установка обновлений:
- Определите, в какую версию ядра были добавлены исправления, и загрузите их.
- Скомпилируйте и установите ядро на вашей системе, следуя стандартным процедурам.
-
Проверка и тестирование:
- Запустите тесты для проверки, устранена ли ошибка.
- Используйте инструменты мониторинга, чтобы отслеживать изменения в работе системы.
-
Поддержка сообщества:
- Если ошибки продолжаются, обязательно обратитесь в المجتمع разработчиков. Подробное описание вашей проблемы и предоставленные логи помогут другим участникам сообщества дать вам рекомендации.
Заключение
Выявление и устранение ошибок, таких как Kernel Oops в hci_send_acl()
, требует настойчивости и внимательности. Сосредоточьтесь на обновлении ядра и поиске исправлений в официальных источниках. Успехов в вашей работе над проблемой со стабильностью Bluetooth на вашей системе!
Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью на профессиональных форумах или в сообществах Linux.