จะเกิดอะไรขึ้นในกระบวนการเริ่มต้นระบบปฏิบัติการ 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 service mach_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