Câu trả lời:
Tài liệu tham khảo này dường như có câu trả lời cho các câu hỏi của bạn, có tiêu đề: Linux Kernel Development Second Edition .
đoạn trích
in ()
Hàm in kernel
printk()
, hoạt động gần như giống hệt vớiprintf()
chức năng thư viện C. Thật vậy, trong suốt cuốn sách này, chúng tôi đã không sử dụng bất kỳ sự khác biệt thực sự. Đối với hầu hết các ý định, điều này là tốt;printk()
chỉ đơn giản là tên của chức năng in được định dạng của kernel. Nó có một số khác biệt, tuy nhiên.Sự mạnh mẽ của printk ()
Một trong những tài sản
printk()
nhanh chóng được cho là mạnh mẽ của nó. Cácprintk()
chức năng là callable từ chỉ là về bất cứ nơi nào trong hạt nhân bất cứ lúc nào. Nó có thể được gọi từ bối cảnh gián đoạn hoặc quá trình. Nó có thể được gọi trong khi một khóa được tổ chức. Nó có thể được gọi đồng thời trên nhiều bộ xử lý, nhưng nó không yêu cầu người gọi phải giữ khóa.Đó là một chức năng phục hồi. Điều này rất quan trọng vì tính hữu ích của
printk()
phần còn lại trên thực tế là nó luôn ở đó và luôn hoạt động.Tính không di động của printk ()
Một vết nứt trong bộ giáp
printk()
mạnh mẽ của sự tồn tại. Không thể sử dụng trước một điểm nhất định trong quy trình khởi động kernel, trước khi khởi tạo bàn điều khiển. Thật vậy, nếu giao diện điều khiển không được khởi tạo, thì đầu ra phải đi đâu?Điều này thường không phải là một vấn đề, trừ khi bạn đang gỡ lỗi các vấn đề rất sớm trong quá trình khởi động (ví dụ, trong
setup_arch()
đó, thực hiện khởi tạo đặc thù kiến trúc). Việc gỡ lỗi như vậy là một thách thức để bắt đầu và việc không có bất kỳ loại phương pháp in nào chỉ gây ra vấn đề.Có một số hy vọng, nhưng không nhiều. Tin tặc kiến trúc Hardcore sử dụng phần cứng hoạt động (giả sử, một cổng nối tiếp) để liên lạc với thế giới bên ngoài. Tin tôi đi, đây không phải là niềm vui đối với hầu hết mọi người. Một số kiến trúc được hỗ trợ thực hiện một giải pháp lành mạnh, tuy nhiên và các kiến trúc khác (bao gồm cả i386) có sẵn các bản vá cũng giúp tiết kiệm trong ngày.
Giải pháp là một
printk()
biến thể có thể xuất ra giao diện điều khiển từ rất sớm trong quá trình khởi động :early_printk()
. Hành vi giống nhưprintk()
, chỉ có tên và khả năng hoạt động trước đó được thay đổi. Tuy nhiên, đây không phải là một giải pháp di động, vì không phải tất cả các kiến trúc được hỗ trợ đều thực hiện phương pháp như vậy. Nó có thể trở thành người bạn tốt nhất của bạn, mặc dù, nếu có.Trừ khi bạn cần ghi vào bảng điều khiển từ rất sớm trong quá trình khởi động, bạn có thể dựa vào
printk()
để luôn hoạt động.
PrintK hoạt động như thế nào khi HĐH vẫn khởi động?
printk()
đi đến bàn điều khiển nếu có thể và mức độ ưu tiên đủ cao; Tôi không chắc chắn vào thời điểm nào kernel khởi tạo VT để làm cho điều đó khả thi nhưng rõ ràng là khá sớm.
[src]/kernel/printk/printk.c
là tài liệu khá tốt. Truy cập bảng điều khiển dường như được kiểm soát thông qua semaphores. Tin nhắn cũng được đưa vào /dev/dmsg
, bất kể ưu tiên.