2011-02-03 34 views
30

Tôi đang làm việc trên mô-đun Linux cho IA64. Vấn đề hiện tại của tôi là trình điều khiển sử dụng các macro PAGE_SIZE và PAGE_SHIFT để phân bổ trang dma. Vấn đề tôi gặp phải là máy biên dịch trình điều khiển không phải là trình điều khiển cần thiết để chạy trình điều khiển. Vì vậy, nếu PAGE_SIZE trên máy biên dịch là 2^14K và máy đích là 2^16K thì trình điều khiển không thành công.Cách nhận kích thước trang hạt nhân linux theo lập trình

Tôi không muốn biến câu hỏi này thành vấn đề 'thực hành tốt nhất' về việc biên dịch mô-đun trên máy không phải là mô-đun đang chạy mô-đun. Tôi hiểu các vấn đề về điều đó. Những gì tôi thấy là hầu hết mọi người sử dụng getpagesize() hoặc sysconf (_SC_PAGE_SIZE). Hai tùy chọn này nằm ngoài các tiêu đề hạt nhân ia64 vì vậy tôi không thể sử dụng chúng. Có cách nào khác mà tôi có thể nhận được thời gian chạy PAGE_SIZE không?

Tùy chọn Tôi đang tìm kiếm tại địa chỉ:

  • Đọc một số tập tin trong/proc?
  • syscall?
  • Chức năng khác cho phép tôi tính toán PAGE_SIZE theo suy luận (ví dụ: ORDER, getpageshift, v.v ...)?
  • Khác?
+0

Bạn có nói 'cái PAGE_SIZE' là cấu hình cho kiến ​​trúc IA64, và không cố định? Tôi nghĩ 'PAGE_SIZE' đã được sửa cho một kiến ​​trúc cụ thể (ví dụ: luôn luôn là '4096' cho x86). –

+0

IA64 thực sự hỗ trợ nhiều kích thước trang: http://www.informit.com/articles/article.aspx?p=29961&seqNum=3 – mdiener

Trả lời

5

Đây là những gì cuối cùng tôi đã làm:

  • lại làm việc mô-đun hiện tại của tôi để có một tham số mô-đun mới gọi là page_shift và sử dụng mà để tính toán PAGE_SIZE (PAGE_SIZE = 1 << PAGE_SHIFT)
  • tạo một wrapper mô-đun bộ nạp mà được dòng điện hệ thống PAGE_SHIFT sử dụng getconf API từ libc. Trình bao bọc này sẽ chuyển trang hệ thống hiện tại và chuyển nó thành tham số mô-đun.

Hiện tại, mô-đun đang được tải trên các kiến ​​trúc khác nhau với PAGE_SIZE khác nhau mà không gặp bất kỳ sự cố nào.

+0

Câu hỏi Noob. Bạn có thể giải thích thêm một chút về trình bao bọc sử dụng API getconf không? Tôi có nghĩa là bạn đã gọi lệnh getconf bên trong hàm popen() hay gì đó. Một chút ánh sáng hơn nó sẽ được siêu đánh giá cao. –

6

Nếu bạn đang cố gắng xây dựng một mô-đun hạt nhân, bạn sẽ cần phải có ít nhất các tiêu đề hạt nhân được cấu hình cho hạt nhân mô-đun sẽ chạy. Những người này sẽ xác định các macro kích thước trang mà bạn cần. Nếu bạn không có các tiêu đề được cấu hình đúng, hạt nhân sẽ từ chối tải mô-đun của bạn.

Và không có gì sai khi biên dịch mô-đun trên một máy để chạy trên một máy khác, ngay cả khi đó là một kiến ​​trúc khác. Bạn chỉ cần xây dựng dựa vào nguồn kernel chính xác.

+0

Nó không phải là một vấn đề về nguồn hạt nhân. Đó là về việc tải một mô-đun được biên dịch trên máy, để chạy vào một máy khác (Cả hai đều có cùng một phiên bản hạt nhân nhưng được cấu hình khác nhau). Tôi không muốn biên dịch lại cấu hình mới vì PAGE_SIZE đã thay đổi. Tôi đang tìm kiếm để có được tham số đó từ hạt nhân như một API, không phải là một MACRO (được giải quyết tại thời gian biên dịch). – Freddy

+0

<< Và không có gì sai khi biên dịch một mô-đun trên một máy để chạy trên một máy khác, ngay cả khi nó là một kiến ​​trúc khác. Bạn chỉ cần xây dựng dựa vào nguồn kernel chính xác. ........... CHÍNH XÁC ĐIỂM – kumar

+0

PAGE_SIZE rất cơ bản và cần thiết cho một mô-đun trong khi tự xây dựng mô-đun .. – kumar

0

Tôi lo ngại rằng không thể thực hiện khi kích thước trang được xác định là một phần của hạt nhân. kiến ​​thức về kích thước trang là bắt buộc trong trường hợp toolchain cũng được sử dụng để biên dịch mô-đun hạt nhân.

Vì vậy, ít nhất với kiến ​​trúc hạt nhân hiện tại, không thể làm như vậy.

17

Một phương pháp gần đúng là đọc /proc/meminfo và kiểm tra kích thước Mapped (trên mỏ 52.544 kB nó như bây giờ) và sau đó kiểm tra nr_mapped trong /proc/vmstat (trên mỏ 131.136 như bây giờ của nó). Cuối cùng là PAGE_SIZE = Mapped/nr_mapped. Đôi khi điều này mang lại cho bạn một giá trị chính xác (như trong ví dụ hiện tại tôi đã trích dẫn) và đôi khi nó gần đúng nhưng rất gần. Hy vọng điều này sẽ hữu ích!

42

Hãy thử sử dụng tiện ích getconf, tiện ích này sẽ cho phép bạn truy xuất kích thước trang dễ dàng.

getconf PAGESIZE 
+1

Tôi không nghĩ rằng điều này trả lời câu hỏi của OP, nhưng nó là thông tin hữu ích vì sysconf (_SC_PAGESIZE) xuất hiện để trả về 4K trên linuxia64 (trong khi mprotect thất bại trên một trang không liên kết trên một ranh giới 16K). –

0

Bạn chỉ có thể chạy thử nghiệm, chỉ cần mmap một tệp có chênh lệch khác nhau và xem lỗi nào. Có thể gây khó chịu trong mô-đun hạt nhân, nhưng có thể có một số thử nghiệm khác giống như bạn có thể sử dụng.

1

Một cách để tìm kích thước trang là lấy nó từ các lần nhấp cho một quá trình.

Ví dụ:

cd /proc/1 
cat smaps | grep -i pagesize 

KernelPageSize:  4 kB 
MMUPageSize:   4 kB 
Các vấn đề liên quan