The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

NetBSD FAQ: ядро (netbsd kernel faq)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: netbsd, kernel, faq,  (найти похожие документы)
From: Михаил Сгибнев <mixa(@).dreamcatcher.ru> Date: 2006-09-13 15:03:02 Subject: NetBSD FAQ: ядро
Перевод: Сгибнев Михаил



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



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

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

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

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

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

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

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

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

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



  1. Проверьте, что Вы утсановили набор компиляторов comp.tgz, шедший с основной системой
  2. Скачайте и распакуйте исходники ядра
  3. Если Вы скачали -current, то возможно должны скомпилировать новый набор инструментов. Если Вы полностью скачали исходники: cd /usr/src && ./build.sh tools
  4. "cd /sys/arch/ARCH/conf"
    ARCH - Ваша архитектура, например 'i386', 'sparc', 'mac68k'.
  5. "cp GENERIC MYCONF"
    MYCONF имя вашей новой конфигурации. Вы можете использовать имя хоста, тип машины или Ваше имя, по желанию. Допускаются цифры и буквы латинского алфавита и _.
  6. Редактирование MYCONF.
    Первоначально Вы можете пропустить эту стадию. Вы можете удалить драйверы для типов центрального процессора, аппаратных средств, и устройств, типа которых Вы не имеете или не используете. Также для i386 можно закомметировать линию 'pc0' и открыть линию 'vt0' для появления виртуальных консолей. Хорошим началом будет изучить вывод dmesg. Прочитайте "options(4)" для получения информации по отдельным опциям ядра.
  7. "config MYCONF"
    генерирует каталог сборки ядра.
  8. "cd ../compile/MYCONF"
    перейдем в этот каталог
  9. "make depend"
    сгенерирует нам файл зависимостей '.depend'
  10. "make"
    откомпилирует ядро. В конце Вы получите 'netbsd' ядро. Этот процесс займет много времени на VAX, мало на большой Alpha и все остальное в промежутке.
  11. "mv /netbsd /netbsd.old ; mv /sys/arch/ARCH/compile/MYCONF/netbsd /"
    это сохранит Ваше старое ядро (это ОЧЕНЬ важно) и ставит новое ядро.
  12. "reboot"
    перезагружает компьютер, используя при следующей загрузке уже новое ядро. Выводит при загрузке сообщение типа: 'NetBSD VERSION (MYCONF) #0: COMPILE_DATE'
  13. Если у Вас проблемы:
    Вы должны загрузить '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).

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

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

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

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

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

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

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

Что такое 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, не 'требовало' этого.

Есть две причины, по которым это может случиться.
  1. На какой либо платформе, отличной от PC, это означает, что что есть драйвер, прикрепленный к запросу на прерывание (иначе, IRQ было бы замаскировано), но это - неправильный драйвер.
  2. На 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.

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



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


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

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



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


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



DDB - дополнительный отладчик в ядре. Войти в него можно тремя способами.

Некоторые из более полезных команд:

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



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

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



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


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

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



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

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

Hardware FAQ



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




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



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

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



Обратите внимание: обьем вывода будет очень большим. Для выбора определенных параметров смотри список флагов:

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



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

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



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

      isapnp0: port 0x3e8/8 irq 5 not configured

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

      devlogic com USR3031 USR 56k Faxmodem

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


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



Это предполагает, что устройство имеет универсальный тип, который уже поддерживается, но его ID не признан. Добавление устройства, которое построенное по-другому, включает написание кода.
  1. Откомпилируйте ядро с опцией PCMCIAVERBOSE
  2. Проверьте наличие при выводе загрузочной информации записей '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

  3. Добавьте записи vendor и product в /sys/dev/pcmcia/pcmciadevs
  4. Обновите pcmciadevs.h и pcmciadevs_data.h используя 'make -f Makefile.pcmciadevs'
  5. Добавьте запись в таблицу устройств /sys/dev/pcmcia/. Напимер, для ne2000 сетевой карты используйте /sys/dev/pcmcia/if_ne_pcmcia.c
  6. Перекомпилируйте ядро
  7. Вышлите 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 для более подробной информации.


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру