linux c的記憶體映像

2021-08-01 00:01:36 字數 2708 閱讀 8311

**:

記憶體映像其實就是在記憶體中建立乙個和外存檔案完全相同的映像。使用者可以將整個檔案對映到記憶體中也可以部分對映到記憶體。系統會將對記憶體映像的改動如實的反映到外存檔案中。從而實現了通過記憶體映像對外存檔案的操作。

記憶體映像的特點:

1、 可以加快對io的操作速度。

2、 使用者可以通過指針對檔案進行操作,間接~~~

3、 實現了檔案資料的共享,將外存檔案對映到共享記憶體中,很方便的實現了資料共享,並能完成把資料儲存到外存的工作。

注:記憶體映像只能對內部可以定位的檔案進行操作,如普通檔案。不能對管道,套接字檔案進行操作。

建立記憶體對映:

[cpp]view plain

copy

print?

#include

#include

void

*mmap(

void

*start,

size_t

length,intport,

intflag,

intfd,off_t offset)

[cpp]view plain

copy

print?

#include

#include

void

*mmap(

void

*start,

size_t

length,intport,

intflag,

intfd,off_t offset)  

start為指標通常設為null,表示對映記憶體有系統決定。因為指定記憶體會經常出錯。

length為記憶體映像占用的記憶體空間大小。以位元組為單位。

port表示記憶體映像的安全性。

prot_exec表示被映像記憶體可能有機器碼,可執行。

port_none表示被映像記憶體不能被訪問。

port_read表示被映像記憶體可讀

port_write表示被映像記憶體可寫

flag記憶體映像標誌:

map_fixed表示如果無法從start位址建立記憶體映像,則出錯返回。

map_private表示對記憶體映像進行的改動不反映到外存檔案中。

map_shared表示對記憶體映像進行的改動反映到外存檔案中。

fd檔案描述符

offset表示所映像的內容距檔案頭的距離。

撤銷記憶體對映:

[cpp]view plain

copy

print?

#include

#include

intmunmap(

void

*start,

size_t

length);

[cpp]view plain

copy

print?

#include

#include

intmunmap(

void

*start,

size_t

length);  

改變記憶體屬性:

修改保護值:

[cpp]view plain

copy

print?

intprotect(

const

void

*addr,size_tlength,

intprot);

[cpp]view plain

copy

print?

intprotect(

const

void

*addr,size_tlength,

intprot);  

addr表示位址和上面相同。

length記憶體映像大小同上。

prot重新設定的保護值。

成功返回0失敗返回-1

修改記憶體映象大小:

[cpp]view plain

copy

print?

void

*mremap(

void

*old_addr,size_told_length,

size_t

new_length,unsigned 

long

*flag)

[cpp]view plain

copy

print?

void

*mremap(

void

*old_addr,size_told_length,

size_t

new_length,unsigned 

long

*flag)  

***用於設定是否在需要移動記憶體映象時移動該映象。如:mrmap_maymove

呼叫成功返回新的起始位址,失敗返回-1

程式如下:

[cpp]view plain

copy

print?

#include

#include

#include

#include

#include

#include

intmain()

程式的記憶體映像

一 程式的記憶體映像 乙個由c c 編譯的程式的記憶體分布分為以下幾個部分 1 棧 stack 也是我們所說的堆疊,是由編譯器自動分配釋放,用來存放函式引數值,函式的返回位址,非靜態區域性變數的值等。其操作方式類似於資料結構中的棧 後進先出 lifo 2 堆 heep 一般由程式設計師分配釋放,若程...

程式的記憶體映像

這幾天在看c語言的書籍,對c的記憶體映像有點疑惑,於是,查詢資料,查閱了龐麗萍編著的 作業系統原理 第四版中的第七章主存管理中的段式系統,此外還看了王元珍 曹忠生 韓忠芬編著的 80x86組合語言程式設計 得到了乙個自己對在80x86結構下的記憶體對映的理解。不過也許自己的理解是錯的或者有不到之處,...

c 的記憶體映像

先來看乙個問題 類的空指標能不能呼叫類的成員函式呢?class a a void func 1 為什麼會有這種情況呢接下來我們看看c 的物件記憶體映像 下圖是a的物件的記憶體布局 a這種基本的c 物件模型有下述幾個規則 因此,構成物件本身的只有資料,任何成員函式都不隸屬於任何乙個物件,非靜態成員函式...