このページはWritingPortableDriversセクションの一部です。

メモリに関する問題

原文: MemoryIssues

InternalKernelDataTypesにおけるdrivers/char/serial.cの例で見たように、 カーネルにメモリページを要求することができます。メモリページのサイズは必ずしも (i386のように)4KBとは限りません。メモリページを参照するなら、PAGE_SHIFT とPAGE_SIZEを使用する必要があります。

PAGE_SHIFTはPAGE_SIZEの値を得るために左シフトするビット数を表します。 これらの値はアーキテクチャによって異なります。 次に示すテーブルは、いくつかのアーキテクチャにおけるPAGE_SHIFTの値と、 その値から求まるPAGE_SIZEの値の一覧です。

ArchitecturePAGE_SHIFTPAGE_SIZE
i386124K
MIPS124K
Alpha138K
m68k124K
m68k138K
ARM124K
ARM1416K
ARM1532K
IA-64124K
IA-64138K
IA-641416K
IA-641664K

同じ基本アーキテクチャであっても、ページサイズは異なることがあります。 ページサイズは、(IA-64のように)コンフィグレーションオプションに依存する こともあれば、(ARMのように)プロセッサの種類の違いによることもあります。

以下に示すdrivers/usb/class/audio.cのコードの断片は、メモリに直接 アクセスするときにPAGE_SHIFTとPAGE_SIZEをどのように使用する かを示しています。

#!cplusplus
static int dmabuf_mmap(...)
{
        size >>= PAGE_SHIFT;
        for(nr = 0; nr < size; nr++)
                if (!db->sgbuf[nr])
                        return -EINVAL;
        db->mapped = 1;
        for (nr = 0; nr < size; nr++) {
                unsigned long pfn;

                pfn = virt_to_phys(db->sgbuf[nr]) >> PAGE_SHIFT;
                if (remap_pfn_range(vma, start, pfn, PAGE_SIZE, prot))
                        return -EAGAIN;
                start += PAGE_SIZE;
        }
        return 0;
}