MALLOC(9)

名称
malloc, free - カーネルのメモリ割り当て

書式
void * malloc(unsigned long size, int type, int flags) MALLOC(space, cast, unsigned long size, int type, int flags) void free(void *addr, int type) FREE(void *addr, int type)

解説
関数 malloc() は カーネルアドレス空間内にある size で指定された大きさのオブジェクトを得るために 未初期化のメモリを割り当てます。 free() は、 malloc() で確保した addr のアドレスで示されるメモリを再利用のために解放します。 MALLOC() マクロは、以下と同様であり、

    (space) = (cast)malloc((u_long)(size), type, flags)

FREE() マクロは、以下と同様です。

    free((caddr_t)(addr), type)

standard C library の malloc (malloc(3)) とは違い、カーネル版 malloc は更に二つ多く引数が必要です。 flags 引数によって malloc() 操作における以下のような特性を付け加えます:

M_NOWAIT
    リソース不足によって即座に要求が果たせなかった場合に、 malloc() は NULL を返します。 M_NOWAIT が指定されていなければ、要求に答えられなかった場合 malloc() は sleep を呼び、他のプロセスによってリソースが解放されるのを待ちます。 この場合、 malloc() が NULL を返すことはありません。 M_WAITOK は利便のために 0 と定義されています。したがって、 flags と or することによりリソースの解放を待つように指定できます。 (訳注: 将来的に 2 や 3 に define されているマクロが増えた場合でも M_XXXX|M_WAITOK と書ける、ということです)

現在のところ、まだこのフラグひとつしか定義されていません。

type は、カーネルのどのサブシステムがメモリを要求しているかを おおまかに関連づけさせます。 この情報は一般に、カーネルのメモリ使用統計情報を保存するために使われます。 現在定義されているのは以下のタイプです:

M_FREE
    Should be on free list.
M_MBUF
    Mbuf memory.
M_DEVBUF
    Device driver memory.
M_SOCKET
    Socket structure.
M_PCB
    Protocol control block.
M_RTABLE
    Routing tables.
M_HTABLE
    IMP host tables.
M_FTABLE
    Fragment reassembly header.
M_ZOMBIE
    Zombie proc status
M_IFADDR
    Interface address.
M_SOOPTS
    Socket options.
M_SONAME
    Socket name.
M_NAMEI
    Namei path name buffer.
M_GPROF
    Kernel profiling buffer.
M_IOCTLOPS
    Ioctl data buffer.
M_MAPMEM
    Mapped memory descriptors.
M_CRED
    Credentials.
M_PGRP
    Process group header.
M_SESSION
    Session header.
M_IOV
    Large iov's.
M_MOUNT
    Vfs mount struct.
M_FHANDLE
    Network file handle.
M_NFSREQ
    NFS request header.
M_NFSMNT
    NFS mount structure.
M_NFSNODE
    NFS vnode private part.
M_VNODE
    Dynamically allocated vnodes.
M_CACHE
    Dynamically allocated cache entries.
M_DQUOT
    UFS quota entries.
M_UFSMNT
    UFS mount structure.
M_SHM
    SVID compatible shared memory segments.
M_VMMAP
    VM map structures.
M_VMMAPENT
    VM map entry structures.
M_VMOBJ
    VM object structure.
M_VMOBJHASH
    VM object hash structure.
M_VMPMAP
    VM pmap.
M_VMPVENT
    VM phys-virt mapping entry.
M_VMPAGER
    XXX: VM pager struct.
M_VMPGDATA
    XXX: VM pager private data.
M_FILE
    Open file structure.
M_FILEDESC
    Open file descriptor table.
M_LOCKF
    Byte-range locking structures.
M_PROC
    Proc structures.
M_SUBPROC
    Proc sub-structures.
M_SEGMENT
    Segment for LFS.
M_LFSNODE
    LFS vnode private part.
M_FFSNODE
    FFS vnode private part.
M_MFSNODE
    MFS vnode private part.
M_NQLEASE
    Nqnfs lease.
M_NQMHOST
    Nqnfs host address table.
M_NETADDR
    Export host address structure.
M_NFSSVC
    Nfs server structure.
M_NFSUID
    Nfs uid mapping structure.
M_NFSD
    Nfs server daemon structure.
M_IPMOPTS
    Internet multicast options.
M_IPMADDR
    Internet multicast address.
M_IFMADDR
    Link-level multicast address.
M_MRTABLE
    Multicast routing tables.
M_ISOFSMNT
    ISOFS mount structure.
M_ISOFSNODE
    ISOFS vnode private part.
M_MSDOSFSMNT
    MSDOS FS mount structure.
M_MSDOSFSFAT
    MSDOS FS fat table.
M_MSDOSFSNODE
    MSDOS FS vnode private part.
M_TTYS
    Allocated tty structures.
M_EXEC
    Argument lists & other mem used by exec.
M_MISCFSMNT
    Miscfs mount structures.
M_MISCFSNODE
    Miscfs vnode private part.
M_ADOSFSMNT
    Adosfs mount structures.
M_ADOSFSNODE
    Adosfs vnode private part.
M_ANODE
    Adosfs anode structures and tables.
M_IPQ
    IP packet queue entry.
M_AFS
    Andrew File System.
M_ADOSFSBITMAP
    Adosfs bitmap.
M_NFSSRVDESC
    NFS server descriptor.
M_NFSDIROFF
    NFS directory cookies.
M_NFSBIGFH
    NFS big filehandle.
M_EXT2FSNODE
    EXT2FS vnode private part.
M_VMSWAP
    VM swap structures.
M_VMPAGE
    VM page structures.
M_VMPBUCKET
    VM page buckets.
M_UVMAMAP
    UVM amap and related structs.
M_UVMAOBJ
    UVM aobj and related structs.
M_DMAMAP
    bus_dma(9) structures.
M_IPFLOW
    IP flow entries.
M_USB
    USB general.
M_USBDEV
    USB permanent.
M_POOL
    Memory pool(9) structures.
M_CFS
    Coda file system structures and tables.
M_TEMP
    Misc temporary data buffers.

type を基盤とする統計情報は、 カーネルオプション KMEMSTATS が指定してカーネルをコンパイルした時のみ使われます (current の NetBSD カーネルのデフォルトです) 。 この統計情報は ‘vmstat -m’ で見ることができます。

戻り値
malloc() は、 どのタイプのオブジェクトにも適するアラインメントされた カーネルの論理アドレスを返します。

関連項目
vmstat(8)

診断
コンフィギュレーションオプションで DIAGNOSTIC を付けてコンパイルされたカーネルは、 確保していない場所への書きこみなどといった整合性の取れてないメモリアクセスや、 malloc() と free() の対応のとれてない呼び出しなどを検出します。 これらの一貫性チェックで問題が見つかった場合は、panic を起こすか、 システムコンソールに以下のようなメッセージを表示します:

•   panic: “malloc - bogus type”
•   panic: “malloc: out of space in kmem_map”
•   panic: “malloc: allocation too large”
•   panic: “malloc: wrong bucket”
•   panic: “malloc: lost data”
•   panic: “free: unaligned addr”
•   panic: “free: duplicated free”
•   panic: “free: multiple frees”
•   panic: “init: minbucket too small/struct freelist too big”
•   “multiply freed item <addr>”
•   “Data modified on freelist: <data object description>”