Документация NetBSD: kernel


Kernel FAQ

Где взять исходные тексты ядра?
Как собрать ядро?
Что такое GENERIC ядро?
Что такое mclpool limit reached: increase NMBCLUSTERS?
Что такое WARNING: SPL NOT LOWERED ON SYSCALL EXIT?
Что такое Stray interrupt on IRQ 7?
Почему ядро компилируют с -msoft-float?
Ядро, откомпилированное на машине с малым количеством памяти очень медленное
Проблемы компиляции -current ядра
Отладка аварийного дампа ядра
Получение backtraces при отладке дампа ядра
Что такое DDB и что я могу с ним делать?
Генерирование аварийного дампа ядра
Добавление ядра на загрузочную дискету
Проблемы при монтировании только что созданных разделов на SCSI устройствах. Какова схема нумерования устройств?
Hardware FAQ

Что означает device not configured?
Отладка ATAPI или ATA (IDE) устройств
Отладка USB устройства
Определение нового PnP устройства
Определение нового PCMCIA устройства
Поддержка PLIP (Parallel Line IP)
Что такое UBC?

Где взять исходные тексты ядра?

Официальный источник:

Для компиляции модифицированного ядра, тогоже самого выпуска, который у Вас установлен, достаточно иметь файл syssrc.tgz. Он находится в 'source/sets/syssrc.tgz' от главной директории. Например, для NetBSD 1.5.2 исходники ядра находятся в:

/pub/NetBSD/NetBSD-1.5.2/source/sets/syssrc.tgz

Если у Вас есть NetBSD CDROM, то 'source/sets/syssrc.tgz' находится на нем. Исходники могут быть извлечены в любой каталог, хотя традиционное расположение в /usr/src. Для распаковки:

cd /
tar xvzpf "FILENAME"


'Bleeding edge' -current ветка, только для сильных духом:

Последние исходники ядра доступны на ftp.NetBSD.org или зеркалах, в каталоге /pub/NetBSD/NetBSD-current/src/sys/. Чтобы скомпилировать ядро Вы должны скачать следующее из /pub/NetBSD/NetBSD-current/tar_files/src:
config.tar.gz (Исходник программы config(8))
sys.tar.gz (Полный архив ядра для всех архитектур)

Вы должны сперва откомпилировать и установит программу config(8), в случае , если Вы хотите сменить версию ядра. Для -current версии ядра возможны проблемы с компиляцией. Рекомендуются исходники Release, пока вы не знакомы с процессом конфигурации.

Загрузка исходных текстов на определенную дату:

Это может Вам понадобится, если Вы установили snapshot и требуется пересобрать ядро и -current качать неохота. Читайте Track NetBSD-current with anoncvs.

Как собрать ядро?

Проверьте, что Вы утсановили набор компиляторов comp.tgz, шедший с основной системой
Скачайте и распакуйте исходники ядра
Если Вы скачали -current, то возможно должны скомпилировать новый набор инструментов. Если Вы полностью скачали исходники: cd /usr/src && ./build.sh tools
"cd /sys/arch/ARCH/conf"
ARCH - Ваша архитектура, например 'i386', 'sparc', 'mac68k'.
"cp GENERIC MYCONF"
MYCONF имя вашей новой конфигурации. Вы можете использовать имя хоста, тип машины или Ваше имя, по желанию. Допускаются цифры и буквы латинского алфавита и _.
Редактирование MYCONF.
Первоначально Вы можете пропустить эту стадию. Вы можете удалить драйверы для типов центрального процессора, аппаратных средств, и устройств, типа которых Вы не имеете или не используете. Также для i386 можно закомметировать линию 'pc0' и открыть линию 'vt0' для появления виртуальных консолей. Хорошим началом будет изучить вывод dmesg. Прочитайте "options(4)" для получения информации по отдельным опциям ядра.
"config MYCONF"
генерирует каталог сборки ядра.
"cd ../compile/MYCONF"
перейдем в этот каталог
"make depend"
сгенерирует нам файл зависимостей '.depend'
"make"
откомпилирует ядро. В конце Вы получите 'netbsd' ядро. Этот процесс займет много времени на VAX, мало на большой Alpha и все остальное в промежутке.
"mv /netbsd /netbsd.old ; mv /sys/arch/ARCH/compile/MYCONF/netbsd /"
это сохранит Ваше старое ядро (это ОЧЕНЬ важно) и ставит новое ядро.
"reboot"
перезагружает компьютер, используя при следующей загрузке уже новое ядро. Выводит при загрузке сообщение типа: 'NetBSD VERSION (MYCONF) #0: COMPILE_DATE'
Если у Вас проблемы:
Вы должны загрузить 'netbsd.old' ядро в режиме single user.Для выполнения этой процедуры на i386 необходимо выполнить:
Нажать SPACE, когда появится первое сообщение NetBSD
Выполнить boot netbsd.old -s
Возвращайте старое ядро:
fsck /
mount /
mv netbsd.old netbsd
exit

Что такое GENERIC ядро?

Термин GENERIC относится к ядру, которое сконфигурировано таким образом, чтобы запуститься на любой машине. Этот термин произошел из строки в файле конфигурации, который определял, что корневое устройство будет "универсально" так же как опция конфигурации.

Так как эти ядра имеют тенденцию включать поддержку всех известных драйверов устройств и типов процессоров, рекомендуется откомпилировать собственное ядро.

Что такое mclpool limit reached: increase NMBCLUSTERS?

Это означает, что ядро исчерпало пространство, чтобы отобразить кластеры mbuf. Кластеры mbuf используются сетевым кодом, чтобы хранить пакеты и другие сетевые данные.

Настройка по умолчанию для NMBCLUSTERS - 1024 (256 в NetBSD 1.5 и ранее). Пробуйте увеличивать это значение, пока сообщение об ошибке не пропадет. Посмотреть текущее значение NMBCLUSTERS можно используя sysctl(8).

# sysctl kern.mbuf.nmbclusters

Или, как вариант:

# echo 'print nmbclusters' | gdb -q /netbsd

Также смотрите options(4), для получения более детальной информации по опциям ядра.

Для изменения значения внесите в ядро изменение:

options NMBCLUSTERS=2048

Или, пропатчте бинарник:

# gdb --write /netbsd
(gdb) set nmbclusters=2048
(gdb) quit

Помните, что если Вы патчите бинарник, то после необходимо перезагрузиться.

Если Ваша архитектура поддерживает такую возможность, то можно сделать так:

# sysctl -w kern.mbuf.nmbclusters=2048

Применение этого метода вместе с патчем бинарников позволит Вам не перезагружаться и не пересобирать новое ядро.

Что такое WARNING: SPL NOT LOWERED ON SYSCALL EXIT?

Это сообщение означает, что есть ошибка в ядре, где syscall вызвал int x = splfoo (); и не называл splx (x); перед возвращением. Splx (x); функция в этом примере восстановила бы системный приоритетный уровень к тому, закодированному в x, который был значением, предварительно возвращенным одной из других функций spl (в этом случае, составленный пример splfoo ();).

Если Вы получили это сообщение, сбросьте го в ddb(4). оттрейсировав стек, нажимая "t", можно попробовать найти ошибку вызова syscall(). Вообще то Вы ни в коем случае не должны получать это сообщение.

Также смотри spl(9) для получения дополнительной информации об spl.

Что такое Stray interrupt on IRQ 7?

Это сообщение ядра обозначает, что контроллер прерывания сообщил о немаскированном прерывании на IRQ 7, но никакого драйвера, прикрепленного к этому IRQ, не 'требовало' этого.

Есть две причины, по которым это может случиться.
На какой либо платформе, отличной от PC, это означает, что что есть драйвер, прикрепленный к запросу на прерывание (иначе, IRQ было бы замаскировано), но это - неправильный драйвер.
На PC есть непонятная проблема 'default IRQ7'. Она возникает когда устройство утверждает IRQ, но сбрасывает после того , как PIC закрывает его и до подтверждения этого факта CPU, PIC возвращает неверный номер переывания.

Есть схема как распознать 'default IRQ7', но она терпит неудачу на очень старых системах. И вообще, лучше поставить исправленный драйвер, чем разбираться с этой проблемой. В некоторых случаях трудно полностью предотвратить их.

Почему ядро компилируют с -msoft-float?

Когда процесс делает системный вызов, ядро должно сохранить состояние процессора, для того чтобы иметь возможность вернуться к прежнему состоянию. Регистры , содержащие цифры с плавающей запятой обычно имеют тенденцию быть большими и относительно заполненными, что делает процедуру сохранения состояния долгой. Если операции, выполняемые FPU, будут в середине операции, то CPU будет вынужден дополнительно ждать, прежде чем сможет сохранить состояние регистров.

Отказ от регистраций операций с плавающей запятой в ядре дает большой прирост производительности. Некоторые процессоры, типа sparc могут использовать lazy context switching чтобы иногда избежать необходимости сохранять и восстанавливать регистры FP после переключения между процессами.

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

Ядро, откомпилированное на машине с малым количеством памяти очень медленное

По умолчанию NetBSD устанавливает GENERIC ядро, содержащее очень много драйверов устройств, поддержку сетевых протоколов и файловых систем. В то время как это позволяет работать ядру практически на любой машине, это приводит к замедлению работы, особенно на машинах с малым размером памяти. Это происходит из-за компиляции ядра с уровнем оптимизации -O2, который говорит компилятору использовать дополнительную память и время, чтобы сделать ядро с максимальной скоростью.

При компиляции ядра можно использовать опцию "make COPTS=-O", которая говорит компилятору использоватьтолько основные оптимизации. Это приведет к незначительному замедлению работы ядра, но займет меньше времени при компиляции.

Если вы планируете сделать несколько проходов, компилируя и перезагружая машину с новым ядром, настраивая на машине с малым количеством памяти, имеет смысл сделать несколько первых проходов с "make COPTS=-O" , а потом только "make" для конечного прохода.

Вообще, самый лучший способ компилировать ядро для машин с малым количеством памяти - использовать для компиляции ядра другую машину или временно добавить памяти.

Проблемы компиляции -current ядра

Первым пунктом Вы должны подписаться на список рассылки пользователей -current ядра. Не читая рекомендаций других пользователей, эксплуатация -current ядра подобна полету в темноте без штурвала и приборов. Вы были предупреждены:).

Всегда стоит загрузить последний config.tar.gz, потом компилирование, установка и запуск на Вашем файле конфигурации.

Иногда требуется обновить бинарники и/или библиотеки, прежде чем Вы сможете собрать -current на release. В этой ситуации Вы можете просто установить snapshot бинарников и затем собрать -current. Snapshots для -current i386 (для примера) можно найти на /pub/NetBSD/arch/i386/snapshot/. Файл src/UPDATING содержит перечень важных изменений, пытаясь собрать -current.

Отладка аварийного дампа ядра

Убедитесь, что ядро скомпилировано с DEBUG и в конфигурационном файле установлено 'makeoptions DEBUG="-g"'
"gdb netbsd.gdb" (В каталоге компиляции ядра)
"target kcore /var/crash/netbsd.0.core" в строке gdb

Вы можете использовать gdb(1) команды и в 'bt' для получения backtrace.

Получение backtraces при отладке дампа ядра

Вы можете получить следы произвольного процесса от gdb при отладке аварийного дампа ядра следующим образом:
"ps -ax -O paddr -M netbsd.x.core"
укажите gdb использовать "proc 0xaddr"

Что такое DDB и что я могу с ним делать?

DDB - дополнительный отладчик в ядре. Войти в него можно тремя способами.
В любое время через порт определенная ключевая последовательность (см. ddb (4)).
Можно вызвать, когда ядро выдало kernel panics.
Указав флаг '-d' при загрузке (boot netbsd -d).

Некоторые из более полезных команд:
trace - дает снимок стека
reboot - перезагрузка системы
sync - произвести crashdump и перезагрузку (Введено после NetBSD 1.4.х)

Генерирование аварийного дампа ядра

Обычно ядро автоматически генерирует crashdump при kernel panic Однако Вы можете вызвать crashdump в ddb (4) при использовании 'reboot 0x100'. Если ядро запаниковало или зависло, пытаясь синхронизировать буферный кэш, Вы можете использовать 'reboot 0x104', который обойдет синхронизацию.

Добавление ядра на загрузочную дискету

Для изготовления загрузочной дискеты достаточно сделать "cd /usr/src/distrib/ARCH/floppies ; make " (Вы, возможно, должны сформировать ядро INSTALL вручную перед этим). Если Вы имеете образ boot.fs, Вы можете заменить ядро:
vnconfig -c vnd0 boot.fs
mount /dev/vnd0a /mnt
gzip -c -9 < netbsd > /mnt/netbsd.gz
umount /mnt
vnconfig -u vnd0

Эти действия предполагают, что ядро сконфигурировано с поддержкой "pseudo-device vnd".

Проблемы при монтировании только что созданных разделов на SCSI устройствах. Какова схема нумерования устройств?

По умолчанию, устройства SCSI под NetBSD пронумерованы, начиная с 0. Тоесть устройство с самым низким SCSI ID будет /dev/sd0, следующее будет /dev/sd1 и т.д. Обратите внимание, что имена назначаются в процессе загрузки.

Если Вы компилируете собственное ядро, то Вы можете назначить устройству произвольное имя:

sd0 at scsibus0 target 4 lun 0
sd* at scsibus? target ? lun ?

Hardware FAQ

Что означает device not configured?

Если это сообщение появляется в процессе начальной загрузки, это означает, что ядро обнаружило устройство в вашей системе, для которого имеет драйвера. Это означает, что или драйвер устройства существует и не был вкомпилирован в ядро, которое Вы загрузили, или драйвер устройства не существует вообще.

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

Если это сообщение появляется, когда Вы пробуете обратиться к device node в /dev (например диск SCSI), то это означает, что драйвер не может найти определенный модуль устройства, к которому Вы пробовали обратиться, например обращаясь к диску SCSI, котрый сейчас отсутствует. Это часто бывает, когда устройства прописанные в /etc/fstab не соответствуют реально найденным в процессе начальной загрузки и команда "mount" пытается их примонтировать. Посмотрите внимательно файл /var/run/dmesg.boot

Отладка ATAPI или ATA (IDE) устройств

Если ядро откомпилировано с определенным WDCDEBUG, то gdb может использоваться, чтобы исправить wdcdebug_atapi_mask и wdcdebug_mask. Установка соответствующих битов в этих переменных заставит ядро выводить подробную информацию об операциях ATAPI И ATA. (В настоящее время в NetBSD WDCDEBUG установлено по умолчанию)

Для вывода максимальной информации:

# gdb --write /netbsd
(gdb) set wdcdebug_atapi_mask=0xff
(gdb) set wdcdebug_mask=0xff
(gdb) quit

Обратите внимание: обьем вывода будет очень большим. Для выбора определенных параметров смотри список флагов:
wdcdebug_atapi_mask в /sys/dev/scsipi/atapi_wdc.c
wdcdebug_mask в /sys/dev/ic/wdc.c

Отладка USB устройства

Если у Вас есть проблемы с USB устройствами, Вы можете запустить драйвер USB в режиме выдачи отладочных сообщений:
Откомпилировать ядро с поддержкой USB_DEBUG и DDB
Загрузиться с опцией -d
В ddb выставить значение переменных usbdebug и uhcidebug равным 5 ("write usbdebug 5" и "write uhcidebug 5")
Подключить устройство

Определение нового PnP устройства

Это предполагает, что устройство имеет универсальный тип, который уже поддерживается, но его ID не признан. Добавление устройства, которое построенное по-другому, включает написание кода.
Обратите внимание на сообщения "not configured" при загрузке. Посмотрите ID устройства (В нашем случае USR3031).

isapnp0: port 0x3e8/8 irq 5 not configured

Добавьте соответствующую запись в /sys/dev/isapnp/isapnpdevs:

devlogic com USR3031 USR 56k Faxmodem

Обновите isapnpdevs.{c,h}, используя 'make -f Makefile.isapnpdevs'
Пересоберите ядро
Вышлите PR с исменениями, используя send-pr(1) или через web-форму

Определение нового PCMCIA устройства

Это предполагает, что устройство имеет универсальный тип, который уже поддерживается, но его ID не признан. Добавление устройства, которое построенное по-другому, включает написание кода.
Откомпилируйте ядро с опцией PCMCIAVERBOSE
Проверьте наличие при выводе загрузочной информации записей 'not configured'. Обратите внимание на производителя и тип устройств (в нашем случае 0x143 и 0x201):

pcmcia0: CIS version PCMCIA 2.0 or 2.1
pcmcia0: CIS info: Grey Cell, GCS2000, Gold II, 1
pcmcia0: Manufacturer code 0x143, product 0x201
pcmcia0: function 0: network adapter, ccr addr 3f8 mask 1

Добавьте записи vendor и product в /sys/dev/pcmcia/pcmciadevs
Обновите pcmciadevs.h и pcmciadevs_data.h используя 'make -f Makefile.pcmciadevs'
Добавьте запись в таблицу устройств /sys/dev/pcmcia/. Напимер, для ne2000 сетевой карты используйте /sys/dev/pcmcia/if_ne_pcmcia.c
Перекомпилируйте ядро
Вышлите PR с исменениями, используя send-pr(1) или через web-форму

Поддержка PLIP (Parallel Line IP)

Martin Husemann добавил поддержку PLIP в NetBSD/i386. Описание можно найти в PR 1278. Изменения доступны с NetBSD 1.3.3.

Что такое UBC?

Расшифровывается как Unified Buffer Cache проект. Это было написано Чаком Силверсом, и было интегрировано в NetBSD 1.5L (ноябрь 2000). При обновлении от non-UBC установки, необходимо повторно запустить config. Также необходимо удалить любые параметры настройки для "BUFCACHE", "NBUF" или "BUFPAGES", и позволить размеру буферного кэша принять значение по умолчанию. При работе UBC традиционный буферный кэш больше не используется для хранения данных файла, там могут находиться только метаданные и большей частью физической памяти управляет VM система. Размер буферного кэша, установленный по умолчанию, будет достаточен для большинства пользователей, независимо от объема памяти в машине.

Смотрите UBC: An Efficient Unified I/O and Memory Caching Subsystem for NetBSD от Chuck Silvers для более подробной информации.

Обновлено: 13.03.2015