簡體   English   中英

mmap文件以及該文件未支持的另一頁

[英]mmap file with one additional page that is not backed by the file

我需要以只讀模式映射文件,但需要在映射末尾添加\\ 0-ed的附加頁面。 我最初的想法是映射另外的頁面並通過寫來聲明它。

int file=::open(name,O_RDONLY);
size_t size=lseek(file,0,SEEK_END);
size_t pageSize=::sysconf( _SC_PAGESIZE);
int padding=size%pageSize;
size_t mapSize=size+padding+pageSize;
void* mapping=mmap(0,mapSize,PROT_READ|PROT_WRITE,MAP_PRIVATE,file,0);
*(static_cast<char*>(mapping)+size+padding+1)=0;

但是,如mmap文檔中所述,當我寫入附加頁面時(以及從該頁面讀取時),我都會得到一個SIGBUS。

我的問題是,我可以在不修改實際文件的情況下以某種方式在文件后聲明一個附加頁面嗎?

Linux支持MAP_FIXED標志,該標志強制執行mmap()段放置,因此,您所需mmap()就是正確計算將映射匿名頁面的地址調用第二個mmap() (當前,您的padding計算不正確)。

int file = ::open("mmap", O_RDONLY);
size_t size = ::lseek(file, 0, SEEK_END);
size_t pageSize = ::sysconf(_SC_PAGESIZE);

int padding = pageSize - size % pageSize;
size_t mapSize = size + padding;

void* mapping = ::mmap(0, mapSize, PROT_READ | PROT_WRITE, 
                     MAP_PRIVATE, file, 0);
void* lastPage = static_cast<char*>(mapping) + mapSize;

void* mapping2 = ::mmap(lastPage, pageSize, PROT_READ | PROT_WRITE, 
                        MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);

* static_cast<char*>(mapping ) = 1;
* static_cast<char*>(mapping2) = 1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM