Как отправить данные через последовательный порт без операционной системы в c минимально? - PullRequest
4 голосов
/ 17 мая 2019

Я пытаюсь отладить гипервизор, который я пишу, и настраиваю последовательный порт между двумя виртуальными машинами в плеере Vmware (я тестирую гипервизор на виртуальной машине с поддержкой вложенных vt-x). Мой вопрос заключается в том, как я могу перенести данные с гипервизора на последовательный порт без помощи ОС (большая часть ОС программного стека недоступна, когда гипервизор включен). Я знаю, что могу видеть, как другие системы реализуют отправку на последовательный порт и реализуют этот способ, но это превосходит точку отладки, потому что реализация полного интерфейса с последовательным портом может занять больше времени, чем поиск ошибок вручную. Мне нужно только отправить одно число или строку, поэтому я ищу возможное минималистское решение.

Пока я не знаю, что я использовал netconsole для передачи отладочной информации, но ошибка, с которой я сталкиваюсь сейчас, происходит до того, как ядро ​​вернуло контроль, поэтому netconsole не может отправлять какие-либо данные. Если у кого-то есть лучшее представление о том, как передавать отладочную информацию, кроме использования последовательного порта, я хотел бы услышать это.

Прямо сейчас я вошел в этот Ресурс https://en.wikibooks.org/wiki/Serial_Programming/8250_UART_Programming, который может иметь отношение к моему вопросу, но мне было бы интересно, если кто-то может уточнить, отправка данных с использованием, работает, но порядок данных нарушен и не могут быть использованы для отладки, так что пока это не помогает.

1 Ответ

0 голосов
/ 24 мая 2019

Довольно просто настроить и использовать последовательный порт для диагностического вывода, и я предсказываю, что вы найдете его чрезвычайно полезным.Начнем с того, что вы можете использовать его только для вывода отладочной информации, но, поскольку он может быть двунаправленным, вы можете расширять его по мере необходимости для выполнения таких операций, как дамп и изменение памяти и регистров (как состояния гипервизора, так и гостевого состояния).

Чтобы настроить последовательный порт, сначала необходимо найти базовый адрес.Если это COM1, то это 3f8, поэтому я буду использовать это в качестве примера.Чтобы инициализировать порт, запишите эти значения, используя инструкцию OUT:

3fb = 80  // LCR = DLAB
3f8 = 1   // DLL = divisor low (115200 baud)
3f9 = 0   // DLM = divisor high
3fb = 3   // LCR = 8/1/n
3f9 = 0   // IER = 0
3fa = 1   // FCR = FIFO enable
3fc = 3   // MCR = terminal ready | request to send

Чтобы отправить символ, прочитайте из 3fd (LSR), используя инструкцию IN, и цикл, пока не будет установлен бит 5 (пустой THR).Затем запишите этот символ в 3f8 (THR).

Конечно, драйвер последовательного порта может быть намного более сложным, чем этот, но этого достаточно, чтобы начать работу.

...