Проверка очереди завершения администрирования переходит в бесконечный цикл (NVMe через PCIe)

Я создаю 64-битное ядро ​​x86-64 и тестирую его на своей реальной машине. В коде драйвера nvme я создаю очередь завершения ввода-вывода и вызываю функцию nvme_admin в строке №. 312 (см. 0 ).

Я проверяю очередь завершения администратора после отправки команд контроллеру. Я отправляю команды в очередь отправки администратора, начиная со строки №. 258, и я пишу новое хвостовое значение в строке №. 221. Затем я проверяю очередь завершения при вызове функции nvme_admin_wait в строке 234. Здесь цикл do- while в строке №. 206 — бесконечный цикл.

Как определить, почему запись администратора никогда не обрабатывалась? После записи в регистр дверного звонка бит паузы обработки (CSTS.PP) равен 0. Кроме того, контроллер включен, готов и исправен (CSTS.CFS). Что-то не так с командами, которые я отправил контроллеру nvme?

Обновлено: после исправления функции получения базового адреса nvme она работает на qemu, но все еще не на моей реальной машине.

Спасибо.

Я ожидаю увидеть очистку TLB после изменения PDE. Что еще более важно, я ожидаю увидеть там некоторые барьеры памяти, например. между заполнением команды и ее отправкой, а также между отправкой команды и проверкой статуса. Вдобавок ко всему, такие функции, как nvme_init_identify, являются безумием с точки зрения языка C, если в них нет хотя бы какой-то изменчивости (см. godbolt.org/z/5z4eqW94d, чтобы узнать, как компилятор C это исказит).

Andrey Turkin 27.05.2024 01:17

Как упомянул Андрей, каждый раз, когда вы получаете доступ к аппаратному регистру через указатель, на нем должен быть volatile. (например) val = *((volatile uint32_t *) addr); Для удобства вы можете обернуть это в макрос или встроенную функцию.

Craig Estey 27.05.2024 02:06

использование ключевого слова volatile не помогает ему работать на моей реальной машине. Я исправил функцию получения базового адреса nvme, и теперь она работает в qemu. Но как заставить его работать на моей реальной машине? Хотя спасибо за предложения.

Charlie_23 27.05.2024 17:53

@AndreyTurkin из моего последнего комментария от 27 мая, не могли бы вы рассказать мне, что еще я могу попробовать?

Charlie_23 19.06.2024 12:22

Уже сделал, ты просто проигнорировал. Барьеры памяти? Вы добавили volatiles... отлично, теперь ваш компилятор делает то, что вы хотите. Также есть процессор, который может свободно переупорядочивать/разделять/объединять операции чтения и записи в каком-то диком и удивительном порядке, и устройства MMIO не могут с этим жить (qemu - это эмуляция на основе процессора, поэтому он всего этого не видит). Работать с MMIO довольно сложно! Гуглите, как это сделать правильно. Вот прискорбно маленькое резюме на osdev: wiki.osdev.org/Memory_mapped_registers_in_C/C++ , а вот довольно умопомрачительная история о Linux: lwn.net/Articles/698014

Andrey Turkin 19.06.2024 19:38

Спасибо @AndreyTurkin. Раньше я не понимал, как использовать барьеры памяти. На этот раз по предоставленной вами ссылке osdev я добавил барьеры памяти GCC asm volatile ("": : :"memory"); в места, которые вы упомянули ранее. Он до сих пор не работает :(

Charlie_23 21.06.2024 08:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил эту проблему с драйвером NVMe. Я переписал драйвер с нуля, следуя вики и спецификации, и этот коммит (см. [0]) наконец заставил его работать.

Огромное спасибо за помощь в комментариях выше :) Я многому научился на этом пути.

[0]: https://github.com/robstat7/Raam/commit/eb9bd8c725808d963abd1c87ec2a5e2bcb899d9b

Другие вопросы по теме