簡體   English   中英

如何以編程方式獲取Linux內核頁面大小

[英]How to get linux kernel page size programmatically

我正在為IA64開發Linux模塊。 我目前的問題是驅動程序使用PAGE_SIZE和PAGE_SHIFT宏進行dma頁面分配。 我遇到的問題是編譯驅動程序的機器不是需要運行驅動程序的機器。 因此,如果編譯機器上的PAGE_SIZE為2 ^ 14K且目標機器為2 ^ 16K,則驅動程序將失敗。

我不想把這個問題變成關於在不運行模塊的機器上編譯模塊的“最佳實踐”問題。 我理解這個問題。 我發現人們大多使用getpagesize()或sysconf(_SC_PAGE_SIZE)。 這兩個選項不在ia64內核頭文件中,因此我無法使用它們。 還有另一種方法可以獲得運行時PAGE_SIZE嗎?

我正在看的選項:

  • 在/ proc中讀取一些文件?
  • 系統調用?
  • 讓我通過推理計算PAGE_SIZE的其他函數(例如ORDER,getpageshift等)?
  • 其他?

嘗試使用getconf實用程序,它可以讓您輕松檢索頁面大小。

getconf PAGESIZE

一種近似方法是讀取/proc/meminfo並檢查Mapped大小(目前我的52544 kB),然后檢查/proc/vmstat nr_mapped (截至目前我的131136)。 最后PAGE_SIZE = Mapped/nr_mapped 有時候這會給你一個准確的值(就像我引用的當前例子中的那樣),有時它的近似但非常接近。 希望這可以幫助!

如果您正在嘗試構建內核模塊,則至少需要具有為模塊運行的內核配置的內核頭文件。 這些將定義您需要的頁面大小宏。 如果您沒有正確配置的標頭,內核將拒絕加載您的模塊。

編譯一台機器上的模塊在另一台機器上運行沒有任何問題,即使它是一個不同的架構。 您只需要構建正確的內核源代碼。

找到頁面大小的一種方法是從一個進程的smaps中獲取它。

例如:

cd /proc/1
grep -i pagesize smaps

KernelPageSize:        4 kB
MMUPageSize:           4 kB

這就是我最終做的:

  • 重新處理我當前的模塊以獲取一個名為page_shift的新模塊參數,並使用它來計算PAGE_SIZE (PAGE_SIZE = 1 << PAGE_SHIFT)
  • 創建了一個模塊加載器包裝器,它使用libc中的getconf API獲取當前系統PAGE_SHIFT 此包裝器獲取當前系統頁面的移位並將其作為模塊參數傳遞。

現在,模塊正在使用不同的PAGE_SIZE加載到不同的體系結構上而沒有任何問題。

你可以運行一個測試,只需mmap一個具有不同偏移的文件,看看哪個失敗了。 可能在內核模塊中很煩人,但也許還有其他一些你可以使用的測試。

我擔心這是不可能的,因為頁面大小被定義為內核的一部分。 如果還有用於編譯內核模塊的工具鏈,則需要頁面大小知識。

因此,至少使用當前的內核架構,這是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM