|
NetBSD 문서:커널 |
/pub/NetBSD/NetBSD-1.6.2/source/sets/syssrc.tgzNetBSD CD-Rom을 가지고 있다면 'source/sets/syssrc.tgz' 파일이 포함 되어 있습니다. 커널 소스는 아무곳에나 압축을 해제 할 수 있습니다. 그렇지만 보통 /usr/src 아래 압축을 해제 합니다. "cd / ; tar xvzpf <FILENAME>" 명령으로 압축을 해제합니다.
cd /usr/src && ./build.sh tools
cd /usr/src && ./build.sh kernel=MYCONF부팅이 된 뒤에는 커널을 원래대로 되돌립니다:
GENERIC 이라는 말은 머신 아키텍처를 지원하는 모든 머신에서 실행할 수 있도록 설정된 커널을 의미합니다. 이 단어는 원래 커널 설정 파일중에 루트 디바이스를 "generic"으로 하는 것을 나타내는 행에서 유래되었습니다. 그러나 이 옵션과 설정행은 이제 사용하지 않지만 이 명칭은 당분간 남아 있을 것입니다.
그러므로 GENERIC 커널은 모든 디바이스 드라이버와 머신 모델을 지원하는 코드 들을 포함하고 있습니다. 대부분 당신이 사용하지 않는 것들이므로 당신의 시스템에 맞는 커널 컴파일을 추천 합니다.
NMBCLUSTERS의 기본 설정값은 1024(NetBSD 1.5와 그 이하는 256)입니다. 그래서 문제가 생기면 에러 메시지가 나오지 않을 때까지 이 값을 배로 늘려 주십시오. 현재의 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이 방법은 곧바로 적용이 가능하지만 재부팅 했을 경우 값이 유지되지 않습니다. 이 방법과 커널 바이너리를 직접 변경하는 방법을 함께 사용하면 새로 커널을 컴파일 하거나 재부팅 할 필요도 없습니다.
만약 이 커널 메시지를 만나게 되면 커널 디버거 ddb(4)를 사용하십시오. ddb에서 't'를 누르면 스택 트레이스를 할 수 있는데, 문제가 생긴 syscall()을 확인 할 수 있습니다. 이 커널 메시지는 어떠한 일이 있더라도 출력될리는 없으므로, 트레이스 명령 의 출력(다른 관련 정보도 포함)을 send-pr(1)하는 것이 좋습니다.
spl 함수에 대한 자세한 정보는 spl(9)를 참조해 주십시오.
이런 상황이 발생 할 수 있는 원인은 두가지 입니다:
'default IR7'을 전제로 하는 방법도 있습니다. 그러나 오래된 머신에서는 오히려 상황이 악화되는 것도 있고, 일반적으로도 드라이버를 수정하여 이 상황을 만들지 않는 것이 좋습니다. 그렇다고 해도 edge-triggered 인터럽트를 사용하고 있으면 완전한 예방이 곤란한 경우도 있습니다.
이 커널 메시지는 커널에 DEBUG 옵션을 정의 했을때만 발생합니다.
프로세스가 시스템 콜을 호출 했을때 다시 그 프로세스로 돌아올 수 있도록 커널은 프로세서의 상태를 저장할 필요가 있습니다. 부동 소수점 레지스터는 크기가 커지기 쉽습니다. 그래서 이것들을 저장하거나 불러오는 작업은 비싼 작업입니다. 만약 FPU가 아직 연산을 실행 중이라면 CPU는 그 연산이 완료될때까지 기다리지 않으면 레지스터를 복사할 수 없습니다.
커널 내에서 부동 소수점 레지스터의 사용을 피하는 것이 시스템 콜 실행의 효율을 높일 수 있습니다. sparc등 몇몇 프로세서들은 부동 소수점 문맥 교환을 비활성화 하여 프로세스 교환때 부동 소수점 레지스터의 저장, 불러오기 처리를 생략할 수도 있습니다.
몇몇 아키텍쳐에서는 컴파일러에서 주요한 동작(블록 메모리 복사 등)동작의 속도 향상을 위해 부동 소수점 레지스터를 사용하기 때문에 이 기능을 사용하지 않기 위해서는 '-msoft-float' 옵션이 필요합니다.
커널 컴파일 할때 컴파일러에게 약간의 최적화만 실시하도록 지시하기 위해서는 "make COPTS=-O" 옵션을 사용합니다. 이 옵션을 사용하면 컴파일된 커널은 덜 최적화 되어 조금 느릴 수 있지만, 컴파일에 걸리는 시간은 짧아집니다.
만약 메모리가 작은 컴퓨터를 사용하고 있고 커널을 컴파일 하기 위해 몇번이나 '컴파일, 새로운 커널로 재부팅'을 반복할 생각이 있다면 처음 몇번은 "make COPTS=-O"를 사용하고 마지막에 "make"를 사용하는 것이 좋을지도 모릅니다.
물론 메모리가 작은 컴퓨터에서 커널을 컴파일 하는데 일반적으로 가장 빠른 방법은 다른 컴퓨터를 사용하는것, 일시적으로 메모리를 더 증설하는 것입니다!
최신 config.tar.gz 을 받아서 컴파일, 설치하여 당신의 커널 설정 파일에 대해서 다시 config를 실행해 주십시오. (config 명령은 릴리즈 마다 꽤 자주 바뀝니다.)
가끔 바이너리나 라이브러리를 미리 업그레이드 해두지 않으면 -current 를 구축하지 못하는 경우도 있습니다. 이러한 경우 바이너리 스냅샷으로부터 설치 한 다음 -current를 구축하는 것이 간단합니다. 예로 i386의 -current의 스냅샷은 /pub/NetBSD/arch/i386/snapshot/에 있습니다. src/UPDATING에는 -current나 -current 커널의 중요한 변경사항에 대한 정보가 실려 있으므로 꼭 참고하시기 바랍니다.
기본적으로 NetBSD에서는 SCSI 장치는 SCSI ID 번호 순서에 0부터 번호를 붙입니다. 제일 작은 번호의 SCSI 장치가 /dev/sd0가 되고 다음의 장치가 /dev/sd1가 되는 식입니다. 이것은 부팅 과정에서 그대로 사용됩니다. 주의해 주십시오.
만약 당신이 커널 컴파일을 한다면 좋아하는 SCSI ID 번호를 나타내는 SCSI 장치를 설정 할 수 있습니다. 이 설정은 다음 커널 설정 파일과 같이 하면 됩니다:
위의 2줄을 이용하면 sd0은 SCSI ID 번호가 4인 디스크가 되고 나머지 장치는 기본적인 규칙을 따릅니다. 이것은 SCSI 장치의 "hardwiring"으로 RAID나 ccd를 사용하는 경우에 이 설정을 하는 것을 추천합니다. 이렇게 하면 하느의 장치에 전원이 들어가 있지 않거나 고장난 경우 장치 ID가 바뀌어 버리는 것을 피할 수 있습니다.sd0 at scsibus0 target 4 lun 0 sd* at scsibus? target ? lun ?
이 메시지가 시스템 부팅중 autoconfiguration 출력에서 나왔다면 커널이 시스템의 어떤 하드웨어를 찾았지만 그 하드웨어에 맞는 디바이스 드라이버가 없는 것을 의미합니다. 이것은 디바이스 드라이버는 존재하지만 부팅한 커널에는 포함되지 않은 경우와 디바이스 드라이버가 정말로 존재하지 않는 경우. 양쪽 모두 가능성이 있습니다. (후자의 경우 친절한 개발자에게 연락을 하면 테스트용 하드웨어로 디바이스 드라이버를 작성해 줍니다.)
GENERIC 커널은 기본 설치에 사용되므로 안정적으로 동작하는 것이 중요합니다. 아직 안정화 되지 않은 디바이스 드라이버는 GENERIC 커널에 포함되어 있지 않습니다. 당신의 시스템용 GENERIC 커널의 설정파일을 보면 "주석 처리된" 실험적인 디바이스 드라이버를 볼 수 있습니다. 만약 당신의 시스템에 맞게 설정한 커널 (그것을 GENERIC 커널이라 부르지 마십시오.)을 컴파일 한다면 실험적인 디바이스 드라이버를 시험해 볼 수 있습니다.
만약 이 메지시가 /dev에 있는 디바이스 노드(예: SCSI 디스크) 에 접근하려고 했을 때 출력되었다면, 그것은 접근하려고한 장치를 찾아낼 수 없었던 것을 의미합니다. 예를 들면, 존재하지 않는 SCSI 디스크에 접근하려 했을 경우 입니다.
가끔 이것은 /etc/fstab에 설정된 디바이스 노드와 커널이 부팅할때 auroconfiguration으로 찾아낸 것이 일치하지 않을때로 /etc/rc 에서 "mount" 명령이 모든 파일 시스템을 마운트 하려고 했을때 일어납니다. 사용하려고 하는 장치가 부팅시에 커널에 의해서 찾아지고 있는지 지금 한번 확인해 주십시오. 확인 할때에는 /var/run/dmesg.boot(부팅시 autoconfiguration의 출력결과의 복사본이 저장되고 있습니다.)를 보면 됩니다.
wdcdebug_atapi_mask와 wdcdebug_mask의 값을 수정 할 수
있습니다.
이러한 변수중에서 적절한 비트를 설정하면 커널은 ATAPI와 ATA 조작에 대한
자세한 정보를 출력하게 됩니다.최고 레벨의 출력을 얻기 위해서는 다음과 같이 합니다:
# gdb --write /netbsd (gdb) set wdcdebug_atapi_mask=0xff (gdb) set wdcdebug_mask=0xff (gdb) quit주의: 이 설정은 매우 많은 양의 출력을 하게 합니다. 각각의 옵션을 선택하기 위해서는 비트 플래그 리스트를 참고해 주십시오:
isapnp0: <U.S. Robotics 56K FAX INT, USR3031, , > port 0x3e8/8 irq 5 not configured
devlogic com USR3031 USR 56k Faxmodem
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
중요한 바뀐점은 보다 많은 메모리를 일반 파일 데이터의 캐쉬에 이용할 수 있는 것입니다. 이 때문에 접근하려고 하는 파일의 데이터가 이미 메모리에 올라와 있는 경우가 많아져서 결과적으로 파일시스템의 입출력이 빨라 집니다. 빨라지는 경우는 어떤것을 하느냐에 따라 다르지만 아마 그 차이를 느낄 수 있을 것입니다.
다음을 참고하십시오: Chuck Silvers의 UBC: An Efficient Unified I/O and Memory Caching Subsystem for NetBSD
|
|