printk ทำงานอย่างไรภายในอย่างแน่นอน?


10

ฉันรู้ว่าprintfต้องการความช่วยเหลือจากระบบปฏิบัติการเพื่อทำงานของมัน

ฉันรู้ว่าprintfไม่ทำงานในซอร์สโค้ด Linux เนื่องจากไม่มีไลบรารี่ และเรามีprintkการดีบัก

วิธีการที่ไม่printkทำงานเมื่อระบบปฏิบัติการยังคงบูตแล้ว?

คำตอบ:


11

อ้างอิงนี้ดูเหมือนว่าจะมีคำตอบสำหรับคำถามของคุณหัวข้อ: Linux Kernel พัฒนา Second Edition

สิ่งที่สกัดมา

printk ()

ฟังก์ชั่นการพิมพ์เคอร์เนลprintk()ทำงานเกือบเหมือนกับprintf()ฟังก์ชั่นไลบรารี C แน่นอนในหนังสือเล่มนี้เราไม่ได้ใช้ประโยชน์จากความแตกต่างที่แท้จริง สำหรับความตั้งใจส่วนใหญ่นี่เป็นเรื่องปกติ printk()เป็นเพียงชื่อของฟังก์ชั่นการพิมพ์ที่จัดรูปแบบของเคอร์เนล มันมีความแตกต่างกันบ้าง

ความทนทานของ printk ()

หนึ่งในคุณสมบัติของการprintk()ได้อย่างรวดเร็วเพื่อรับเป็นความแข็งแกร่ง printk()ฟังก์ชั่น callable จากเพียงเกี่ยวกับทุกที่ใน kernel ในเวลาใดก็ได้ มันสามารถถูกเรียกจากการขัดจังหวะหรือบริบทกระบวนการ มันสามารถเรียกได้ในขณะที่ล็อคจะถูกจัดขึ้น มันสามารถเรียกได้พร้อมกันในโปรเซสเซอร์หลายตัว แต่มันไม่จำเป็นต้องมีผู้โทรเพื่อล็อค

มันเป็นฟังก์ชั่นที่ยืดหยุ่น สิ่งนี้สำคัญเนื่องจากประโยชน์ของการprintk()วางตัวบนความจริงที่ว่ามันอยู่ที่นั่นเสมอและใช้ได้เสมอ

ความไม่ทนทานของ printk ()

มีร่องเล็ก ๆ ในเกราะของprintk()ความทนทานอยู่ มันไม่สามารถใช้งานได้ก่อนที่จะถึงจุดหนึ่งในกระบวนการบูตเคอร์เนลก่อนการกำหนดค่าเริ่มต้นของคอนโซล แน่นอนถ้าคอนโซลไม่ได้เริ่มต้นผลลัพธ์ที่ควรจะไปที่ไหน

โดยปกติจะไม่เป็นปัญหาเว้นแต่ว่าคุณกำลังแก้ไขข้อบกพร่องในช่วงต้นของกระบวนการบู๊ต (ตัวอย่างเช่นในsetup_arch()ซึ่งดำเนินการเริ่มต้นเฉพาะสถาปัตยกรรม) การแก้จุดบกพร่องดังกล่าวเป็นความท้าทายที่จะเริ่มต้นด้วยและการขาดวิธีการพิมพ์ใด ๆ จะช่วยแก้ไขปัญหาได้

มีความหวังอยู่บ้าง แต่ก็ไม่มากนัก แฮกเกอร์สถาปัตยกรรมไม่ยอมใครง่ายๆใช้ฮาร์ดแวร์ที่ทำงาน (พูดพอร์ตอนุกรม) เพื่อสื่อสารกับโลกภายนอก เชื่อใจฉันนี่ไม่ใช่เรื่องสนุกสำหรับคนส่วนใหญ่ สถาปัตยกรรมที่สนับสนุนบางตัวใช้โซลูชันที่มีเหตุผลอย่างไรก็ตามและอื่น ๆ (รวมถึง i386) มีแพตช์พร้อมใช้งานที่ช่วยประหยัดทั้งวัน

การแก้ปัญหาเป็นตัวแปรที่ส่งออกสามารถไปยังคอนโซลมากในช่วงต้นขั้นตอนการบู๊ต:printk() early_printk()ลักษณะการทำงานเหมือนกับprintk()ชื่อและความสามารถในการทำงานก่อนหน้านี้เท่านั้นที่มีการเปลี่ยนแปลง นี่ไม่ใช่โซลูชันแบบพกพาอย่างไรก็ตามเนื่องจากไม่ใช่สถาปัตยกรรมที่รองรับทั้งหมดมีวิธีการดังกล่าว มันอาจกลายเป็นเพื่อนที่ดีที่สุดของคุณ แต่ถ้ามันเป็น

หากคุณไม่จำเป็นต้องเขียนไปยังคอนโซล แต่เนิ่นๆในขั้นตอนการบู๊ตคุณสามารถพึ่งพาได้printk()ตลอดเวลา


4

printK ทำงานอย่างไรเมื่อระบบปฏิบัติการยังคงบูทอยู่?

printk()ไปที่คอนโซลหากเป็นไปได้และมีระดับความสำคัญสูงพอ ฉันไม่แน่ใจว่าเคอร์เนลเริ่มต้นที่ VT เพื่อให้เป็นไปได้ แต่มันค่อนข้างเร็ว

[src]/kernel/printk/printk.cเป็นเอกสารที่ค่อนข้างดี การเข้าถึงคอนโซลดูเหมือนจะควบคุมผ่านเซมาฟอร์ ข้อความจะถูกส่งเข้ามา/dev/dmsgโดยไม่คำนึงถึงลำดับความสำคัญ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.