기본 색인 | 섹션 9 | 日本語 | 옵션 |
#include <sys/types.h>
#include <sys/systm.h>
통상 각각의 세치기를 사용하는 드라이버는, config 파일의 키워드에 의해 1 개의 세치기 우선도 그룹에 할당할 수 있습니다. 예를 들면,
device foo0 at isa? port 0x0815 irq 12 tty
(은)는, 세치기 12 를 "tty" 우선도 그룹에 할당합니다. 시스템은 자동적으로 xxx 그룹의 세치기를 우선도가 spl xxx () 이상때에 불리는 대로 준비합니다.
splx() 함수는 끼어들어 우선도 레벨을 절대적인 수치로 설정합니다. 이것은 다른 세치기 레벨 함수가 돌려준 값을 로컬의 변수에 보존해, 다음에 원의 우선도 레벨에 되돌리기 위해서(때문에) splx() (을)를 사용하는 일을 의도하고 있습니다.
spl0() 함수는 모든 인터럽트 처리기를 블록 하지 않는 값에 우선도를 감소시킵니다. 다만, AST(비동기 시스템 트랩)는 시스템이 유저 모드로 돌아올 때까지 는 블록 됩니다.
여러가지 디바이스 드라이버의 세치기 우선도 그룹의 전통적인 할당은, 대체로 다음과 같이 분류할 수 있습니다.
splnet() | |
모든 네트워크 인터페이스 드라이버. | |
splbio() | |
모든 버퍼 입출력 (즉 디스크등)의 드라이버. | |
spltty() | |
기본적으로는 네트워크 이외의 통신 디바이스입니다만, 사실상은 네트워크와 디스크 이외의 모든 드라이버. | |
struct foo_softc { ... int flags; #define FOO_ASLEEP 1 #define FOO_READY 2인터럽트 처리기는 절대로 우선도 레벨을 감소시켜서는 안된, 이라고 하는 것에 주의해 주세요. 자동적으로, 자신의 레벨의 세치기 우선도에 증가 당합니다. 즉, 같은 그룹의 모든 세치기는 블록 됩니다.} foo_softc[NFOO];
int foowrite(...) { struct foo_softc *sc; int s, error;
... s = spltty(); if (! (sc->flags & FOO_READY)) { /* 준비가 되어 있지 않습니다, 대기하지 않으면 안됩니다 */ sc->flags |= FOO_ASLEEP; error = tsleep(sc, PZERO, "foordy", 0); sc->flags &= ~FOO_ASLEEP; } sc->flags &= ~FOO_READY; splx(s);
... }
void foointr(...) { struct foo_softc *sc;
... sc->flags |= FOO_READY; if (sc->flags & FOO_ASLEEP) /* 누군가가 우리를 기다리고 있습니다, 일으켜 주세요 */ wakeup(sc); ... }
SPL (9) | July 21, 1996 |
기본 색인 | 섹션 9 | 日本語 | 옵션 |
Ben Bullock이 유닉스 매뉴얼 페이지에서 서비스에 대한 의견을 주시기 바랍니다. Privacy policy.
“ | How do you pronounce UNIX ? You Nix ! | ” |