จะเกิดอะไรขึ้นในกระบวนการเริ่มต้นระบบปฏิบัติการ Mac OS X?
ไปนานแล้วนับเป็นวันของ OS 9 การดูเครื่องแม็คของเราจะบูตด้วยชุดของส่วนขยายและแผงควบคุมที่เราสามารถระบุได้เสมอ วันนี้มีรากฐานยูนิกซ์ของ OS X ผู้ใช้จำนวนมากไม่ทราบสิ่งที่เกิดขึ้นอยู่เบื้องหลัง ดังนั้นสิ่งที่เกิดขึ้นในระหว่างขั้นตอนการบูต Mac OS X? ส่วนที่ KernelThread จะแสดงรายการลำดับเหตุการณ์ตั้งแต่ต้นจนจบ มันค่อนข้างละเอียดและคุ้มค่ากับการอ่าน ทำซ้ำด้านล่างสำหรับผู้ใช้ Mac OS X ที่อยากรู้อยากเห็นออกไป
หมายเหตุ: ในฐานะผู้อ่านชี้ให้เห็นว่า PPC ใช้ OF, i386 ใช้ EFI
คุณเปิดเครื่อง Mac ของคุณและนี่คือสิ่งที่เกิดขึ้น:
- กำลังเปิดอยู่
- OF หรือ EFI ถูกดำเนินการ
- มีการรวบรวมข้อมูลฮาร์ดแวร์และเริ่มต้นใช้งานฮาร์ดแวร์แล้ว
- ระบบจะเลือกบางอย่าง (โดยปกติจะเป็นระบบปฏิบัติการ แต่ยังรวมไปถึง Apple Hardware Test เป็นต้น) ผู้ใช้อาจได้รับพร้อมท์ให้เลือกสิ่งที่จะบูต
- การควบคุมผ่านไปยัง
/System/Library/CoreServices/BootX
, บูตโหลด BootX จะโหลดเคอร์เนลและจะดึงป้าย OS หากมี - BootX พยายามโหลดรายการแคชก่อนหน้าของไดรเวอร์อุปกรณ์ (สร้าง / อัพเดตโดย
/usr/sbin/kextcache
) แคชดังกล่าวเป็นประเภทmkext
และมีข้อมูลพจนานุกรมและไฟล์ไบนารีสำหรับส่วนขยายเคอร์เนลหลาย ๆ โปรดสังเกตว่าถ้าแคช mkext เสียหายหรือสูญหาย BootX จะดูใน/System/Library/Extensions
สำหรับส่วนขยายที่จำเป็นในสถานการณ์จำลองปัจจุบัน (ตามที่กำหนดโดยค่าของคุณสมบัติOSBundleRequired
ในไฟล์Info.plist
ของกลุ่มของส่วนขยาย . - รูทีน
init
ของเคอร์เนลจะถูกประมวลผล อุปกรณ์รากของระบบบูตจะถูกกำหนด ณ จุดนี้ไม่สามารถเข้าถึงเฟิร์มแวร์ได้อีกต่อไป - โครงสร้างข้อมูล Mach / BSD ต่างๆถูกเตรียมใช้งานโดยเคอร์เนล
- ชุด I / O ถูกเริ่มต้น
- เคอร์เนลเริ่มต้น
/sbin/mach_init
,/sbin/mach_init
การตั้งชื่อบริการ (bootstrap) ของ Mach servicemach_init
รักษาแมประหว่างชื่อบริการและพอร์ต Mach ที่ให้การเข้าถึงบริการเหล่านั้น
จากที่นี่การเริ่มต้นใช้งานจะกลายเป็นระดับผู้ใช้:
mach_init
เริ่มต้น/sbin/init
init กระบวนการ BSD init แบบดั้งเดิม init จะกำหนด runlevel และรัน/etc/rc.boot
ซึ่งจะตั้งค่าเครื่องให้เพียงพอสำหรับการเรียกใช้ single-user
rc.boot
และสคริปต์ rc
อื่น ๆ ที่มา /etc/rc.common
สคริปต์เชลล์ที่มีฟังก์ชันอรรถประโยชน์เช่น CheckForNetwork()
(ตรวจสอบว่าเครือข่ายอยู่ที่ใด), GetPID()
, purgedir()
(ลบ เนื้อหาไดเรกทอรีเท่านั้นไม่ใช่โครงสร้าง) ฯลฯ
rc.boot
ระบุประเภทของการบู๊ต (Multi-User, Safe, CD-ROM, Network ฯลฯ ) ในกรณีที่มีการบูตระบบเครือข่าย (ตัวแปรkern.netboot
ของsysctl
จะถูกตั้งค่าเป็น1
ในกรณีนี้) จะรัน/etc/rc.netboot
ด้วยอาร์กิวเมนต์start
/etc/rc.netboot
จัดการด้านต่างๆของการบูตระบบเครือข่าย ตัวอย่างเช่นจะดำเนินการเครือข่ายและ (ถ้ามี) mounts ท้องถิ่น นอกจากนี้ยังเรียกใช้ /usr/bin/nbst
เพื่อเชื่อมโยงไฟล์เงากับภาพดิสก์ที่ใช้เป็นอุปกรณ์หลัก ความคิดคือการเปลี่ยนเส้นทางการเขียนไปยังไฟล์เงาซึ่งหวังว่าจะอยู่ในพื้นที่จัดเก็บข้อมูลในเครื่อง
rc.boot
ว่าจำเป็นต้องตรวจสอบความสอดคล้องของระบบไฟล์หรือไม่ รองเท้าบู๊ตเครื่องเดียวและ CD-ROM ไม่ทำงาน fsck SafeBoot จะเรียกใช้ fsck เสมอrc.boot
จัดการสถานะการส่งกลับของ fsck ด้วย- ถ้า
rc.boot
ออกจากระบบสำเร็จ/etc/rc
จะมีการเรียกใช้สคริปต์เริ่มต้นของผู้ใช้หลายคน หากการบูตจากซีดีรอมสคริปต์จะเปลี่ยนไปใช้/etc/rc.cdrom
(การติดตั้ง) /etc/rc
ติดตั้งระบบไฟล์ในเครื่อง (HFS +, HFS, UFS,/dev/fd
,/.vol
) เพื่อให้แน่ใจว่าไดเร็กทอรี/private/var/tmp
มีอยู่และรัน/etc/rc.installer_cleanup
ถ้ามีอยู่ ที่เหลือโดยโปรแกรมติดตั้งก่อนรีบูตเครื่องใหม่)/etc/rc.cleanup
กำลังทำงานอยู่ มัน "ทำความสะอาด" จำนวน Unix และ Mac เฉพาะไดเรกทอรี / ไฟล์- BootCache เริ่มทำงานแล้ว
- มีการตั้งค่าตัวแปร
sysctl
ต่างๆ (เช่นจำนวนสูงสุดของ vnodes, System V IPC เป็นต้น) ถ้ามีไฟล์/etc/sysctl.conf
(บวก/etc/sysctl-macosxserver.conf
บน Mac OS X Server) จะมีการตั้งค่าตัวแปร read และsysctl
ไว้ - เริ่มต้น
syslogd
- ไฟล์สัญลักษณ์ Mach ถูกสร้างขึ้น
/etc/rc
เริ่มkextd
กระบวนการภูตที่โหลดส่วนขยายเคอร์เนลตามความต้องการจากกระบวนการเคอร์เนลหรือไคลเอ็นต์/usr/libexec/register_mach_bootstrap_servers
รันโหลดเซอร์วิสต่างๆของ Mach bootstrap ที่อยู่ใน/etc/mach_init.d
portmap
และnetinfo
จะเริ่มทำงาน- ถ้า
/System/Library/Extensions.mkext
เก่ากว่า/System/Library/Extensions
,/etc/rc
จะลบไฟล์ mkext ที่มีอยู่และสร้างใหม่ นอกจากนี้ยังสร้างหนึ่งหากไม่มีอยู่ /etc/rc
เริ่ม/usr/sbin/update
ภูตที่จะล้างข้อมูลระบบไฟล์ภายในลงในดิสก์บ่อยๆ/etc/rc
เริ่มระบบหน่วยความจำเสมือน/private/var/vm
ถูกตั้งค่าเป็นไดเรกทอรี swap/sbin/dynamic_pager
เริ่มต้นด้วยอาร์กิวเมนต์ที่เหมาะสม (เทมเพลตเส้นทางชื่อไฟล์ swap ขนาดไฟล์ swap ที่สร้างขึ้นการแจ้งเตือนน้ำสูงและต่ำเรียกใช้ระบุเวลาในการสร้างไฟล์ swap เพิ่มเติมหรือลบไฟล์ที่มีอยู่)/etc/rc
เริ่ม/usr/libexec/fix_prebinding
เพื่อแก้ไขไบนารีที่มีการบีบอัดไม่ถูกต้อง/etc/rc
รัน/etc/rc.cleanup
เพื่อล้างข้อมูลและรีเซ็ตไฟล์และอุปกรณ์/etc/rc
จะเปิดตัว/sbin/SystemStarter
เพื่อจัดการรายการเริ่มต้นจากตำแหน่งต่างๆเช่น/System/Library/StartupItems
และ/Library/StartupItems
StartupItem เป็นโปรแกรมซึ่งโดยปกติจะเป็นเชลล์สคริปต์ซึ่งมีชื่อตรงกับชื่อโฟลเดอร์ โฟลเดอร์ประกอบด้วยแฟ้มรายการคุณสมบัติที่ประกอบด้วยคู่คีย์ - ค่าเช่นDescription
Provides
Requires
OrderPreference
เริ่มต้น / หยุดข้อความ ฯลฯ คุณสามารถเรียกใช้SystemStarter -n -D
เป็น root เพื่อให้โปรแกรมดีบักการพิมพ์และข้อมูลพึ่งพา ทำงานอะไร)- รายการเริ่มต้น
CoreGraphics
เริ่มต้น Apple daemon บริการชนิด (ATSServer
) รวมทั้ง Window Server (WindowServer
)
ที่มา: KernelThread