2015-04-23 32 views
5

Tài liệu ELF Handling For Thread-Local Storage cung cấp chuỗi trình tự cho các mô hình khác nhau (thực thi cục bộ/lệnh ban đầu/động lực chung) cho các kiến ​​trúc khác nhau. Nhưng không phải ARM - có bất cứ nơi nào tôi có thể thấy các chuỗi mã như vậy cho ARM không? Tôi đang làm việc trên một trình biên dịch và muốn tạo mã sẽ hoạt động đúng với các liên kết nền tảng (cả chương trình và động).Trình tự mã cho TLS trên ARM

Để rõ ràng, hãy giả sử CPU ARMv7 và hạt nhân mới và glibc (nói 3.13+/2.19+), nhưng tôi cũng quan tâm đến những gì phải thay đổi cho hw/sw cũ hơn nếu dễ giải thích .

+1

Tôi sẽ thực hiện một số thao tác tháo rời (http://goo.gl/TPiQCX) rồi sử dụng chúng để google. https://gcc.gnu.org/ml/gcc-patches/2005-03/msg02375.html http://sourcery.mentor.com/public/publications/RFC-TLSDESC-ARM.txt http: // lxr. free-electrons.com/source/arch/arm/include/asm/tls.h – auselen

+0

Có thể cho rằng một bản sao của lưu lượng truy cập http: // stackoverflow.com/questions/12878698/what-are-the-real-elf-tls-abi-yêu cầu-cho-mỗi-cpu-arch, nhưng mà không có một câu trả lời đúng. – unixsmurf

+0

@unixsmurf Tôi nghĩ câu trả lời của R đối với câu hỏi của anh ấy và làm cách nào để có được 'đăng ký chủ đề' trong ARM-Linux trả lời câu hỏi này? –

Trả lời

2

Tôi không hiểu chính xác những gì bạn muốn. Tuy nhiên, trình tự lắp ráp (ví ARMv6 + và một hạt nhân có khả năng) là,

mrc p15, 0, rX, c13, c0, 2 @ get the user r/w register 

này được gọi là TPIDRURW trong một số hướng dẫn sử dụng ARM. Các bảng/cấu trúc TLS của bạn phải được phân biệt với giá trị này (có thể là một con trỏ). Sử dụng mcr là nhanh hơn, nhưng bạn cũng có thể gọi trình trợ giúp (xem bên dưới) nếu bạn không đặt HWCAP_TLS trong ELF (có thể được sử dụng trên tất cả CPU ARM được Linux hỗ trợ).

Mục đích của địa chỉ 0xffff0fe8 dường như để được rằng bạn có thể sử dụng những 4-byte thay vì sử dụng lắp ráp trên trực tiếp với (rX == r0) như thể nó là khác nhau đối với một số máy ở đâu đó.


Tùy thuộc vào loại CPU. Có một số helper in the vector page @0xffff0fe0 in entry-armv.S; nó đang trong quá trình cấu trúc/thread nếu phần cứng không hỗ trợ nó. Tài liệu là trong kernel_user_helpers.txt

dụ Cách sử dụng:

typedef void * (__kuser_get_tls_t)(void); 
#define __kuser_get_tls (*(__kuser_get_tls_t *)0xffff0fe0) 

void foo() 
{ 
    void *tls = __kuser_get_tls(); 
    printf("TLS = %p\n", tls); 
} 

Bạn làm một syscall để thiết lập các công cụ TLS. clone là một cách để thiết lập ngữ cảnh luồng. thread_info giữ tất cả đăng ký cho một chủ đề; nó có thể chia sẻ một mm (chế độ quản lý bộ nhớ hoặc bộ nhớ xử lý) với task_struct khác. Tức là, thread_info có một tp_value cho mỗi chuỗi được tạo.

Here is a dicussion việc triển khai ARM. ELF/nptl/glibc và Linux kernel đều tham gia (và/hoặc các thuật ngữ tìm kiếm để điều tra thêm). Các syscall cho get_tls() có lẽ là quá đắt và đường chính hiện tại có một helper trang vector (ánh xạ bởi tất cả các chủ đề/quy trình).

Một số nguồn glibc, tls-macros.h, tlsdesc.c vv Nhiều khả năng một câu trả lời đầy đủ/ngắn gọn sẽ phụ thuộc vào phiên bản của,

  1. CPU ARM của bạn.
  2. Nhân Linux của bạn.
  3. Glibc của bạn.
  4. Trình biên dịch của bạn (và cờ!).
+0

** TCB ** trong tệp PDF mà bạn tham chiếu là cấu trúc 'thread_info' trong ARM-Linux. Oh, và dĩ nhiên 'ld' (bộ nạp) có liên quan. CP15 c13, c0 được sử dụng trên ARMv6 +. Có ba đăng ký. Người dùng r/w, người dùng chỉ đọc và đặc quyền (chỉ dành cho hạt nhân); tất nhiên hạt nhân phải có khả năng viết tất cả chúng. ARM Linux chỉ sử dụng hai (như tp_values); bên cạnh đó, ** trình tự lắp ráp ** khác sẽ tùy thuộc vào trí tưởng tượng của bạn nếu bạn đang thực hiện điều này trên ARM. Tức là, câu hỏi của bạn không rõ ràng với tôi; bạn có muốn sử dụng lại bộ tải * glibc * hay tự viết tất cả không gian người dùng không? –

+0

Cảm ơn bạn đã trả lời. Đó là lệnh mrc gây nhầm lẫn nhất cho tôi, tôi nghĩ vậy. Và tôi luôn quên mớ hỗn độn đó là các phiên bản CPU ARM. Tôi sẽ chỉnh sửa câu hỏi và sau đó có thể bạn có thể chỉnh sửa câu trả lời cho phù hợp. – mwhudson

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