printk는 내부적으로 정확히 어떻게 작동합니까? 있습니다. 또한 printf라이브러리가 없으므로 Linux 소스 코드에서

printf작업을 수행하려면 OS의 도움 이 필요하다는 것을 알고 있습니다.

또한 printf라이브러리가 없으므로 Linux 소스 코드에서 작동하지 않는다는 것을 알고 있습니다. 그리고 우리는 printk디버깅 을해야 합니다.

printkOS가 여전히 부팅 될 때 어떻게 작동합니까?



답변

이 참고 문헌에는 Linux Kernel Development Second Edition 이라는 제목의 질문에 대한 답변이있는 것 같습니다 .

발췌

printk ()

커널 인쇄 기능 printk()은 C 라이브러리 printf()기능 과 거의 동일하게 작동 합니다. 실제로이 책 전체에서 우리는 실제 차이점을 이용하지 않았습니다. 대부분의 의도에서 이것은 괜찮습니다. printk()단순히 커널의 형식화 된 인쇄 기능의 이름입니다. 그러나 약간의 차이가 있습니다.

printk ()의 ​​견고성

printk()당연한 것으로 여겨지는 속성 중 하나 는 견고성입니다. 이 printk()함수는 언제든지 커널의 어느 곳에서나 호출 할 수 있습니다. 인터럽트 또는 프로세스 컨텍스트에서 호출 할 수 있습니다. 잠금이 유지되는 동안 호출 할 수 있습니다. 여러 프로세서에서 동시에 호출 할 수 있지만 호출자가 잠금을 보유 할 필요는 없습니다.

탄력적 인 기능입니다. 유용성 printk()이 항상 존재하고 항상 작동한다는 사실에 의지하기 때문에 이것은 중요 합니다.

printk ()의 ​​비강 건성

printk()의 견고 함의 갑옷에 존재합니다. 콘솔을 초기화하기 전에 커널 부팅 프로세스의 특정 시점 이전에는 사용할 수 없습니다. 실제로 콘솔이 초기화되지 않은 경우 출력은 어디로 가야합니까?

부팅 프로세스 초기에 문제를 디버깅하지 않는 한 (예 : setup_arch()아키텍처 별 초기화를 수행하는 경우)에는 일반적으로 문제가되지 않습니다 . 이러한 디버깅은 시작하기 어려운 과제이며, 어떤 종류의 인쇄 방법이 없으면 문제를 복잡하게 만듭니다.

희망은 있지만 많이는 아닙니다. 하드 코어 아키텍처 해커는 외부 포트와 통신하기 위해 작동하는 하드웨어 (예 : 직렬 포트)를 사용합니다. 대부분의 사람들에게는 이것이 재미없는 일이라고 믿어주세요. 지원되는 일부 아키텍처는 제정신 솔루션을 구현하지만 다른 아키텍처 (i386 포함)에는 하루를 절약 할 수있는 패치가 있습니다.

이 솔루션은 printk()부팅 프로세스 초기에 콘솔에 출력 할 수 있는 변형입니다 early_printk(). 동작은와 동일하며 printk()이름과 이전 작업 기능 만 변경됩니다. 그러나 지원되는 모든 아키텍처에 이러한 방법이 구현되어있는 것은 아니기 때문에 휴대용 솔루션이 아닙니다. 하지만 가장 친한 친구가 될 수 있습니다.

부팅 프로세스 초기에 콘솔에 쓸 필요가 없다면 printk()항상 작동 할 수 있습니다 .


답변

OS가 여전히 부팅 될 때 printK는 어떻게 작동합니까?

printk()가능한 경우 콘솔로 이동하고 우선 순위가 충분히 높습니다. 커널이 VT를 초기화하여 실현 가능하게 만드는 시점은 확실하지 않지만 분명히 상당히 빠릅니다.

[src]/kernel/printk/printk.c꽤 잘 문서화되어 있습니다. 콘솔 액세스는 세마포어를 통해 제어되는 것으로 보입니다. 메시지는 /dev/dmsg우선 순위에 관계없이에 삽입됩니다 .