Optimierung von Darwin-Kernel-Extensions für die Core 2 Quad-Ära – Sinnlos oder lehrreich?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Optimierung von Darwin-Kernel-Extensions für die Core 2 Quad-Ära – Sinnlos oder lehrreich?

    Hallo zusammen,
    ich habe mich in letzter Zeit wieder ein bisschen in die Welt der Legacy-Hardware vertieft. Wahrscheinlich geht es einigen von euch ähnlich: Man findet im Keller oder in der Werkstatt ein altes Schätzchen und fragt sich, was man damit softwareseitig heute noch anstellen kann. In meinem Fall ist es ein altes System mit einem Core 2 Quad Q9550 auf einem soliden LGA775-Board. Damals war das Ding ein absolutes Biest, und ich erinnere mich noch genau daran, wie ich die ersten 1080p-Videos damit geschnitten habe, während andere noch mit ihren Dual-Cores kämpften.
    Mein aktuelles Projekt ist es, eine schlanke Darwin-Umgebung (vielleicht auf Basis von OpenDarwin oder älteren macOS-Kernel-Sourcen) auf dieser Architektur zum Laufen zu bringen, die über das bloße "Booten" hinausgeht. Ich versuche gerade, ein paar spezifische Kernel-Extensions (Kexts) zu schreiben bzw. zu portieren, um die Hardware-Sensoren und das Power-Management unter einer neueren Darwin-Version besser anzusprechen.
    Dabei bin ich auf einen sehr spezifischen Punkt gestoßen, der mich etwas fuchst: Die Handhabung von Thread-Affinität und dem Cache-Layout beim Core 2 Quad . Wie ihr wisst, besteht ein Core 2 Quad technisch gesehen aus zwei zusammengeklebten Dual-Core-Dies. Das bedeutet, dass der Datenaustausch zwischen Core 0 und Core 1 blitzschnell über den gemeinsamen L2-Cache läuft, während die Kommunikation mit Core 2 oder 3 über den Front Side Bus (FSB) gehen muss.
    In den offiziellen Apple-Kernel-Sourcen für x86_64 scheint vieles auf die spätere i-Serie (Nehalem und neuer) optimiert zu sein, wo der integrierte Speicher-Controller alles verändert hat. Wenn ich versuche, rechenintensive Tasks unter Darwin auf diesem Q9550 zu verteilen, merke ich, dass der Scheduler oft nicht effizient unterscheidet, welche Kerne sich einen Cache teilen. Das führt zu massiven Latenzen, sobald Daten über den FSB geschubst werden müssen.
    Ich habe versucht, über thread_policy_set ein bisschen manuelle Kontrolle zu gewinnen, aber unter Darwin 15+ scheint das System meine Wünsche oft zu ignorieren oder mit Kernel-Panics zu reagieren, wenn ich zu tief in die Topologie-Einstellungen eingreife. Es ist faszinierend und frustrierend zugleich, wie sehr die Architektur des Prozessors hier die Software-Entwicklung limitiert.
    Hat von euch zufällig noch jemand Erfahrung mit der Kernel-Programmierung für diese spezifische "Multi-Chip-Modul"-Architektur unter macOS oder Darwin? Gibt es vielleicht versteckte Boot-Argumente oder undocumented APIs, mit denen man dem Scheduler beibringen kann, die Cache-Struktur des Core 2 Quad besser zu respektieren?
    Oder ist es eurer Meinung nach heute reine Zeitverschwendung, sich mit der Optimierung für CPUs ohne SSE4.2 oder AVX unter modernen Darwin-Zweigen zu beschäftigen? Ich finde es persönlich eine tolle Übung, um Low-Level-Architekturen besser zu verstehen, aber vielleicht sehe ich den Wald vor lauter Bäumen nicht mehr.
    Ich freue mich auf eure Gedanken und vielleicht den einen oder anderen Tipp aus der "Oldschool"-Ecke!
    Beste Grüße!
  • Willkommen im Forum!
    Die Frage "Sinnlos oder lehrreich?" ist leider nicht beantwortbar und vor allem nicht pauschal sondern nur individuell. Genau genommen hast Du gefragt: "was ist der Sinn des Lebens?" und die Antwort ist bekanntlich "42".
    Aber wenn Du damit zum Projekt "OpenCore Legacy Patcher" beitragen willst, dann wäre das m.E. (also meine individuelle Bewertung) durchaus sinnvoll und lehrreich...
    Vor allem bräuchte das OCLP-Projekt eine gute Lösung, dass der fork() unter macOS 15 wieder ordentlich schnell läuft - bei mir laufen Shell-Scripts um den Faktor 10-15 langsamer als mit macOS 14 oder ohne Root-Patches. Anscheinend werden in jede Shell und jeden Prozess ein paar eigentlich unnötige Libraries für WLAN injiziert und das bremst stark.
    Inhaltlich kann ich leider nichts beitragen, denn ich habe auf macOS/Darwin/Mach nie so low-level programmiert. Der Mac ist für mich einfach ein langlebiges Arbeitswerkzeug für andere Projekte. Auch um embedded Linux-Kernels zu compilieren - da gibts zwar immer wieder ähnliche Probleme mit Cache und Multiprocessing aber völlig andere Lösungsansätze, so dass die nicht weiterhelfen. Und gerade mit Linux für Intel kenne ich mich am wenigsten aus.
    Hoffentlich kann Dir jemand anderes weiterhelfen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hns ()

  • Ich bin schwer beeindruckt. Ich habe mich immer gerne für Kernel-Dinge interessiert und auch ein paar relevante Bücher dazu, aber die sind auch nur erklärend, was im Kernel abgeht, aber nicht, wie man darin rumspielt, oder gar einen Darwin-Kernel selbst baut und benutzt.

    Ich nehme an, Du kannst in eine Terminal-Umgebung booten?

    Und während ich deine Frage und Problematik verstehe, weiß ich leider gar nichts Konkretes. Ich vermute, da wirst du hier nicht viel Hilfe finden.

    Oder die analysierst den Scheduler-Code, um zu sehen, ob der überhaupt diese CPU "versteht".

    Am Ende ist das auch nur leeres Wissen, was du damit erfährst. Aber ebenso leer ist es, Serien im TV zu schauen oder 1st-Person-Shooter zu spielen. Wobei man bei dieser Aktion wohl tatsächlich noch was lernt, wenn es auch fast niemand mehr braucht :)

    Schreibe auf jeden Fall einen Blog oder sowas, damit evtl. andere Leute das finden, wenn sie auch dran arbeiten, und mir dir Kontakt aufnehmen können. Dann kommt evtl. tatsächlich noch was Fruchtbares dabei raus.

    Viel Erfolg!
    Apps: apps.tempel.org (Find Any File, iBored, iClip, Prefs Editor)
    Blog: http://blog.tempel.org
    Über mich: tempel.org/AboutThomasTempelmann