เคอร์เนลทั้งหมดถูกโหลดเข้าสู่หน่วยความจำขณะบูตหรือไม่


14

ฉันอ่านIBM doc ที่เป็นที่นิยม (ฉันเห็นว่ามีการอ้างอิงค่อนข้างบ่อยบนเว็บ) อธิบายการทำงานของดิสก์ RAM เริ่มต้น

ฉันตีกำแพงในการกำหนดแนวคิดว่ามันทำงานอย่างไร

ในเอกสารมันบอกว่า

ตัวโหลดบูตเช่น GRUB ระบุเคอร์เนลที่จะโหลดและคัดลอกอิมเมจเคอร์เนลนี้และ initrd ที่เกี่ยวข้องใด ๆ ลงในหน่วยความจำ

ฉันสับสนแล้ว: มันคัดลอกเคอร์เนลทั้งหมดไปยังหน่วยความจำหรือเพียงแค่ส่วนหนึ่งของมันได้หรือไม่ หากเคอร์เนลทั้งหมดอยู่ในหน่วยความจำแล้วทำไมเราถึงต้องใช้ RAM ดิสก์เริ่มต้นด้วยซ้ำ

ฉันคิดว่าจุดประสงค์ของการเริ่มต้นเพื่อให้สามารถมีเคอร์เนลอิมเมจขนาดเล็กทั่วไปและ initrd จะติดตั้งโมดูลที่ถูกต้องก่อนที่จะโหลดอิมเมจเคอร์เนล แต่ถ้าเคอร์เนลทั้งหมดอยู่ในหน่วยความจำแล้วทำไมเราถึงต้องเริ่มต้น?

นั่นยังทำให้เกิดสิ่งอื่นที่ทำให้ฉันสับสน - โมดูลที่โหลดลงในเคอร์เนลตั้งอยู่ที่ไหน โมดูลเคอร์เนลทั้งหมดถูกเก็บไว้ภายใน initrd หรือไม่?


ใช่. เคอร์เนลทั้งหมด และรูทแรกของมัน แต่เมล็ดลินุกซ์ยังไม่ได้ใช้ initrd ในหลายปี
mikeserv

ใช่ฉันอ่านแล้ว ถูกแทนที่ด้วย initramfs ส่วนใหญ่ใช่มั้ย และยังคงเป็นกระบวนการที่คล้ายกันกับ initramfs ที่ถูกต้อง?
user1028270

1
มันถูกแทนที่อย่างสมบูรณ์สำหรับเมล็ดทั้งหมดตั้งแต่ซีรีย์ 2.6 แต่กระบวนการค่อนข้างคล้ายกันยกเว้นว่า initramfs จะไม่ถูกถอดออก - มันจะอยู่ที่นั่นเสมอและมันก็จะรูทเสมอ คุณต้องติดตั้งอุปกรณ์พัฒนารูทของคุณจริง ๆ นอกจากนี้ยังมีประโยชน์ที่ไม่จำเป็นต้องจำลองอุปกรณ์แยกบล็อกและคล้ายกัน
mikeserv

เยี่ยมยอดฉันจะอ่านบทความที่คุณเชื่อมโยงไปถึง ดังนั้นโมดูลเคอร์เนลจึงถูกเก็บไว้ใน initramfs rootfs?
user1028270

1
@edwardtorvalds - นั่นคือทั้งหมดที่จัดการโดยudevปกติและใช่โดยอัตโนมัติ
mikeserv

คำตอบ:


17

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

initramfsบทบาทคือการให้การทำงานที่จำเป็นในการติด filesystems 'ของจริง' และดำเนินการต่อบูตระบบ ที่เกี่ยวข้องกับโมดูลเคอร์เนลและไบนารีต่าง ๆ : คุณต้องการอย่างน้อยudevบางทีเครือข่ายบางส่วนและkmodโหลดโมดูล

โมดูลสามารถโหลดลงในเคอร์เนลได้ในภายหลังหลังจากเพิ่งบู๊ตดังนั้นจึงไม่มีการเตรียมเคอร์เนลเป็นinitramfsพิเศษ พวกเขาสามารถเก็บไว้ที่ใดก็ได้ที่: initramfs, /lib/modulesบนระบบแฟ้มจริงในต้นไม้พัฒนาหากคุณกำลังพัฒนาโมดูล ... ความinitramfsเพียงความต้องการที่จะมีโมดูลที่จำเป็นในการติดตั้งระบบแฟ้มราก (ซึ่งมีส่วนที่เหลือ)


ตกลงที่เหมาะสมกับฉัน ฉันคิดว่าฉันกำลังสับสนเคอร์เนลอิมเมจและระบบไฟล์ที่ใช้ซึ่งแตกต่างอย่างสิ้นเชิง
user1028270

5

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


3

เคอร์เนลในการตั้งค่าลีนุกซ์รุ่นใหม่นั้นใช้โมดูลมากเช่นเคอร์เนลที่เหมาะสม (โหลดเมื่อบูตเข้าสู่ RAM) รวมถึงฟังก์ชั่นการทำงานขั้นต่ำเพียงอย่างเดียวส่วนที่เหลือทั้งหมดจะถูกรวบรวมเป็นโมดูล (โหลดได้ที่รันไทม์) เพื่อให้การทำงานนี้แม้ในกรณีที่อุปกรณ์หรือระบบไฟล์ที่จำเป็นสำหรับการบู๊ตเป็นโมดูลและinitramfsจะถูกโหลดด้วยเคอร์เนล (ตามชื่อหมายถึงนี่คือพื้นที่แรมที่มีระบบไฟล์แบบง่ายติดตั้งในการบูต) ระบบไฟล์ชั่วคราวนี้ติดตั้งอยู่/และมีโปรแกรมเริ่มต้นและโมดูลที่จำเป็น เมื่อการเริ่มต้นinitramfsเสร็จแล้วลีนุกซ์จะดำเนินการ a pivot_root(8), mouning ของจริง/และการพลิกinitramfsเนื้อหา

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


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