2014-12-29 22 views
8

Tôi hiện đang trong quá trình hiểu những gì cần cho hạt nhân Linux khởi động. Tôi đang duyệt qua cây nguồn hạt nhân Linux, đặc biệt là kiến ​​trúc ARM, cho đến khi tôi tình cờ gặp hướng dẫn lắp ráp này retne lr trong arch/arm/kernel/hyp-stub.SLắp ráp ARM "retne" hướng dẫn

Về mặt khái niệm, nó dễ dàng hiểu rằng hướng dẫn được giả sử để trở về địa chỉ được lưu trữ trong liên kết đăng ký nếu cờ Z là 0. Những gì tôi đang tìm là nơi hướng dẫn lắp ráp ARM này thực sự là tài liệu.

Tôi đã tìm kiếm trong phần ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition A8.8 và không thể tìm thấy mô tả hướng dẫn.

Tham khảo các nguồn và xem nếu đó là một số ARM specific GNU AS extension không bật lên bất kỳ điều gì cụ thể.

Tìm kiếm trên google với các truy vấn "hướng dẫn lắp ráp cánh tay", "hướng dẫn trả lại cánh tay" và bất kỳ thứ gì tương tự dọc theo các dòng cũng không bật lên bất kỳ thứ gì hữu ích. Chắc chắn tôi phải tìm kiếm ở những nơi sai lầm hoặc tôi phải thiếu một cái gì đó.

Bất kỳ việc làm rõ nào cũng sẽ được đánh giá cao.

Trả lời

11

Ngôn ngữ lắp ráp kiến ​​trúc là một điều, mã thế giới thực là một mã khác. Một khi các trình giả lập và các macro đi vào hoạt động, một sự quen thuộc với cả chuỗi công cụ và codebase được đề cập sẽ giúp ích rất nhiều. Linux là đặc biệt khó chịu như nhiều nguồn lắp ráp có chứa nhiều lớp của cả hai macro lắp ráp và các macro CPP. Nếu bạn biết những gì để tìm kiếm, và làm theo các đường mòn tiêu đề để arch/arm/include/asm/assembler.h, bạn cuối cùng tìm thấy con quái vật phức tạp này:

.irp c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo 
.macro ret\c, reg 
#if __LINUX_ARM_ARCH__ < 6 
     mov\c pc, \reg 
#else 
     .ifeqs "\reg", "lr" 
     bx\c \reg 
     .else 
     mov\c pc, \reg 
     .endif 
#endif 
     .endm 
     .endr 

Mục đích của việc này là để emit the architecturally-preferred return instruction vì lợi ích của microarchitectures with a return stack, trong khi cho phép cùng một mã để vẫn biên dịch cho các kiến ​​trúc cũ hơn.

+3

Xem thêm [commit message] có liên quan (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/arch/arm/kernel/hyp-stub.S? id = 6ebbf2ce437b33022d30badd49dc94d33ecfa498). – Jester

+0

Tôi chỉ đang tìm kiếm điều đó, cảm ơn;) – Notlikethat

+0

Không có thắc mắc tại sao phải tìm kiếm nguồn và xem liệu đó có phải là phần mở rộng GNU AS cụ thể của ARM không bật lên bất kỳ thứ gì hay không. Cảm ơn bạn, điều này làm rõ nó một cách hoàn hảo. – jrcatbagan

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