第64章 バッファー ( buffer_head )

buffer_head はブロックの読み書きのためのバッファーです。

ページにコピーしたり、ページからコピーを行うために使用されます。

メモリー内でバッファーは 1 ブロックのことを表します。

ページは複数のバッファー(ブロック)を保持することができます。

// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/buffer_head.h
 54 /*
 55  * Historically, a buffer_head was used to map a single block
 56  * within a page, and of course as the unit of I/O through the
 57  * filesystem and block layers.  Nowadays the basic I/O unit
 58  * is the bio, and buffer_heads are used for extracting block
 59  * mappings (via a get_block_t call), for tracking state within
 60  * a page (via a page_mapping) and for wrapping bio submission
 61  * for backward compatibility reasons (e.g. submit_bh).
 62  */
 63 struct buffer_head {
 64   unsigned long b_state;    /* buffer state bitmap (see above) */
 65   struct buffer_head *b_this_page;/* circular list of page's buffers */
 66   struct page *b_page;    /* the page this bh is mapped to */
 67
 68   sector_t b_blocknr;   /* start block number */
 69   size_t b_size;      /* size of mapping */
 70   char *b_data;     /* pointer to data within the page */
 71
 72   struct block_device *b_bdev;
 73   bh_end_io_t *b_end_io;    /* I/O completion */
 74   void *b_private;    /* reserved for b_end_io */
 75   struct list_head b_assoc_buffers; /* associated with another mapping */
 76   struct address_space *b_assoc_map;  /* mapping this buffer is
 77                associated with */
 78   atomic_t b_count;   /* users using this buffer_head */
 79 };

コメントにもありますが buffer_head は昔は I/O の単位として使われていたらしいですが、今は bio ( Block I/O )がその役割を持ちます。

bio については次の項目で軽く説明します。

Copyright 2018-2019, by Masaki Komatsu