ฉันรู้ว่าprintf
ต้องการความช่วยเหลือจากระบบปฏิบัติการเพื่อทำงานของมัน
ฉันรู้ว่าprintf
ไม่ทำงานในซอร์สโค้ด Linux เนื่องจากไม่มีไลบรารี่ และเรามีprintk
การดีบัก
วิธีการที่ไม่printk
ทำงานเมื่อระบบปฏิบัติการยังคงบูตแล้ว?
ฉันรู้ว่าprintf
ต้องการความช่วยเหลือจากระบบปฏิบัติการเพื่อทำงานของมัน
ฉันรู้ว่าprintf
ไม่ทำงานในซอร์สโค้ด Linux เนื่องจากไม่มีไลบรารี่ และเรามีprintk
การดีบัก
วิธีการที่ไม่printk
ทำงานเมื่อระบบปฏิบัติการยังคงบูตแล้ว?
คำตอบ:
อ้างอิงนี้ดูเหมือนว่าจะมีคำตอบสำหรับคำถามของคุณหัวข้อ: 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()
ตลอดเวลา
printK ทำงานอย่างไรเมื่อระบบปฏิบัติการยังคงบูทอยู่?
printk()
ไปที่คอนโซลหากเป็นไปได้และมีระดับความสำคัญสูงพอ ฉันไม่แน่ใจว่าเคอร์เนลเริ่มต้นที่ VT เพื่อให้เป็นไปได้ แต่มันค่อนข้างเร็ว
[src]/kernel/printk/printk.c
เป็นเอกสารที่ค่อนข้างดี การเข้าถึงคอนโซลดูเหมือนจะควบคุมผ่านเซมาฟอร์ ข้อความจะถูกส่งเข้ามา/dev/dmsg
โดยไม่คำนึงถึงลำดับความสำคัญ