0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文詳細(xì)了解mmap內(nèi)存映射

xCb1_yikoulinux ? 來(lái)源:一口Linux ? 作者:一口Linux ? 2022-05-05 15:32 ? 次閱讀

mmap基礎(chǔ)概念

mmap是一種內(nèi)存映射的方法,這一功能可以用在文件的處理上,即將一個(gè)文件或者其它對(duì)象映射到進(jìn)程的地址空間,實(shí)現(xiàn)文件磁盤(pán)地址和進(jìn)程虛擬地址空間中一段虛擬地址的一一對(duì)映關(guān)系。在編程時(shí)可以使某個(gè)磁盤(pán)文件的內(nèi)容看起來(lái)像是內(nèi)存中的一個(gè)數(shù)組。如果文件由記錄組成,而這些記錄又能夠用結(jié)構(gòu)體來(lái)描述的話,可以通過(guò)訪問(wèn)結(jié)構(gòu)體來(lái)更新文件的內(nèi)容。

實(shí)現(xiàn)這樣的映射關(guān)系后,進(jìn)程就可以采用指針的方式讀寫(xiě)操作這一段內(nèi)存,而系統(tǒng)會(huì)自動(dòng)回寫(xiě)到頁(yè)面到對(duì)應(yīng)的文件磁盤(pán)上,即完成了對(duì)文件的操作而不必再調(diào)用read,write等系統(tǒng)調(diào)用函數(shù)。內(nèi)核空間對(duì)這段區(qū)域的修改也直接反映用戶(hù)空間,從而可以實(shí)現(xiàn)不同進(jìn)程間的文件共享。如圖所示:

09d572bc-cb60-11ec-bce3-dac502259ad0.jpg

進(jìn)程的虛擬地址空間,由多個(gè)虛擬內(nèi)存區(qū)域構(gòu)成。虛擬內(nèi)存區(qū)域是進(jìn)程的虛擬地址空間中的一個(gè)同質(zhì)區(qū)間,即具有同樣特性的連續(xù)地址范圍。上圖中所示的text數(shù)據(jù)段(代碼段)、初始數(shù)據(jù)段、BSS數(shù)據(jù)段、堆、棧和內(nèi)存映射,都是一個(gè)獨(dú)立的虛擬內(nèi)存區(qū)域。而為內(nèi)存映射服務(wù)的地址空間處在堆棧之間的空余部分。

內(nèi)核為系統(tǒng)中的每個(gè)進(jìn)程維護(hù)一個(gè)單獨(dú)的任務(wù)結(jié)構(gòu)(task_struct)。任務(wù)結(jié)構(gòu)中的元素包含或者指向內(nèi)核運(yùn)行該進(jìn)程所需的所有信息(PID、指向用戶(hù)棧的指針、可執(zhí)行目標(biāo)文件的名字、程序計(jì)數(shù)器等)。Linux內(nèi)核使用vm_area_struct結(jié)構(gòu)來(lái)表示一個(gè)獨(dú)立的虛擬內(nèi)存區(qū)域,由于每個(gè)不同質(zhì)的虛擬內(nèi)存區(qū)域功能和內(nèi)部機(jī)制都不同,因此一個(gè)進(jìn)程使用多個(gè)vm_area_struct結(jié)構(gòu)來(lái)分別表示不同類(lèi)型的虛擬內(nèi)存區(qū)域。各個(gè)vm_area_struct結(jié)構(gòu)使用鏈表或者樹(shù)形結(jié)構(gòu)鏈接,方便進(jìn)程快速訪問(wèn),如下圖所示:

09f4e8e0-cb60-11ec-bce3-dac502259ad0.jpg

vm_area_struct結(jié)構(gòu)中包含區(qū)域起始和終止地址以及其他相關(guān)信息,同時(shí)也包含一個(gè)vm_ops指針,其內(nèi)部可引出所有針對(duì)這個(gè)區(qū)域可以使用的系統(tǒng)調(diào)用函數(shù)。這樣,進(jìn)程對(duì)某一虛擬內(nèi)存區(qū)域的任何操作需要用要的信息,都可以從vm_area_struct中獲得。mmap函數(shù)就是要?jiǎng)?chuàng)建一個(gè)新的vm_area_struct結(jié)構(gòu),并將其與文件的物理磁盤(pán)地址相連。

mm_struct:描述了虛擬內(nèi)存的當(dāng)前狀態(tài)。pgd指向一級(jí)頁(yè)表的基址(當(dāng)內(nèi)核運(yùn)行這個(gè)進(jìn)程時(shí),
pgd會(huì)被存放在CR3控制寄存器,也就是頁(yè)表基址寄存器中),mmap指向一個(gè)vm_area_structs
的鏈表,其中每個(gè)vm_area_structs都描述了當(dāng)前虛擬地址空間的一個(gè)區(qū)域。
vm_starts    指向這個(gè)區(qū)域的起始處。
vm_end       指向這個(gè)區(qū)域的結(jié)束處。
vm_prot      描述這個(gè)區(qū)域內(nèi)包含的所有頁(yè)的讀寫(xiě)許可權(quán)限。
vm_flags     描述這個(gè)區(qū)域內(nèi)的頁(yè)面是與其他進(jìn)程共享的,還是這個(gè)進(jìn)程私有的以及一些其他信息。
vm_next      指向鏈表的下一個(gè)區(qū)域結(jié)構(gòu)。

mmap內(nèi)存映射原理

mmap內(nèi)存映射的實(shí)現(xiàn)過(guò)程,總的來(lái)說(shuō)可以分為三個(gè)階段:

(一)啟動(dòng)映射過(guò)程,并在虛擬地址空間中為映射創(chuàng)建虛擬映射區(qū)域

1. 進(jìn)程在用戶(hù)空間調(diào)用庫(kù)函數(shù)mmap,原型:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

2. 在當(dāng)前進(jìn)程的虛擬地址空間中,尋找一段空閑的滿足要求的連續(xù)的虛擬地址。

3. 為此虛擬區(qū)分配一個(gè)vm_area_struct結(jié)構(gòu),接著對(duì)這個(gè)結(jié)構(gòu)的各個(gè)域進(jìn)行了初始化。

4. 將新建的虛擬區(qū)結(jié)構(gòu)(vm_area_struct)插入進(jìn)程的虛擬地址區(qū)域鏈表或樹(shù)中。

(二)調(diào)用內(nèi)核空間的系統(tǒng)調(diào)用函數(shù)mmap(不同于用戶(hù)空間函數(shù)),實(shí)現(xiàn)文件物理地址和進(jìn)程虛擬地址的一一映射關(guān)系

5. 為映射分配了新的虛擬地址區(qū)域后,通過(guò)待映射的文件指針,在文件描述符表中找到對(duì)應(yīng)的文件描述符,通過(guò)文件描述符,鏈接到內(nèi)核“已打開(kāi)文件集”中該文件的文件結(jié)構(gòu)體(struct file),每個(gè)文件結(jié)構(gòu)體維護(hù)者和這個(gè)已打開(kāi)文件相關(guān)的各項(xiàng)信息。

6. 通過(guò)該文件的文件結(jié)構(gòu)體,鏈接到file_operations模塊,調(diào)用內(nèi)核函數(shù)mmap,其原型為:int mmap(struct file *filp, struct vm_area_struct *vma),不同于用戶(hù)空間庫(kù)函數(shù)。

7. 內(nèi)核mmap函數(shù)通過(guò)虛擬文件系統(tǒng)inode模塊定位到文件磁盤(pán)物理地址。

8. 通過(guò)remap_pfn_range函數(shù)建立頁(yè)表,即實(shí)現(xiàn)了文件地址和虛擬地址區(qū)域的映射關(guān)系。此時(shí),這片虛擬地址并沒(méi)有任何數(shù)據(jù)關(guān)聯(lián)到主存中。

(三)進(jìn)程發(fā)起對(duì)這片映射空間的訪問(wèn),引發(fā)缺頁(yè)異常,實(shí)現(xiàn)文件內(nèi)容到物理內(nèi)存(主存)的拷貝

注:前兩個(gè)階段僅在于創(chuàng)建虛擬區(qū)間并完成地址映射,但是并沒(méi)有將任何文件數(shù)據(jù)的拷貝至主存。真正的文件讀取是當(dāng)進(jìn)程發(fā)起讀寫(xiě)操作時(shí)。

9. 進(jìn)程的讀或?qū)懖僮髟L問(wèn)虛擬地址空間這一段映射地址,通過(guò)查詢(xún)頁(yè)表,發(fā)現(xiàn)這一段地址并不在物理頁(yè)面上。因?yàn)槟壳爸唤⒘说刂酚成?,真正的硬盤(pán)數(shù)據(jù)還沒(méi)有拷貝到內(nèi)存中,因此引發(fā)缺頁(yè)異常。

10. 缺頁(yè)異常進(jìn)行一系列判斷,確定無(wú)非法操作后,內(nèi)核發(fā)起請(qǐng)求調(diào)頁(yè)過(guò)程。

11. 調(diào)頁(yè)過(guò)程先在交換緩存空間(swap cache)中尋找需要訪問(wèn)的內(nèi)存頁(yè),如果沒(méi)有則調(diào)用nopage函數(shù)把所缺的頁(yè)從磁盤(pán)裝入到主存中。

12. 之后進(jìn)程即可對(duì)這片主存進(jìn)行讀或者寫(xiě)的操作,如果寫(xiě)操作改變了其內(nèi)容,一定時(shí)間后系統(tǒng)會(huì)自動(dòng)回寫(xiě)臟頁(yè)面到對(duì)應(yīng)磁盤(pán)地址,也即完成了寫(xiě)入到文件的過(guò)程。

注意:修改過(guò)的臟頁(yè)面并不會(huì)立即更新回文件中,而是有一段時(shí)間的延遲,可以調(diào)用msync()來(lái)強(qiáng)制同步, 這樣所寫(xiě)的內(nèi)容就能立即保存到文件里了。

mmap 示例代碼

mmap (內(nèi)存映射)函數(shù)的作用是建立一段可以被兩個(gè)或更多個(gè)程序讀寫(xiě)的內(nèi)存。一個(gè)程序?qū)λ龀龅男薷目梢员黄渌绦蚩匆?jiàn)。這要通過(guò)使用帶有特殊權(quán)限集的虛擬內(nèi)存段來(lái)實(shí)現(xiàn)。對(duì)這類(lèi)虛擬內(nèi)存段的讀寫(xiě)會(huì)使操作系統(tǒng)去讀寫(xiě)磁盤(pán)文件中與之對(duì)應(yīng)的部分。mmap 函數(shù)創(chuàng)建一個(gè)指向一段內(nèi)存區(qū)域的指針,該內(nèi)存區(qū)域與可以通過(guò)一個(gè)打開(kāi)的文件描述符訪問(wèn)的文件的內(nèi)容相關(guān)聯(lián)。mmap 函數(shù)原型如下:

#include 
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

可以通過(guò)傳遞 off 參數(shù)來(lái)改變共享內(nèi)存段訪問(wèn)的文件中數(shù)據(jù)的起始偏移值。打開(kāi)的文件描述符由 fildes 參數(shù)給出??梢栽L問(wèn)的數(shù)據(jù)量(即內(nèi)存段的長(zhǎng)度)由 len 參數(shù)設(shè)置。

可以通過(guò) addr 參數(shù)來(lái)請(qǐng)求使用某個(gè)特定的內(nèi)存地址。如果它的取值是零,結(jié)果指針就將自動(dòng)分配。這是推薦的做法,否則會(huì)降低程序的可移植性,因?yàn)椴煌到y(tǒng)上的可用地址范圍是不一樣的。

prot 參數(shù)用于設(shè)置內(nèi)存段的訪問(wèn)權(quán)限。它是下列常數(shù)值的按位或的結(jié)果:

PROT_READ       內(nèi)存段可讀。
PROT_WRITE      內(nèi)存段可寫(xiě)。
PROT_EXEC       內(nèi)存段可執(zhí)行。
PROT_NONE       內(nèi)存段不能被訪問(wèn)。

flags 參數(shù)控制程序?qū)υ搩?nèi)存段的改變所造成的影響:

0a0b46d0-cb60-11ec-bce3-dac502259ad0.jpg

msync 函數(shù)的作用是:把在該內(nèi)存段的某個(gè)部分或整段中的修改寫(xiě)回到被映射的文件中(或者從被映射文件里讀出)。

#include 
int msync(void *addr, size_t len, int flags);

內(nèi)存段需要修改的部分由作為參數(shù)傳遞過(guò)來(lái)的起始地址 addr 和長(zhǎng)度 len 確定。flags 參數(shù)控制著執(zhí)行修改的具體方式,可以使用的選項(xiàng)如下:

MS_ASYNC                    采用異步寫(xiě)方式
MS_SYNC                     采用同步寫(xiě)方式
MS_INVALIDATE               從文件中讀回?cái)?shù)據(jù)

munmap 函數(shù)的作用是釋放內(nèi)存段:

#include 
int munmap(void *addr, size_t length);

示例代碼:

(1) 定義一個(gè) RECORD 數(shù)據(jù)結(jié)構(gòu),然后創(chuàng)建出 NRECORDS 每個(gè)記錄,每個(gè)記錄中保存著它們各自的編號(hào)。然后把這些記錄都追加到文件 records.dat 里去。

(2) 接著,把第 43 記錄中的整數(shù)值由 43 修改為 143,并把它寫(xiě)入第 43 條記錄中的字符串。

(3) 把這些記錄映射到內(nèi)存中,然后訪問(wèn)第 43 條記錄,把它的整數(shù)值修改為 243 (同時(shí)更新該記錄中的字符串),使用的還是內(nèi)存映射的方法。

可以將上述 (2) (3) 分別編寫(xiě)程序驗(yàn)證結(jié)果。

#include 
#include 
#include 
#include 
#include 
typedef struct{
 int integer;
 char string[24];
}RECORD;
#define NRECORDS (100)
int main()
{
RECORD record, *mapped;
 int i, f;
FILE *fp;
fp = fopen("records.dat", "w+");
 for( i = 0; i < NRECORDS; i++)
{
record.integer = i;
 sprintf(record.string, "[RECORD-%d]", i);
 fwrite(&record, sizeof(record), 1, fp);
}
 fclose(fp);
fp = fopen("records.dat", "r+");
 fseek(fp, 43 * sizeof(record), SEEK_SET);
 fread(&record, sizeof(record), 1, fp);
record.integer = 143;
 sprintf(record.string, "[RECORD-%d]", record.integer);
 fseek(fp, 43 * sizeof(record), SEEK_SET);
 fwrite(&record, sizeof(record), 1, fp);
 fclose(fp);
f = open("records.dat", O_RDWR);
mapped = (RECORD*)mmap(0, NRECORDS * sizeof(record), 
                        PROT_READ | PROT_WRITE, MAP_SHARED, f, 0);
 printf("f:[%d]
", f);
 //open是系統(tǒng)調(diào)用,返回文件描述符。fopen是庫(kù)函數(shù),返回指針。
mapped[43].integer = 243;
 sprintf(mapped[43].string, "[RECORD-%d]", mapped[43].integer);
 msync((void *) mapped, NRECORDS * sizeof(record), MS_ASYNC);
 munmap((void *)mapped, NRECORDS * sizeof(record));
 close(f);
 return 0;
}

mmap 和常規(guī)文件操作的區(qū)別

使用系統(tǒng)調(diào)用,函數(shù)的調(diào)用過(guò)程:

1. 進(jìn)程發(fā)起讀文件請(qǐng)求。

2. 內(nèi)核通過(guò)查找進(jìn)程文件描述符表,定位到內(nèi)核已打開(kāi)文件集上的文件信息,從而找到此文件的inode。

3. inode在address_space上查找要請(qǐng)求的文件頁(yè)是否已經(jīng)緩存在頁(yè)緩存中。如果存在,則直接返回這片文件頁(yè)的內(nèi)容。

4. 如果不存在,則通過(guò)inode定位到文件磁盤(pán)地址,將數(shù)據(jù)從磁盤(pán)復(fù)制到頁(yè)緩存。之后再次發(fā)起讀頁(yè)面過(guò)程,進(jìn)而將頁(yè)緩存中的數(shù)據(jù)發(fā)給用戶(hù)進(jìn)程。

總結(jié)來(lái)說(shuō),常規(guī)文件操作為了提高讀寫(xiě)效率和保護(hù)磁盤(pán),使用了頁(yè)緩存機(jī)制。這樣造成讀文件時(shí)需要先將文件頁(yè)從磁盤(pán)拷貝到頁(yè)緩存中,由于頁(yè)緩存處在內(nèi)核空間,不能被用戶(hù)進(jìn)程直接尋址,所以還需要將頁(yè)緩存中數(shù)據(jù)頁(yè)再次拷貝到內(nèi)存對(duì)應(yīng)的用戶(hù)空間中。這樣,通過(guò)了兩次數(shù)據(jù)拷貝過(guò)程,才能完成進(jìn)程對(duì)文件內(nèi)容的獲取任務(wù)。寫(xiě)操作也是一樣,待寫(xiě)入的buffer在內(nèi)核空間不能直接訪問(wèn),必須要先拷貝至內(nèi)核空間對(duì)應(yīng)的主存,再寫(xiě)回磁盤(pán)中(延遲寫(xiě)回),也是需要兩次數(shù)據(jù)拷貝。

而使用mmap操作文件中,創(chuàng)建新的虛擬內(nèi)存區(qū)域和建立文件磁盤(pán)地址和虛擬內(nèi)存區(qū)域映射這兩步,沒(méi)有任何文件拷貝操作。而之后訪問(wèn)數(shù)據(jù)時(shí)發(fā)現(xiàn)內(nèi)存中并無(wú)數(shù)據(jù)而發(fā)起的缺頁(yè)異常過(guò)程,可以通過(guò)已經(jīng)建立好的映射關(guān)系,只使用一次數(shù)據(jù)拷貝,就從磁盤(pán)中將數(shù)據(jù)傳入內(nèi)存的用戶(hù)空間中,供進(jìn)程使用。

總而言之,常規(guī)文件操作需要從磁盤(pán)到頁(yè)緩存再到用戶(hù)主存的兩次數(shù)據(jù)拷貝。而mmap操控文件,只需要從磁盤(pán)到用戶(hù)主存的一次數(shù)據(jù)拷貝過(guò)程。說(shuō)白了,mmap的關(guān)鍵點(diǎn)是實(shí)現(xiàn)了用戶(hù)空間和內(nèi)核空間的數(shù)據(jù)直接交互而省去了空間不同、數(shù)據(jù)不通的繁瑣過(guò)程。因此mmap效率更高。

由上文討論可知,mmap優(yōu)點(diǎn)共有一下幾點(diǎn):

1. 對(duì)文件的讀取操作跨過(guò)了頁(yè)緩存,減少了數(shù)據(jù)的拷貝次數(shù),用內(nèi)存讀寫(xiě)取代I/O讀寫(xiě),提高了文件讀取效率。

2. 實(shí)現(xiàn)了用戶(hù)空間和內(nèi)核空間的高效交互方式。兩空間的各自修改操作可以直接反映在映射的區(qū)域內(nèi),從而被對(duì)方空間及時(shí)捕捉。

3. 提供進(jìn)程間共享內(nèi)存及相互通信的方式。不管是父子進(jìn)程還是無(wú)親緣關(guān)系的進(jìn)程,都可以將自身用戶(hù)空間映射到同一個(gè)文件或匿名映射到同一片區(qū)域。從而通過(guò)各自對(duì)映射區(qū)域的改動(dòng),達(dá)到進(jìn)程間通信和進(jìn)程間共享的目的。

同時(shí),如果進(jìn)程A和進(jìn)程B都映射了區(qū)域C,當(dāng)A第一次讀取C時(shí)通過(guò)缺頁(yè)從磁盤(pán)復(fù)制文件頁(yè)到內(nèi)存中;但當(dāng)B再讀C的相同頁(yè)面時(shí),雖然也會(huì)產(chǎn)生缺頁(yè)異常,但是不再需要從磁盤(pán)中復(fù)制文件過(guò)來(lái),而可直接使用已經(jīng)保存在內(nèi)存中的文件數(shù)據(jù)。

4. 可用于實(shí)現(xiàn)高效的大規(guī)模數(shù)據(jù)傳輸。內(nèi)存空間不足,是制約大數(shù)據(jù)操作的一個(gè)方面,解決方案往往是借助硬盤(pán)空間協(xié)助操作,補(bǔ)充內(nèi)存的不足。但是進(jìn)一步會(huì)造成大量的文件I/O操作,極大影響效率。這個(gè)問(wèn)題可以通過(guò)mmap映射很好的解決。換句話說(shuō),但凡是需要用磁盤(pán)空間代替內(nèi)存的時(shí)候,mmap都可以發(fā)揮其功效。

mmap 使用的細(xì)節(jié)

1. 使用mmap需要注意的一個(gè)關(guān)鍵點(diǎn)是,mmap映射區(qū)域大小必須是物理頁(yè)大小(page_size)的整倍數(shù)(32位系統(tǒng)中通常是4k字節(jié))。原因是,內(nèi)存的最小粒度是頁(yè),而進(jìn)程虛擬地址空間和內(nèi)存的映射也是以頁(yè)為單位。為了匹配內(nèi)存的操作,mmap從磁盤(pán)到虛擬地址空間的映射也必須是頁(yè)。

2. 內(nèi)核可以跟蹤被內(nèi)存映射的底層對(duì)象(文件)的大小,進(jìn)程可以合法的訪問(wèn)在當(dāng)前文件大小以?xún)?nèi)又在內(nèi)存映射區(qū)以?xún)?nèi)的那些字節(jié)。也就是說(shuō),如果文件的大小一直在擴(kuò)張,只要在映射區(qū)域范圍內(nèi)的數(shù)據(jù),進(jìn)程都可以合法得到,這和映射建立時(shí)文件的大小無(wú)關(guān)。

3. 映射建立之后,即使文件關(guān)閉,映射依然存在。因?yàn)橛成涞氖谴疟P(pán)的地址,不是文件本身,和文件句柄無(wú)關(guān)。同時(shí)可用于進(jìn)程間通信的有效地址空間不完全受限于被映射文件的大小,因?yàn)槭前错?yè)映射。

作者:極致Linux

原文標(biāo)題:都22年了,還有人不懂mmap內(nèi)存映射詳解?收藏保留

文章出處:【微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 原理
    +關(guān)注

    關(guān)注

    4

    文章

    550

    瀏覽量

    44853
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4723

    瀏覽量

    68237
  • 內(nèi)存映射
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    7410

原文標(biāo)題:都22年了,還有人不懂mmap內(nèi)存映射詳解?收藏保留

文章出處:【微信號(hào):yikoulinux,微信公眾號(hào):一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    拆解mmap內(nèi)存映射的本質(zhì)!

    mmap 內(nèi)存映射里所謂的內(nèi)存其實(shí)指的是虛擬內(nèi)存,在調(diào)用 mmap 進(jìn)行匿名
    的頭像 發(fā)表于 01-24 14:30 ?1374次閱讀
    拆解<b class='flag-5'>mmap</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>映射</b>的本質(zhì)!

    Linux的mmap文件內(nèi)存映射機(jī)制

    Linux的mmap文件內(nèi)存映射機(jī)制在講述文件映射的概念時(shí), 不可避免的要牽涉到虛存(SVR 4的VM). 實(shí)際上, 文件映射是虛存的中心概
    發(fā)表于 03-08 09:54

    dma_alloc_coherent申請(qǐng)內(nèi)存的訪問(wèn)速度,請(qǐng)問(wèn)有什么辦法能加快訪問(wèn)mmap的DMA內(nèi)存?

    使用dma_alloc_coherent申請(qǐng)了內(nèi)存,然后使用mmap映射到用戶(hù)空間。然后,我用千兆網(wǎng)卡(CPSW驅(qū)動(dòng))進(jìn)行發(fā)送(UDP方式),測(cè)量到的速度僅有12.5MB/s。 我
    發(fā)表于 06-04 07:47

    mmap()函數(shù)映射內(nèi)存中出現(xiàn)bus error的錯(cuò)誤

    在2440開(kāi)發(fā)板上將副BMP圖片顯示到LCD上(不用GUI),我的做法是將BMP圖片用mmap()函數(shù)映射內(nèi)存中,在將其讀到Framebuffer設(shè)備中顯示(frambuffer有
    發(fā)表于 02-25 12:42

    詳細(xì)了解下ups的相關(guān)計(jì)算

    關(guān)于ups方面的計(jì)算有很多,ups無(wú)論是接空開(kāi),還是連接電纜,以及選擇電池,都可能需要計(jì)算它的電流或功率等,那么今天我們來(lái)詳細(xì)了解下ups的相關(guān)計(jì)算。、UPS電源及電流、高頻ups與工頻ups
    發(fā)表于 11-16 09:08

    詳細(xì)了解下STM32F1的具體電路參數(shù)

    最近筆者在使用STM32時(shí),需要詳細(xì)了解下F1的具體電路參數(shù)。于是查看其官方數(shù)據(jù)手冊(cè),結(jié)果記錄如下。絕對(duì)最大額度值般工作條件表中的FT指5V 耐壓。可以在引腳定義表格中看到。I/O端口特性(邏輯電平)在最后
    發(fā)表于 01-18 07:07

    在arm里怎樣實(shí)現(xiàn)mmap編寫(xiě)驅(qū)動(dòng)和應(yīng)用共享內(nèi)存

    ② 確定屬性:是否使用 cache、buffer③ 建立映射關(guān)系在file_operation里面建立mmap進(jìn)行mmap的函數(shù)編寫(xiě)這樣在驅(qū)動(dòng)程序的內(nèi)存空間就被建立了
    發(fā)表于 05-17 09:59

    mmap作為L(zhǎng)inux內(nèi)存管理的關(guān)鍵之

    mmap個(gè)文件或者其它對(duì)象映射進(jìn)內(nèi)存。文件被映射到多個(gè)頁(yè)上,如果文件的大小不是所有頁(yè)的大小之和,最后
    發(fā)表于 04-28 17:16 ?598次閱讀
    <b class='flag-5'>mmap</b>作為L(zhǎng)inux<b class='flag-5'>內(nèi)存</b>管理的關(guān)鍵之<b class='flag-5'>一</b>

    linux drivers中的mmap實(shí)現(xiàn)

    將設(shè)備驅(qū)動(dòng)內(nèi)核空間的內(nèi)存映射到用戶(hù)空間里,可以通過(guò)用戶(hù)空間中的mmap系統(tǒng)調(diào)用代替系統(tǒng)調(diào)用write和read。目的是提高讀寫(xiě)效率。
    發(fā)表于 05-15 10:31 ?1587次閱讀

    Linux的mmap文件內(nèi)存映射機(jī)制

    VM_LOCKED(映射區(qū)不被換出)方式映射, 則發(fā)出缺頁(yè)請(qǐng)求, 把映射頁(yè)面讀入內(nèi)存中.  munmap(void * start, size_t length):  該調(diào)用可以看作是
    發(fā)表于 04-02 14:35 ?420次閱讀

    詳細(xì)了解實(shí)時(shí)反射內(nèi)存網(wǎng)絡(luò)

    實(shí)時(shí)反射內(nèi)存網(wǎng)絡(luò)是種為使多個(gè)獨(dú)立的計(jì)算機(jī)進(jìn)行數(shù)據(jù)共享而特別設(shè)計(jì)的共享內(nèi)存系統(tǒng)。實(shí)時(shí)反射內(nèi)存網(wǎng)絡(luò)在系統(tǒng)中的每個(gè)節(jié)點(diǎn)放置個(gè)共享
    的頭像 發(fā)表于 04-02 12:38 ?4409次閱讀

    詳細(xì)了解OpenHarmony新圖形框架

    3月30日,OpenHarmony v3.1 Release版本正式發(fā)布了。此版本為大家?guī)?lái)了全新的圖形框架,實(shí)現(xiàn)了UI框架顯示、多窗口、流暢動(dòng)畫(huà)等基礎(chǔ)能力,夯實(shí)了OpenHarmony系統(tǒng)能力基座。下面就帶大家詳細(xì)了解新圖形框架。
    的頭像 發(fā)表于 04-27 13:21 ?2091次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳細(xì)了解</b>OpenHarmony新圖形框架

    mmap原理詳解

    句話概括mmap mmap的作用,在應(yīng)用這層,是讓你把文件的某段,當(dāng)作內(nèi)存
    的頭像 發(fā)表于 11-09 14:59 ?650次閱讀
    <b class='flag-5'>mmap</b>原理詳解

    帶您詳細(xì)了解IEEE802.3bt(PoE++)的有關(guān)特點(diǎn)

    Hqst華強(qiáng)盛(盈盛電子)導(dǎo)讀:帶您詳細(xì)了解IEEE802.3bt(PoE++)的有關(guān)特點(diǎn),讓我們對(duì)IEEE802.3bt(PoE++)協(xié)議有更具體的了解
    的頭像 發(fā)表于 01-04 11:26 ?1907次閱讀
    帶您<b class='flag-5'>一</b>起<b class='flag-5'>詳細(xì)了解</b>IEEE802.3bt(PoE++)的有關(guān)特點(diǎn)

    帶你詳細(xì)了解工業(yè)電腦

    扇設(shè)計(jì)、承受振動(dòng)和惡劣環(huán)境的能力、輕松配置、全面的I/O選項(xiàng)、延長(zhǎng)生命周期、耐用的組件。了解如何為您的應(yīng)用選擇工業(yè)電腦對(duì)提高設(shè)施的生產(chǎn)力和效率至關(guān)重要。詳細(xì)了解
    的頭像 發(fā)表于 06-12 14:24 ?321次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>帶你<b class='flag-5'>詳細(xì)了解</b>工業(yè)電腦