# Khởi đầu với ACPI
# Giải thích nhanh về ACPI (Giao diện nguồn và cấu hình nâng cao)
Vậy DSDTs và SSDTs là cái gì dzạ? À, thiệt ra đây là một trong những thành phần cấu tạo nên ACPI. Cụ thể hơn đây các bảng mô tả phần cứng tích hợp sẵn trong firmware (vi chương trình cơ sở) của bạn. Tụi nó có nhiệm vụ liệt kê các thiết bị phần cứng như bộ điều khiển USB (USB controllers), các luồng xử lý của CPU (CPU threads), bộ điều khiển nhúng (embedded controllers), đồng hồ hệ thống (system clocks) và vân vân mây mây để cung cấp cho hệ điều hành biết.
Bạn cứ tưởng tượng DSDT (Bảng mô tả hệ thống chính) giống như "phần thân" chứa hầu hết thông tin quan trọng, còn các mảnh thông tin nhỏ lẻ khác sẽ được gửi đi bởi SSDT (Bảng mô tả hệ thống phụ).
Nói cho dễ hiểu: DSDT là bản thiết kế xây dựng của cả tòa nhà, còn các SSDT là những tờ giấy ghi chú dán thêm để bổ sung chi tiết cho công trình đó. Hệ điều hành sẽ căn cứ vào đó để biết các nút bấm và vị trí phần cứng mà vận hành tòa nhà, driver sẽ là những người vận hành. HĐH sẽ không thể điều hành được tòa nhà nếu nó còn không biết nút bấm này để đây làm gì, mở rồi tắt có chức năng gì? DSDT và SSDT sẽ lo chuyện đó.
Bạn có thể đọc thêm về ACPI và thông số kỹ thuật của nó tại đây ACPI 6.4 Manual (opens new window)
Tại sao chúng ta phải quan tâm đến mấy cái bảng này?
DSDT và SSDT là một trong nhiều phương pháp rất hiệu quả mà Apple thích sử dụng để ngăn chặn bạn cài macOS lên máy PC. Cũng chính vì lẽ đó khiến cho macOS nổi tiếng là "đứa kén chọn" (picky) đối với các thiết bị xuất hiện trong DSDT (Bảng mô tả hệ thống chính); nó chỉ hiểu quy ước thiết bị do Apple tùy chỉnh riêng cho máy Mac; khác với Windows sử dụng quy ước mặc định của liên minh UEFI, vì vậy nhiệm vụ của chúng ta là phải "chỉnh đốn" lại 2 cái bảng này để macOS chịu giao tiếp. Nói một cách dễ hiểu hơn là chỉnh sửa 2 cái bảng này sao cho nó giống với máy Mac thiệt cùng đời thì càng tốt. Dưới đây là các thiết bị chính cần được sửa để macOS có thể hoạt động trơn tru do sự khác biệt về quy ước giữa máy Mac và PC:
- Embedded controllers (Bảng SSDT cho bộ điều khiển nhúng - EC)
- Tất cả các máy chạy Intel đời tương đối mới đều có EC (thường được lập trình trong bảng định nghĩa là H_EC, ECDV, EC0, v.v mây mây...) lộ diện trong DSDT của tụi nó, nhiều máy AMD cũng "khoe" nó ra luôn. Mấy cái bộ điều khiển này được lập trình theo cách mà macOS không hiểu và do đó dễ gây ra hiện tượng panic (lỗi sập hệ thống), vì vậy ta cần phải "giấu" khỏi tầm mắt của macOS. Tuy nhiên, riêng thằng macOS Catalina đòi hỏi phải có một thiết bị tên là
ECtrong bảng ACPI thì mới chịu chạy, nên chúng ta sẽ tạo ra một cái EC giả (dummy EC) viết theo dạng Apple viết để đánh lừa nó. - Riêng với laptop, bộ điều khiển nhúng thực tế vẫn cần phải được kích hoạt để duy trì tính năng báo dung lượng pin và các phím nóng (hotkeys) trên bàn phím vì nó quản lý. Nếu chọn cách đổi tên EC theo dạng Mac sử dụng đôi khi sẽ gây ra lỗi vặt trên Windows, nên phương án tối ưu là tạo một EC giả để cho macOS biết có EC để làm giấy thông hành; thay vì tắt luôn bộ điều khiển nhúng thật (sẽ sử dụng kext bổ trợ sau).
- Tất cả các máy chạy Intel đời tương đối mới đều có EC (thường được lập trình trong bảng định nghĩa là H_EC, ECDV, EC0, v.v mây mây...) lộ diện trong DSDT của tụi nó, nhiều máy AMD cũng "khoe" nó ra luôn. Mấy cái bộ điều khiển này được lập trình theo cách mà macOS không hiểu và do đó dễ gây ra hiện tượng panic (lỗi sập hệ thống), vì vậy ta cần phải "giấu" khỏi tầm mắt của macOS. Tuy nhiên, riêng thằng macOS Catalina đòi hỏi phải có một thiết bị tên là
- Plugin type (Kích hoạt tính năng điều phối điện năng)
- Cái này để dễ hiểu giống như bạn cấp "thẻ hội viên" cho CPU của bạn vậy. Táo thâm áp dụng rất nhiều phương pháp bảo vệ để ngăn bạn chạy macOS ngon trên phần cứng không phải của Apple. Mặc dù bạn có thể xài con CPU cùng loại với cái trong Mac chính hãng, nhưng Apple đã khéo léo nhét trong bảng DSDT của Mac một đoạn mã lập trình được đặt tên là plugin-type ở luồng đầu tiên của CPU. Bảng ACPI của máy PC không có cái này, khi macOS quét ACPI mà không thấy thẻ hội viên này, kernel sẽ tắt XCPM. CPU của bạn sẽ chạy max công suất như điên (như cách kỹ sư của Apple chọc tức Hackintosher, đây là hậu quả của việc lấy HĐH của họ đi cài linh tinh) mà không thể điều phối nó chạy nhanh hay chậm lại khi cần thiết. Có SSDT này sẽ bổ sung cái thẻ hội viên đó để cho phép XCPM mở cửa, để máy fake cũng có thể điều phối điện năng CPU (CPU power management) một cách "chính chủ" y chang Mac thiệt trên các dòng CPU Intel Haswell và mới hơn, giúp CPU chuyển đổi giữa các mức xung nhịp (P-States) và trạng thái nghỉ (C-States) mượt mà hơn, tiết kiệm pin hơn (với laptop) và máy chạy mát hơn hẳn. SSDT này sẽ kết nối trực tiếp vào luồng (thread) đầu tiên của CPU. Lưu ý: "Món" này không dành cho AMD nhé.
- XCPM là viết tắt của XNU CPU Power Management. Trong đó, XNU là nhân (kernel) của hệ điều hành macOS. Trước đây (từ đời Ivy Bridge trở về trước), Apple sử dụng một file điều khiển rời dưới dạng kext tên là AppleIntelCPUPowerManagement.kext để quản lý CPU. Cách này giống như việc bạn mướn một "anh thợ ngoài" về để canh chừng xem lúc nào CPU cần chạy nhanh, lúc nào cần nghỉ. Nhưng kể từ đời Haswell, Apple đã "phát minh" ra XCPM. Thay vì mướn thợ ngoài (là kext), Apple đưa thẳng quyền điều khiển vào bên trong Nhân (Kernel) của hệ điều hành. XCPM lúc này đóng vai trò như một Vị Tổng quản nằm vùng ngay trong bộ não của macOS. Bạn sẽ tự hỏi: "Sao không viết cái Kext (Trình điều khiển rời)" cho nhanh?
- Kext giống như một "miếng dán đè" lên hệ thống. Mỗi lần macOS cập nhật, miếng dán này rất dễ bị bong hoặc gây xung đột làm máy bị lỗi treo (kernel panic).
- SSDT là một "tờ chỉ thị" cấp cao. Nó tác động vào máy ngay từ khi hệ điều hành còn chưa kịp khởi động xong. Xài SSDT để kích hoạt XCPM là cách "sạch" nhất, giúp máy bạn chạy như một con Mac thực thụ (Native) mà không cần can thiệp nhiều vào hệ thống. Mục tiêu là càng vanilla (nguyên bản) thì càng tốt.
- AWAC system clock (Bảng SSDT cho Đồng hồ hệ thống AWAC).
- Đây là vấn đề của các bo mạch chủ đời mới (dòng 300 series trở lên như Z370, B360...). Hiểu đơn giản là các mainboard này sử dụng một cái "đồng hồ đời mới" tên là AWAC (ACPI Wake Alarm Clock) thay cho RTC già. Khổ nỗi, macOS là một "ông già bảo thủ" kế thừa ông tổ Unix chỉ biết coi giờ bằng cái "đồng hồ Casio từ 8000 năm TCN" tên là RTC (Real Time Clock). Khi thấy AWAC thay vì cái RTC mà nó quen thuộc, macOS sẽ bị "lú" và đứng máy ngay lập tức. SSDT này có nhiệm vụ: hoặc là ép hệ thống tắt cái đồng hồ AWAC "sang chảnh" kia đi để sử dụng lại RTC, hoặc là tạo ra một cái RTC "giả" để chiều theo con mặt cười Finder khó ưa.
- NVRAM SSDT (Bảng SSDT cho bộ nhớ NVRAM)
- Các bo mạch chủ dòng 300 series "xịn" (không phải Z370) mắc chung một chứng bệnh là "đãng trí". Đa số tụi nó không khai báo chip FW dưới dạng MMIO trong ACPI, dẫn tới việc kernel của macOS ngó lơ vùng MMIO đã được khai báo bởi bản đồ bộ nhớ UEFI. SSDT này sẽ giúp mang tính năng NVRAM (Bộ nhớ bất biến) quay trở lại.
- Bạn đọc chắc chắn là không hiểu đúng hông? Dễ hiểu là như thế này: MMIO giống như một "con đường tắt" cực nhanh để CPU nói chuyện trực tiếp với phần cứng. Vì các kỹ sư "quên" ghi địa chỉ con đường này vào sơ đồ (ACPI), nên nhân hệ điều hành (Kernel) của macOS cũng ngó lơ luôn, không thèm nhìn tới vùng nhớ đó. Kết quả là NVRAM (nơi lưu những thứ như âm lượng, đĩa khởi động, lỗi hệ thống...) bị tê liệt hoàn toàn. SSDT-PMC này chính là tờ "giấy nhắc việc", khai báo lại địa chỉ MMIO để macOS có thể ghi nhớ mọi thứ như một chiếc Mac thực thụ. Vì Windows không phụ thuộc vào NVRAM nhiều như Mac nên mấy cái bệnh nền này chắc không bao giờ được chữa đâu mà chỉ có ta tự chữa ta thôi.
- Backlight SSDT (Bảng SSDT cho đèn nền)
- Xài cái này để sửa lỗi không chỉnh được độ sáng màn hình trên laptop hoặc máy tính bàn AIO. Bạn cứ tưởng tượng, macOS có một cách tăng/giảm độ sáng màn hình kiểu "quý tộc" riêng của nó. Trong khi đó, màn hình laptop, máy tính AIO sử dụng một cơ chế điều khiển khác (thường là qua thanh ghi PNLF). Nếu không có SSDT này làm "thông dịch viên" để ánh xạ (map) các lệnh của macOS vào đúng phần cứng, bạn sẽ gặp tình trạng: màn hình tối thui hoặc độ sáng lúc nào cũng đạt mức 100% gây chói mắt, không thể chỉnh được. Với máy tính bàn hoặc NUC thì bỏ qua cái này nhé.
- GPIO SSDT (Bảng SSDT giúp kích hoạt bàn rê chuột trên Laptop)
- Sử dụng để tạo một điểm tựa cho VoodooI2C kết nối vào, chỉ dành riêng cho laptop thôi nha.
- Để giải thích, đa số bàn rê chuột (Trackpad) trên laptop hiện nay xài chuẩn I2C. Để macOS có thể điều khiển được nó, nó cần một cái "móc" để treo Driver (Trình điều khiển) vào, cái móc đó gọi là GPIO (Chân cắm đầu vào/đầu ra tổng quát). SSDT này sẽ tạo ra một cái "móc giả" chuẩn chỉnh để bộ Driver VoodooI2C có chỗ mà bám vào, giúp Trackpad hoạt động mượt mà, hỗ trợ cả đa điểm (Gestures) y như Windows.
- XOSI SSDT (Bảng SSDT mô phỏng hệ điều hành, thường được sử dụng để kích hoạt bàn rê chuột)
- Xài để điều hướng các lệnh gọi OSI về SSDT này, mục đích là để "lừa" phần cứng nghĩ rằng nó đang khởi động Windows, từ đó nó mới chịu mở hết các tính năng xịn của Trackpad trên hệ điều hành macOS. Đây là một giải pháp kiểu "tà đạo" (hacky) và rất nổi tiếng hay làm cho Windows không khởi động được, tại sao? Vì nó thay đổi cách hệ thống phản hồi với mọi hệ điều hành. Khi bạn quay về khởi động Windows thật, Windows sẽ thấy những phản hồi lạ lẫm và có thể bị xung đột, tốt nhất bạn nên xài SSDT-GPIO thay thế. Cách sử dụng SSDT-XOSI sẽ không được đề cập trong hướng dẫn này.
- SSDT IRQ (Bảng SSDT để sửa xung đột IRQ) và bản vá ACPI khác
- Cần thiết để sửa các xung đột IRQ (Yêu cầu ngắt) bên trong DSDT, thường thì laptop mới cần xài. Hàng này là "đồ chơi" độc quyền khi bạn dùng công cụ SSDTTime.
- Lưu ý là các hệ thống Skylake và đời mới hơn đã rất thông minh trong việc sắp xếp thiết bị nên hiếm khi bị xung đột IRQ (Yêu cầu ngắt), vấn đề này gặp phổ biến trên Broadwell trở về trước.
- Giải thích nôm na: IRQ giống như số thứ tự để phần cứng xếp hàng chờ CPU giải quyết công việc. Ở một số laptop đời cũ, đôi khi hai thiết bị (như cái loa và cái đồng hồ hệ thống) được cấp cùng một số thứ tự, dẫn đến chuyện tụi nó "đánh lộn" giành giật CPU, gây ra lỗi mất âm thanh hoặc đứng máy. Các bản vá này sẽ sắp xếp lại trật tự xếp hàng cho chúng để tránh những lỗi tiềm ẩn vì macOS rất nhạy cảm với IRQ.
Giờ thì hãy chuyển sang trang tiếp theo để xem hệ thống của bạn cần những SSDT nào: