Причина
Я больше изучал проблему, и кажется, что некоторая память ядра либо неинициализирована, либо повреждена.В частности, sc_cmap_red
, sc_cmap_green
и sc_cmap_blue
из struct vesafb_softc
(в vesafbvar.h
в строках 89–91) содержат неверные данные.Это несколько удивительно, поскольку строки с 719 по 722 из vesafb.c
инициализируют его:
/* Fill in the softc colourmap arrays */
sc->sc_cmap_red[i / 3] = rasops_cmap[i + 0];
sc->sc_cmap_green[i / 3] = rasops_cmap[i + 1];
sc->sc_cmap_blue[i / 3] = rasops_cmap[i + 2];
Он содержит неверные данные, даже если я уберу это из оператора if
, в котором он находитсяпоэтому он может быть поврежден, а не неинициализирован.
Драйвер способен правильно получать и устанавливать карты цветов;он просто не может получить исходную в struct vesafb_softc
правильно.
Обходной путь
Простым решением было бы заставить программу переустановить цветовую карту по умолчанию.Как указывалось в приведенном выше фрагменте, было предположительно , чтобы получить начальные цвета от rasops_cmap
, что определено в строках с 55 по 122 в rasops.c
:
/* ANSI colormap (R,G,B). Upper 8 are high-intensity */
const u_char rasops_cmap[256*3] = {
/* ... */
};
С помощью этих цветов вы можете создать программу, которая устанавливает их в качестве текущей карты цветов.Мне пришлось внести несколько изменений, чтобы курсор не исчезал, но он в основном работал.
Лучшее решение
Пока я искал дополнительную информацию, я нашел этосообщение в блоге .Когда я перекомпилировал ядро с genfb(4)
вместо vesafb(4)
, ядро зависало при загрузке.Оказывается, это потому, что используемый мной загрузчик не был достаточно новым, чтобы передать ядру необходимые параметры.
Я случайно взглянул на NetBSD 6.0 changelog и заметил эту запись:
- amd64 , i386
Загрузчик был улучшен для поддержки консолей кадрового буфера с использованием расширений VESA BIOS.Эти изменения позволяют портам x86 работать с драйвером genfb (4) и отменяют драйвер только для i386 vesafb (4) . [jmcneill 20090216]
Я скачал NetBSD 6.0_BETA и загрузил его из приглашения загрузки следующим образом:
> vesa 640x480x8
> boot netbsd
... ивсе работало.
Короче говоря, использование более новой версии NetBSD и отключение vesafb(4)
решают проблему.