Làm cách nào chúng tôi có thể tùy chỉnh thứ tự tải trình điều khiển tích hợp (để thực hiện tải mô-đun trình điều khiển tích hợp trước và tải mô-đun phụ thuộc sau)?Thứ tự tải trình điều khiển tích hợp Linux là gì?
Trả lời
Trình điều khiển tích hợp sẽ không bị tải, do đó được tích hợp sẵn. Các hàm khởi tạo của chúng được gọi và các trình điều khiển được kích hoạt khi hạt nhân tự thiết lập. Các hàm init này được gọi trong init/main.c::do_initcalls()
. Tất cả các cuộc gọi init được phân loại theo các cấp độ, được xác định trong initcall_levels
và include/linux/init.h
Các mức này là ký hiệu actuall được xác định trong kịch bản liên kết (arch/*/kernel/vmlinux.lds.*
). Tại thời gian biên dịch hạt nhân, trình liên kết thu thập tất cả các chức năng được đánh dấu module_init()
hoặc khác *_initcall()
, phân loại theo cấp độ, đặt tất cả các hàm trong cùng một mức với nhau ở cùng một vị trí và tạo giống như một mảng con trỏ hàm.
Điều do_initcall_level() thực hiện trong thời gian chạy là gọi mỗi hàm được trỏ bởi con trỏ trong mảng. Không có chính sách gọi, ngoại trừ các mức, trong do_initcall_level, nhưng thứ tự trong mảng được quyết định trong thời gian liên kết.
Vì vậy, bây giờ bạn có thể thấy rằng thứ tự khởi đầu của trình điều khiển được cố định tại thời gian liên kết, nhưng bạn có thể làm gì?
- đưa hàm init của bạn ở mức độ cao hơn, hoặc
- đặt trình điều khiển thiết bị của bạn ở vị trí cao hơn trong
Makefile
Người đầu tiên là rõ ràng nếu bạn đã đọc ở trên. tức là) sử dụng early_initcall() thay vào đó nếu nó là thích hợp.
Cách thứ hai cần giải thích thêm một chút. Lý do tại sao thứ tự trong một vấn đề Makefile
là cách hệ thống xây dựng hạt nhân hiện tại hoạt động và cách thức hoạt động của các trình liên kết. Để tạo một câu chuyện dài, hệ thống xây dựng sẽ lấy tất cả các tệp đối tượng trong obj-y
và liên kết chúng với nhau. Nó phụ thuộc nhiều vào môi trường nhưng có khả năng cao rằng trình liên kết đặt tệp đối tượng đầu tiên trong địa chỉ thấp hơn, do đó, được gọi là sớm hơn.
Nếu bạn chỉ muốn trình điều khiển được gọi sớm hơn các trình điều khiển khác trong cùng một thư mục, đây là cách đơn giản nhất để thực hiện.
depmod
kiểm tra các biểu tượng được xuất và yêu cầu theo từng mô-đun và thực hiện sắp xếp tôpô trên chúng mà modprobe
sau đó có thể sử dụng để tải mô-đun theo thứ tự thích hợp. Việc yêu cầu các biểu tượng từ các mô-đun bạn muốn phụ thuộc là đủ để nó hoạt động đúng.
Gần đây tôi gặp vấn đề này trình điều khiển sạc của tôi là phụ thuộc vào trình điều khiển ADC vì vậy trước khi tải trình điều khiển bộ sạc trình điều khiển ADC đã tải và kiểm tra adc phandle được xác định trong tệp DTS và phải intialize bởi trình điều khiển ADC. nó đã được giải quyết bằng cách thay đổi thứ tự của mô-đun trong các trình điều khiển/Makefile
- 1. Sự khác nhau giữa trình điều khiển nền tảng Linux và trình điều khiển thiết bị thông thường là gì?
- 2. Trình điều khiển loại XA là gì?
- 3. tải trình điều khiển JDBC
- 4. Sự khác nhau giữa trình điều khiển WDM, trình điều khiển KMDF và trình điều khiển UMDF là gì?
- 5. Cách tốt nhất để tích hợp điều khiển phiên bản TFS là gì
- 6. Trình điều khiển I2C trong Linux
- 7. Hạt nhân Linux biết trình điều khiển nào cần tải khi khởi động?
- 8. ERESTARTSYS sử dụng những gì khi viết trình điều khiển linux?
- 9. Phát triển trình điều khiển Linux: Sự khác biệt giữa trình điều khiển PCI và PCIe?
- 10. Trình tích hợp dữ liệu Oracle là gì?
- 11. Thứ tự các điều khiển trong thuộc tính Điều khiển của biểu mẫu trong C#
- 12. Lập trình trình điều khiển thiết bị hạt nhân Linux
- 13. MFC có tích hợp điều khiển lưới không?
- 14. Bảng điều khiển Javascript tương tác (tốt nhất là tích hợp với Firebug)
- 15. Truyền DMA trong trình điều khiển hạt nhân Linux PCIE
- 16. Mới đối với nhân Linux/Phát triển trình điều khiển
- 17. Python IDE trên Bàn điều khiển Linux
- 18. Quy ước mã hóa để sử dụng dấu phẩy động trong trình điều khiển thiết bị Linux là gì?
- 19. Làm thế nào để giao tiếp với trình điều khiển vi điều khiển Linux
- 20. Truy cập trình điều khiển Linux thông qua sysfs
- 21. Chính xác "Bảng điều khiển" là gì?
- 22. điều khiển thứ tự xuất chậm lại đa luồng chương trình
- 23. Cụm từ thông dụng cho các ký tự điều khiển là gì?
- 24. Điều khiển điều chỉnh kích thước cửa sổ tự động trong Tkinter là gì?
- 25. Thêm mã trình điều khiển mới vào mã nguồn linux
- 26. Tích hợp iCarousel vào ứng dụng có trình điều khiển thanh tab trong iOS 6.1
- 27. Phạm vi phụ thuộc cho trình điều khiển Derby JDBC trong phạm vi tích hợp (cayenne)
- 28. Điều khiển không cửa sổ là gì?
- 29. Buộc trình điều khiển cho phù hợp với thiết bị
- 30. Điều khiển này là gì? (Nút "Mở" với thả xuống)
Cảm ơn @Yasushi Shoji vì lời giải thích chi tiết của bạn! –
Đây là một ví dụ về một câu trả lời tuyệt vời! – VividD