2011-02-03 53 views
30

我正在爲IA64開發一個Linux模塊。我目前的問題是驅動程序使用PAGE_SIZE和PAGE_SHIFT宏來進行dma頁面分配。我遇到的問題是編譯驅動程序的機器不是運行驅動程序所需的機器。因此,如果編譯機器上的PAGE_SIZE是2^14K,而目標機器是2^16K,那麼驅動器會失敗。如何以編程方式獲取Linux內核頁面大小

我不想把這個問題變成一個「最佳實踐」問題有關的機器不屬於運行的模塊的那些編譯模塊。我理解這個問題。我發現人們主要使用getpagesize()或sysconf(_SC_PAGE_SIZE)。這兩個選項不在ia64內核頭文件中,所以我不能使用它們。有沒有另一種方法可以獲得運行時PAGE_SIZE?

選項我正在看:

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

你說的`PAGE_SIZE`是可配置的IA64架構,而不是固定的嗎?我認爲`PAGE_SIZE`對於給定的體系結構是固定的(例如對於x86總是`4096`)。 – 2013-04-10 00:54:53

+0

IA64確實支持多種頁面大小:http://www.informit.com/articles/article.aspx?p=29961&seqNum=3 – mdiener 2015-03-24 01:59:48

回答

5

這就是我終於做到:

  • 返工我目前的模塊採取所謂PAGE_SHIFT一個新的模塊的參數和使用的計算PAGE_SIZE (PAGE_SIZE = 1 << PAGE_SHIFT)
  • 創建一個模塊加載封裝程序獲取當前系統PAGE_SHIFT使用來自libc的getconf API。這個包裝獲取當前系統頁面轉換並將其作爲模塊參數傳遞。

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

6

如果您正在嘗試構建內核模塊,那麼您至少需要爲內核配置內核頭文件,以便模塊運行。那些將定義您需要的頁面大小的宏。如果你沒有正確配置的頭文件,內核將拒絕加載你的模塊。

並沒有什麼錯編譯模塊一臺機器上到另一個運行,即使它是一個不同的體系結構。您只需構建正確的內核源代碼即可。

+0

這不是關於內核源的問題。這是關於加載在機器上編譯的模塊,以運行到另一臺機器(兩者具有相同的內核版本,但配置不同)。我不想根據新配置重新編譯,因爲PAGE_SIZE已更改。我期待從內核獲取該參數作爲API,而不是作爲MACRO(在編譯時解決)。 – Freddy 2011-03-17 20:01:16

+0

<<在一臺機器上編譯模塊以在另一臺機器上運行沒有任何問題,即使它是不同的體系結構。您只需構建正確的內核源代碼即可。 ...........明確的點 – kumar 2011-05-10 05:44:41

0

我擔心這是不可能的,因爲頁面大小是定義爲內核的一部分。 工具鏈也需要頁面大小的知識,您也可以使用它來編譯內核模塊。

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

17

一種近似方法是讀取/proc/meminfo並檢查Mapped大小(在礦其52544 KB截至目前),然後在/proc/vmstat檢查nr_mapped(對礦井其131136截至目前)。最後PAGE_SIZE = Mapped/nr_mapped。有時候,這會給你一個準確的價值(正如我引用的當前例子),有時它的近似值卻非常接近。 希望這有助於!

42

嘗試使用getconf工具,它可以讓你輕鬆地檢索頁面大小。

getconf PAGESIZE 
0

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

1

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

例如:

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

KernelPageSize:  4 kB 
MMUPageSize:   4 kB 
相關問題