buf 구조

용도

프로그램과 주변 장치 간의 버퍼링 데이터 전송에 대해 설명합니다.

커널 버퍼 소개

블록 장치의 경우 커널 버퍼는 프로그램과 주변 장치 간의 데이터 전송을 버퍼링하는 데 사용됩니다. 이러한 버퍼는 4096바이트 블록으로 할당됩니다. 언제든지 각 메모리 블록은 장치 드라이버와 커널이 유지 관리하는 두 개의 연결 목록 중 하나의 구성원입니다.

목록 설명
사용 가능한 버퍼 큐(avlist) 사용 가능한 모든 버퍼 목록입니다. 이러한 버퍼에는 장치로 또는 장치에서 전송되기를 기다리는 데이터가 포함되어 있지 않습니다.
사용 중인 버퍼 큐(블리스트) 장치로 또는 장치에서 전송되기를 기다리는 데이터가 포함된 모든 버퍼의 목록입니다.

각 버퍼에는 버프 그것을 가리키는 구조입니다. 각 버퍼 헤더는 여러 부분으로 구성됩니다.

  • 블록에 대한 정보
  • 상태 정보를 표시하는 플래그
  • 통화 중 목록 앞으로 및 뒤로 포인터
  • 사용 가능한 목록 앞으로 및 뒤로 포인터

장치 드라이버는av_forwav_back커널이 유지하는 동안 (사용 가능한 블록에 대한) 포인터b_forwb_back포인터(사용 중인 블록용).

블록 I/O를 위한 buf 구조 변수

그만큼 버프 구조는/usr/include/sys/buf.h 파일에는 다음 필드가 포함됩니다.

항목 설명
b_flags 플래그 비트. 이 필드의 값은 다음 값 중 0개 이상을 논리적으로 OR하여 구성됩니다.
B_쓰기
이 작업은 쓰기 작업입니다.
이 작업은 쓰기가 아닌 데이터 읽기 작업입니다.
B_완료
버퍼에 대한 I/O가 완료되어 버퍼 정보가 다른 버전보다 최신 상태입니다.
B_ERROR
전송 오류가 발생하여 거래가 중단되었습니다.
B_바쁨
블록이 사용 가능 목록에 없습니다.
B_INFLIGHT
이 I/O 요청은 처리를 위해 물리적 장치 드라이버로 전송되었습니다.
B_AGE
데이터는 곧 재사용될 가능성이 없으므로 재사용을 위해 이 버퍼를 선호합니다. 이 플래그는 버퍼가 사용 가능 목록의 끝이 아닌 선두로 이동함을 나타냅니다.
B_ASYNC
이 블록에서 비동기 I/O가 수행되고 있습니다. I/O가 완료되면 블록을 해제합니다.
B_DELWRI
이 블록이 사용 가능 목록에 있더라도 버퍼를 재사용하기 전에 이 버퍼의 내용을 기록해야 합니다. 이는 다음에서 사용됩니다. 쓰다 시스템이 동일한 블록에 대한 또 다른 쓰기가 곧 발생할 것으로 예상하는 경우 서브루틴입니다.
B_NOHIDE
DMA(직접 메모리 액세스) 전송 중에 데이터 페이지가 숨겨져서는 안 됨을 나타냅니다.
B_SETMOD
향상된 I/O 파일 시스템을 통해 페이지가 수정된 것으로 간주될 수 있습니다.
B_STALE
I/O 오류로 인해 데이터가 디스크의 데이터와 충돌합니다.
B_ XREADONLY
외부 페이저 버퍼 목록의 읽기 전용 페이지를 나타냅니다.
B_MORE_DONE
설정되면 이 수신자에게 나타납니다. 버프 더 많은 구조가 대기 중인 구조입니다. 요오드 수준. 이를 통해 장치 드라이버는 새 요청을 처리하기 전에 완료된 모든 요청을 처리할 수 있습니다.
B_SPLIT
설정된 경우 데이터 버퍼 내 어디에서나 전송이 시작될 수 있음을 나타냅니다.
b_forw 앞으로 사용 중인 블록 포인터입니다.
b_back 뒤로 사용 중인 블록 포인터입니다.
av_forw 드라이버 요청 큐의 정방향 포인터입니다.
av_back 드라이버 요청 큐에 대한 역방향 포인터입니다.
b_iodone 누구든지 전화를 걸면 전략 루틴은 I/O 완료 루틴을 가리키도록 이 필드를 설정해야 합니다. 이 루틴은 인티오돈 방해하다 I/O가 완료되었을 때의 레벨입니다.
b_dev 메이저 및 마이너 장치 번호입니다.
b_bcount 데이터 전송에 대한 바이트 수입니다.
b_un.b_addr 데이터 버퍼의 메모리 주소입니다.
b_blkno 장치의 블록 번호입니다.
b_resid 오류 이후 전송되지 않은 데이터의 양입니다.
b_event 이벤트 목록의 앵커입니다.
b_xmemd 교차 메모리 설명자.