답변:
이 참고 문헌에는 Linux Kernel Development Second Edition 이라는 제목의 질문에 대한 답변이있는 것 같습니다 .
발췌
printk ()
커널 인쇄 기능
printk()
은 C 라이브러리printf()
기능 과 거의 동일하게 작동 합니다. 실제로이 책 전체에서 우리는 실제 차이점을 이용하지 않았습니다. 대부분의 의도에서 이것은 괜찮습니다.printk()
단순히 커널의 형식화 된 인쇄 기능의 이름입니다. 그러나 약간의 차이가 있습니다.printk ()의 견고성
printk()
당연한 것으로 여겨지는 속성 중 하나 는 견고성입니다. 이printk()
함수는 언제든지 커널의 어느 곳에서나 호출 할 수 있습니다. 인터럽트 또는 프로세스 컨텍스트에서 호출 할 수 있습니다. 잠금이 유지되는 동안 호출 할 수 있습니다. 여러 프로세서에서 동시에 호출 할 수 있지만 호출자가 잠금을 보유 할 필요는 없습니다.탄력적 인 기능입니다. 유용성
printk()
이 항상 존재하고 항상 작동한다는 사실에 의지하기 때문에 이것은 중요 합니다.printk ()의 비강 건성
printk()
의 견고 함의 갑옷에 존재합니다. 콘솔을 초기화하기 전에 커널 부팅 프로세스의 특정 시점 이전에는 사용할 수 없습니다. 실제로 콘솔이 초기화되지 않은 경우 출력은 어디로 가야합니까?부팅 프로세스 초기에 문제를 디버깅하지 않는 한 (예 :
setup_arch()
아키텍처 별 초기화를 수행하는 경우)에는 일반적으로 문제가되지 않습니다 . 이러한 디버깅은 시작하기 어려운 과제이며, 어떤 종류의 인쇄 방법이 없으면 문제를 복잡하게 만듭니다.희망은 있지만 많이는 아닙니다. 하드 코어 아키텍처 해커는 외부 포트와 통신하기 위해 작동하는 하드웨어 (예 : 직렬 포트)를 사용합니다. 대부분의 사람들에게는 이것이 재미없는 일이라고 믿어주세요. 지원되는 일부 아키텍처는 제정신 솔루션을 구현하지만 다른 아키텍처 (i386 포함)에는 하루를 절약 할 수있는 패치가 있습니다.
이 솔루션은
printk()
부팅 프로세스 초기에 콘솔에 출력 할 수 있는 변형입니다early_printk()
. 동작은와 동일하며printk()
이름과 이전 작업 기능 만 변경됩니다. 그러나 지원되는 모든 아키텍처에 이러한 방법이 구현되어있는 것은 아니기 때문에 휴대용 솔루션이 아닙니다. 하지만 가장 친한 친구가 될 수 있습니다.부팅 프로세스 초기에 콘솔에 쓸 필요가 없다면
printk()
항상 작동 할 수 있습니다 .