2015-06-20 30 views
9

Một tài xế Tôi nhìn có__devexit có nghĩa là gì trong khai báo hàm?

static void __devexit rtsx_remove(struct pci_dev *pci) 

không __devexit có ý nghĩa gì trong bối cảnh của định nghĩa chức năng? Các chức năng khác mà tôi đã thấy có tối đa là static và loại trả về.

+0

Đây là lần thử hai câu hỏi này. Có vẻ như nỗ lực đầu tiên đã quá mờ ám với những chi tiết không liên quan đến việc nó không được trả lời. Tôi muốn xóa câu hỏi, nhưng ngăn xếp ngăn chặn cảnh báo rằng nó đã bị cau mày, và tôi cảm thấy rằng một bản chỉnh sửa sẽ làm cho các câu trả lời trước trông có vẻ không liên quan. Nếu bất cứ ai đề nghị chọn một chỉnh sửa/xóa thay vào đó, hãy cho tôi biết. – Kenkron

+7

Tại sao bạn không nhấp chuột phải vào biểu tượng '__devexit', đi đến định nghĩa của nó và tự mình xem chính xác ý nghĩa của nó ??? Nó rất có thể chỉ là một chú thích được sử dụng để tạo ra các cảnh báo được xác định trước bởi một công cụ bên ngoài để kiểm tra tính chính xác của mã hóa hoặc một cái gì đó tương tự. –

+2

Đây là một số macro trong hạt nhân Unix: http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/init.h – SomethingSomething

Trả lời

2

dài ish truyện ngắn:

Đây là một vĩ mô mở rộng thành bộ gcc thuộc tính. Chúng là một cách để cung cấp trình biên dịch với thông tin đặc biệt về nhiều thứ khác nhau trong mã của bạn, như trong trường hợp này là một hàm.

Trình biên dịch khác nhau có cú pháp khác nhau cho mục đích này, nó không phải là standartized. Ví dụ, gcc sử dụng các thuộc tính, nhưng các trình biên dịch khác sử dụng các cấu trúc khác nhau.

câu chuyện dài ish dài ish:

Vì vậy, tôi không có chuyên môn Linux kernel, nhưng căn cứ vào mã nguồn, macro này được sử dụng cho Hotplug. Tôi tin rằng nó biểu thị rằng chức năng nên làm điều gì đó với một thiết bị cụ thể thoát.

Ví dụ: chức năng bạn cung cấp có vẻ là từ tập hợp các chức năng Hotplug để làm việc với trình điều khiển trình đọc thẻ Realtek PCI-Express.

Macro đó thực sự làm gì? Vâng, chúng ta hãy xem xét kỹ hơn định nghĩa của vĩ mô:

#define __devexit  __section(.devexit.text) __exitused __cold 

Phần đầu tiên là __section(.devexit.text):

# define __section(S) __attribute__ ((__section__(#S))) 

Như bạn có thể thấy, điều này tạo ra một __attribute__(__section__()) với tên phần là ".devexit.text". Điều này có nghĩa là gcc sẽ biên dịch mã assembly của một hàm với thuộc tính này thành một phần có tên trong tệp nhị phân đã biên dịch với tên .devexit.text (thay vì phần mặc định).

Phần thứ hai là __exitused (được định nghĩa một cái gì đó chỉ khi vĩ mô MODULE được định nghĩa):

#define __exitused __used 

__used là, tùy theo phiên bản gcc, được xác định một trong hai như thế này:

# define __used     __attribute__((__used__)) 

hoặc như thế này:

# define __used     __attribute__((__unused__)) 

Trước đây đảm bảo chức năng có thuộc tính này được biên dịch ngay cả khi nó không được tham chiếu ở bất kỳ đâu. Sau này ngăn chặn các cảnh báo trình biên dịch trong cùng một trường hợp, mặc dù nó không ảnh hưởng đến việc biên dịch theo bất kỳ cách nào.

Và, cuối cùng, __cold:

#define __cold     __attribute__((__cold__)) 

Đây là một thuộc tính mà thông báo cho trình biên dịch rằng chức năng với thuộc tính này sẽ không được gọi là thường, vì vậy nó có thể tối ưu hóa cho phù hợp.

Sooo, chúng ta có gì cuối cùng? Có vẻ như các hàm được đánh dấu bằng __devexitchỉ các hàm không được gọi thường là (nếu được gọi là tất cả) và được nhồi vào phần được đặt tên.

Tất cả mã nguồn được lấy từ here. Dường như macro hiện đã là removed from the Linux Kernel.

+1

Rất cám ơn, bạn là một quý ông và một học giả. – Kenkron

1

"... Có nhiều khả năng chỉ là chú thích ..." --barak manos

Eureka! Nó chỉ ra rằng yếu tố bí ẩn có thể được gọi là annotation, bổ sung thêm thông tin về một hàm. Thông tin bổ sung này có thể được kiểm tra bởi trình biên dịch để phát hiện các lỗi có thể không được chú ý.

Chỉnh sửa: @MattMcNabb cho biết đó không phải là chú thích. Đã thêm tính không chắc chắn.

+0

Điều đó có thể khá nhiều thứ, vì nó rất có thể là macro. – Olaf

+1

Nếu đó là [hạt nhân Linux __devexit] (http://lxr.free-electrons.com/ident?v=2.6.33;i=__devexit) thì chắc chắn đó không phải là "chú thích". –

+0

okay, nó là gì? – Kenkron

0

Các thuộc tính này được sử dụng trong hạt nhân Linux trên một số chức năng trình điều khiển và khai báo dữ liệu nhất định, đặt chúng vào một phần riêng biệt có thể bị loại bỏ trong một số trường hợp nhất định.

Tuy nhiên, chúng không còn được sử dụng (hoặc được xác định) từ 3.10.x trở đi. Xem: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=54b956b903607

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