Tôi đang viết một phần mở rộng hạt nhân OSX cho trình điều khiển thiết bị âm thanh (phần mềm của nó, nhưng mô phỏng thiết bị phần cứng).Không thể bỏ mở rộng hạt nhân; Các lớp có trường hợp
Trong quá trình phát triển, sẽ thuận tiện để gỡ cài đặt hoàn toàn các phiên bản cũ hiện có và sau đó xây dựng và cài đặt phiên bản mới từ đầu. Tuy nhiên, điều này đôi khi dường như không thể thực hiện được nếu không có hệ thống khởi động lại.
Bản thân chương trình không chạy và các tệp nguồn đã bị xóa khỏi thư mục /System/Library/Extensions/
.
Nhưng kextstat
cho thấy một trường hợp duy nhất:
$ kextstat | grep 'com.foo.driver.bar'
219 0 0xfff123 0x5000 0x5000 com.foo.driver.bar (0.0.1) <102 5 4 3>
(... nghĩa :)
Index Refs Address Size Wired Name (Version) <Linked Against>
Vì vậy, có 0 Refs để dụ người lái xe của tôi, nhưng kextunload
đôi khi sẽ thất bại, phàn nàn về các phiên bản hiện tại:
$ sudo kextunload -b com.foo.driver.bar
(kernel) Can't unload kext com.foo.driver.bar; classes have instances:
(kernel) Kext com.foo.driver.bar class FooBarDriver has 1 instance.
(kernel) Kext com.foo.driver.bar class com_foo_driver_bar has 1 instance.
Failed to unload com.foo.driver.bar - (libkern/kext) kext is in use or retained (cannot unload).
Khi điều này xảy ra, thứ Không có cách nào để "buộc" dỡ bỏ kext (mà tôi biết).
Tôi có đoán đúng rằng trường hợp đơn lẻ này vẫn tồn tại do tham chiếu được giữ trong bộ nhớ bởi hạt nhân OS đang chạy không? Điều đó có vẻ không đúng, bởi vì sau đó kextunload
sẽ luôn thất bại. Vậy tại sao chỉ kextunload
đôi khi yêu cầu khởi động lại hệ thống để "hoàn toàn" dỡ tất cả các phiên bản trình điều khiển?
Hữu ích. Cảm ơn! – pje