[英]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嗎?
我正在看的選項:
嘗試使用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_SIZE (PAGE_SIZE = 1 << PAGE_SHIFT)
getconf
API獲取當前系統PAGE_SHIFT
。 此包裝器獲取當前系統頁面的移位並將其作為模塊參數傳遞。 現在,模塊正在使用不同的PAGE_SIZE加載到不同的體系結構上而沒有任何問題。
你可以運行一個測試,只需mmap一個具有不同偏移的文件,看看哪個失敗了。 可能在內核模塊中很煩人,但也許還有其他一些你可以使用的測試。
我擔心這是不可能的,因為頁面大小被定義為內核的一部分。 如果還有用於編譯內核模塊的工具鏈,則需要頁面大小知識。
因此,至少使用當前的內核架構,這是不可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.