Tôi đã đọc rằng nó được sử dụng cho các chức năng thực hiện các cuộc gọi hệ thống trong Linux. Ví dụ:Công cụ sửa đổi 'asmlinkage' có nghĩa là gì?
asmlinkage long sys_getjiffies(void)
{
return (long)get_jiffies_64();
}
và nó cho trình biên dịch chuyển tất cả các đối số hàm trên ngăn xếp. Nhưng đó không phải là trường hợp? Đối số chức năng thường được truyền bằng cách đẩy chúng vào ngăn xếp chỉ. Hay là chúng ta đang đề cập đến các đối số hàm truyền qua các thanh ghi ở đây?
Lưu ý rằng các tham số đầu tiên của các hàm nhân Linux được chuyển vào sổ đăng ký trên x86 theo mặc định. Trên x86-32, 3 tham số đầu tiên được truyền trong '% eax','% edx' và '% ecx', theo thứ tự đó, các tham số còn lại sẽ được xếp chồng lên nhau. Các hàm với các danh sách đối số biến là một ngoại lệ, chúng nhận được tất cả các đối số của chúng trên stack trên x86-32. Trên x86-64, 6 tham số đầu tiên được chuyển trong '% rdi','% rsi', '% rdx','% rcx', '% r8','% r9' (ngay cả đối với các hàm có varargs), theo thứ tự đó, phần còn lại - trên ngăn xếp. Hệ thống gọi theo các quy ước khác nhau. – Eugene
(tiếp theo) Như @dirkgently lưu ý, 'asmlinkage' là một cách để ghi đè lên các quy ước mặc định trên thông số đi qua. Xem thêm mô tả chi tiết về các quy ước gọi khác nhau trong sách hướng dẫn của Agner Fog (http://www.agner.org/optimize/calling_conventions.pdf). – Eugene
Có một giải thích tốt về Quora: [https://www.quora.com/Linux-Kernel/What-does-asmlinkage-mean-in-the-definition-of-system-calls](https://www .quora.com/Linux-Kernel/What-does-asmlinkage-mean-in-the-definition-of-system-calls). –