2012-07-25 17 views

Trả lời

29

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_levelsinclude/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ì?

  1. đưa hàm init của bạn ở mức độ cao hơn, hoặc
  2. đặ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.

+0

Cảm ơn @Yasushi Shoji vì lời giải thích chi tiết của bạn! –

+0

Đây là một ví dụ về một câu trả lời tuyệt vời! – VividD

0

Thứ tự mô-đun đúng và phụ thuộc được xử lý bởi modprobe, ngay cả trong initrd.

2

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.

0

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

Các vấn đề liên quan