RAMBlock之file_ram_alloc

在linux下,分配RAMBlock時可以將內存塊映射到文件中,詳細內容可見file_ram_alloc函數,下面是該函數的主要部分:


static void *file_ram_alloc(RAMBlock *block,
                            ram_addr_t memory,
                            const char *path)
{
    char *filename;
    void *area;
    int fd;
    unsigned long hpagesize;

    hpagesize = gethugepagesize(path);

    if (asprintf(&filename, "%s/qemu_back_mem.XXXXXX", path) == -1) {
        return NULL;
    }
/*由於mkstemp函數創建的臨時文件不能自動刪除,所以執行完mkstemp函數後要調用unlink函數,unlink函數刪除文件的目錄入口,但臨時文件還可以通過文件描述符進行訪問,直到最後一個打開的進程關閉文件操作符,或者程序退出後臨時文件被自動徹底地刪除。*/
    fd = mkstemp(filename);
    unlink(filename);
    free(filename);

    memory = (memory+hpagesize-1) & ~(hpagesize-1);

    if (ftruncate(fd, memory))
        perror("ftruncate");
//mmap將一個文件或者其它對象映射進內存,MAP_PRIVATE表示建立一個寫入時拷貝的私有映射。內存區域的寫入不會影響到原文件。
    area = mmap(0, memory, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
    block->fd = fd;
    return area;

}

//查詢文件系統相關的信息 返回系統經過優化的傳輸塊大小

static long gethugepagesize(const char *path)
{
    struct statfs fs;
    int ret;

    do {
        ret = statfs(path, &fs);
    } while (ret != 0 && errno == EINTR);

    if (ret != 0) {
        perror(path);
        return 0;
    }

    if (fs.f_type != HUGETLBFS_MAGIC)
        fprintf(stderr, "Warning: path not on HugeTLBFS: %s\n", path);

    return fs.f_bsize;
}


發佈了44 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章