Annotation of nono/host/diskdriver_qcow2.h, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2024 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // ディスクイメージドライバ (QCOW2 形式)
                      9: //
                     10: 
                     11: #pragma once
                     12: 
                     13: #include "diskdriver.h"
                     14: #include "autofd.h"
                     15: #include "vectorbool64.h"
                     16: #include <vector>
                     17: 
                     18: // ディスクイメージ (QCOW2 形式)
                     19: class DiskDriverQcow2 : public DiskImageDriver
                     20: {
                     21:        using inherited = DiskImageDriver;
                     22:  public:
                     23:        DiskDriverQcow2(const std::string& objname_, const std::string& pathname_);
                     24:        ~DiskDriverQcow2() override;
                     25: 
                     26:        bool Match() override;
                     27:        bool Attach(std::string& errmsg) override;
                     28:        bool Open(bool read_only) override;
                     29:        void Close() override;
                     30:        bool Read(void *buf, off_t offset, size_t size) override;
                     31:        bool Write(const void *buf, off_t offset, size_t size) override;
                     32: 
                     33:  private:
                     34:        int  HasCompressed();
                     35:        bool ReadTable(std::vector<uint64>& buf, uint64 offset);
                     36:        off_t AllocCluster(const void *buf);
                     37:        bool WriteEntry(uint64 baseoff, uint64 index, uint64 data);
                     38:        bool ReadRefcount();
                     39:        uint64 AllocRefcount();
                     40:        bool FindCluster(uint64 *);
                     41: 
                     42:        static bool is_mem_zero(const void *, size_t);
                     43:        static const char *CryptMethodToStr(uint32);
                     44:        static const char *CompressionTypeToStr(uint32);
                     45: 
                     46:        autofd fd {};
                     47: 
                     48:        uint32 version {};
                     49:        uint32 L1_size {};
                     50:        uint64 L1_table_offset {};
                     51:        uint32 cluster_bits {};
                     52:        uint64 L2_entries {};
                     53:        uint64 refcount_table_offset {};
                     54:        uint32 refcount_table_clusters {};
                     55: 
                     56:        // クラスタのバイトサイズ。
                     57:        uint64 cluster_size {};
                     58:        // 下位側を取り出すためのマスク。64KB/クラスタなら 0xffff になる。
                     59:        uint64 cluster_mask {};
                     60: 
                     61:        // L1/L2 インデックスを分けるためのビット数とマスク。
                     62:        uint32 L2_entries_bits {};
                     63:        uint64 L2_entries_mask {};
                     64: 
                     65:        uint   compress_offset_bits {};
                     66:        uint64 compress_sector_mask {};
                     67: 
                     68:        // L1 テーブルは常にメモリに全コピーを持つ。
                     69:        std::vector<uint64> L1_table {};
                     70:        // L2 テーブルは現在参照中の1つのキャッシュを持つ。
                     71:        std::vector<uint64> L2_table {};
                     72: 
                     73:        // 現在 L2_table[] でキャッシュしている箇所の L1 index。
                     74:        // L1_table[0] の L2 をキャッシュしていれば $0。
                     75:        // (uint64)-1 ならキャッシュなし。
                     76:        uint64 cached_L1_index {};
                     77: 
                     78:        // データクラスタのキャッシュ。
                     79:        std::vector<uint8> data_cluster {};
                     80: 
                     81:        // 現在 data_cluster[] でキャッシュしている箇所のデータクラスタ番号。
                     82:        // ゲストイメージの先頭クラスタなら $0。
                     83:        // (uint64)-1 ならキャッシュなし。
                     84:        uint64 cached_data_index {};
                     85: 
                     86:        // refblock (2段目) の1クラスタ内の要素数。標準では 32768。
                     87:        uint32 refblock_capacity {};
                     88:        // refblock_capacity のビット数。標準では 15 になる。
                     89:        uint32 refblock_bits {};
                     90:        // refblock (2段目) の下位を取り出すマスク。標準では 0x7fff になる。
                     91:        uint64 refblock_mask {};
                     92: 
                     93:        // refcount はイメージ上は 1,2,4,8,16,32,64 ビットの可能性がある
                     94:        // (ただし通常は 16 ビットしかないと思われる)。
                     95:        // オンメモリでは bool で扱い、空き(refcount==0)なら true に反転して
                     96:        // 保持する (count trailing zero で空きを探すため)。
                     97:        // 読み込みはオープン時に行い、書き込みはライトスルーキャッシュ方式。
                     98:        VectorBool64 freemap {};
                     99: 
                    100:        std::vector<uint64> refcount_block_offset {};
                    101: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.