나는 방법을 알고 싶다인쇄그렇다면 Linux 커널 로그 메시지는 뒤에서 어떻게 작동합니까?
답변1
우연이네, 방금 책에서 봤어리눅스 장치 드라이버v3. 제4장그 책은 이렇게 말합니다.
메시지를 녹음하는 방법
이 함수는 커널을 구성할 때 선택된 4KB에서 1MB 사이의 값인 바이트 길이의 순환 버퍼
printk
에 메시지를 씁니다 . 그런 다음 함수는 메시지를 기다리고 있는 모든 프로세스, 즉__LOG_BUF_LEN
시스템 호출에서syslog
잠자기 상태이거나 읽고 있는 모든 프로세스를 깨웁니다/proc/kmsg
. 로깅 엔진에 대한 두 인터페이스는 거의 동일하지만, 읽기 작업은/proc/kmsg
로그 버퍼의 데이터를 소비하는 반면,syslog
시스템 호출은 선택적으로 로그 데이터를 다른 프로세스에 맡기면서 로그 데이터를 반환할 수 있습니다. 일반적으로/proc
파일을 읽는 것이 더 쉽습니다klogd
. yes 이dmesg
명령은 버퍼를 플러시하지 않고 버퍼의 내용을 보는 데 사용할 수 있습니다. 실제로 이 명령은stdout
버퍼의 내용을 읽었는지 여부에 관계없이 반환합니다. .커널 메시지를 수동으로 읽는 경우 stop 후에 리더가 차단하고 더 많은 데이터를 기다리기 때문에 파일이 FIFO처럼 보이는
klogd
것을 알 수 있습니다 . 다른 프로세스가 이미 동일한 데이터를 읽고 있는 경우 경쟁을 벌이기 때문에/proc
이 방법으로 메시지를 읽을 수는 없습니다 .klogd
순환 버퍼가 가득 차면printk
순환 버퍼의 시작 부분에 새 데이터를 추가하기 시작하여 가장 오래된 데이터를 덮어씁니다. 따라서 로깅 프로세스에서 이전 데이터가 손실됩니다. ...Linux 메시징 방법의 또 다른 특징은printk
인터럽트 처리기에서도 어디에서나 호출할 수 있고 인쇄할 수 있는 데이터 양에 제한이 없다는 것입니다. 유일한 단점은 일부 데이터가 손실될 수 있다는 것입니다.