91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

通過mmap實(shí)現(xiàn)零拷貝技術(shù)

Linux閱碼場(chǎng) ? 來(lái)源:Linux內(nèi)核遠(yuǎn)航者 ? 作者:Linux內(nèi)核遠(yuǎn)航者 ? 2022-06-28 17:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.開場(chǎng)白

  • 環(huán)境: 處理器架構(gòu):arm64 內(nèi)核源碼:linux-5.11 ubuntu版本:20.04.1 代碼閱讀工具:vim+ctags+cscope

我們知道,linux系統(tǒng)中用戶空間和內(nèi)核空間是隔離的,用戶空間程序不能隨意的訪問內(nèi)核空間數(shù)據(jù),只能通過中斷或者異常的方式進(jìn)入內(nèi)核態(tài),一般情況下,我們使用copy_to_user和copy_from_user等內(nèi)核api來(lái)實(shí)現(xiàn)用戶空間和內(nèi)核空間的數(shù)據(jù)拷貝,但是像顯存這樣的設(shè)備如果也采用這樣的方式就顯的效率非常底下,因?yàn)橛脩艚?jīng)常需要在屏幕上進(jìn)行繪制,要消除這種復(fù)制的操作就需要應(yīng)用程序直接能夠訪問顯存,但是顯存被映射到內(nèi)核空間,應(yīng)用程序是沒有訪問權(quán)限的,如果顯存也能同時(shí)映射到用戶空間那就不需要拷貝操作了,于是字符設(shè)備中提供了mmap接口,可以將內(nèi)核空間映射的那塊物理內(nèi)存再次映射到用戶空間,這樣用戶空間就可以直接訪問不需要任何拷貝操作,這就是我們今天要說(shuō)的0拷貝技術(shù)。

下面是正常情況下用戶空間和內(nèi)核空間數(shù)據(jù)訪問圖示:

d0997780-f677-11ec-ba43-dac502259ad0.png

2. 體驗(yàn)一下

首先我們通過一個(gè)例子來(lái)感受一下:

驅(qū)動(dòng)代碼:

注:驅(qū)動(dòng)代碼中使用misc框架來(lái)實(shí)現(xiàn)字符設(shè)備,misc框架會(huì)處理如創(chuàng)建字符設(shè)備,創(chuàng)建設(shè)備等通用的字符設(shè)備處理,我們只需要關(guān)心我們的實(shí)際的邏輯即可(內(nèi)核中大量使用misc設(shè)備框架來(lái)使用字符設(shè)備操作集如ioctl接口,像實(shí)現(xiàn)系統(tǒng)虛擬化kvm模塊,實(shí)現(xiàn)安卓進(jìn)程間通信的binder模塊等)。

0copy_demo.c

#include
#include
#include
#include
#include


#defineMISC_DEV_MINOR5

staticchar*kbuff;


staticssize_tmisc_dev_read(structfile*filep,char__user*buf,size_tcount,loff_t*offset)
{

intret;

size_tlen=(count>PAGE_SIZE?PAGE_SIZE:count);

pr_info("######%s:%dkbuff:%s######
",__func__,__LINE__,kbuff);

ret=copy_to_user(buf,kbuff,len);//這里使用copy_to_user來(lái)進(jìn)程內(nèi)核空間到用戶空間拷貝

returnlen-ret;
}

staticssize_tmisc_dev_write(structfile*filep,constchar__user*buf,size_tcount,loff_t*offset)
{
pr_info("######%s:%d######
",__func__,__LINE__);
return0;
}

staticintmisc_dev_mmap(structfile*filep,structvm_area_struct*vma)
{
intret;
unsignedlongstart;

start=vma->vm_start;

ret=remap_pfn_range(vma,start,virt_to_phys(kbuff)>>PAGE_SHIFT,
PAGE_SIZE,vma->vm_page_prot);//使用remap_pfn_range來(lái)映射物理頁(yè)面到進(jìn)程的虛擬內(nèi)存中virt_to_phys(kbuff)>>PAGE_SHIFT作用是將內(nèi)核的虛擬地址轉(zhuǎn)化為實(shí)際的物理地址頁(yè)幀號(hào)創(chuàng)建頁(yè)表的權(quán)限為通過mmap傳遞的vma->vm_page_prot映射大小為1頁(yè)

returnret;
}

staticlongmisc_dev_ioctl(structfile*filep,unsignedintcmd,unsignedlongargs)
{
pr_info("######%s:%d######
",__func__,__LINE__);
return0;
}



staticintmisc_dev_open(structinode*inodep,structfile*filep)
{
pr_info("######%s:%d######
",__func__,__LINE__);
return0;
}

staticintmisc_dev_release(structinode*inodep,structfile*filep)
{
pr_info("######%s:%d######
",__func__,__LINE__);
return0;
}


staticstructfile_operationsmisc_dev_fops={
.open=misc_dev_open,
.release=misc_dev_release,
.read=misc_dev_read,
.write=misc_dev_write,
.unlocked_ioctl=misc_dev_ioctl,
.mmap=misc_dev_mmap,
};

staticstructmiscdevicemisc_dev={
MISC_DEV_MINOR,
"misc_dev",
&misc_dev_fops,
};

staticint__initmisc_demo_init(void)
{
misc_register(&misc_dev);//注冊(cè)misc設(shè)備(讓misc來(lái)幫我們處理創(chuàng)建字符設(shè)備的通用代碼,這樣我們就不需要在去做這些和我們的實(shí)際邏輯無(wú)關(guān)的代碼處理了)


kbuff=(char*)__get_free_page(GFP_KERNEL);//申請(qǐng)一個(gè)物理頁(yè)面(返回對(duì)應(yīng)的內(nèi)核虛擬地址,內(nèi)核初始化的時(shí)候會(huì)做線性映射,將整個(gè)ddr內(nèi)存映射到線性映射區(qū),所以我們不需要做頁(yè)表映射)
if(NULL==kbuff)
return-ENOMEM;

pr_info("######%s:%d######
",__func__,__LINE__);
return0;
}

staticvoid__exitmisc_demo_exit(void)
{
free_page((unsignedlong)kbuff);

misc_deregister(&misc_dev);
pr_info("######%s:%d######
",__func__,__LINE__);
}

module_init(misc_demo_init);
module_exit(misc_demo_exit);
MODULE_LICENSE("GPL");

應(yīng)用代碼:test.c

#include
#include
#include
#include
#include
#include
#include



intmain(intargc,char**argv)
{

intfd;
char*ptr;
charbuff[32];

fd=open("/dev/misc_dev",O_RDWR);//打開字符設(shè)備
if(fd"failtoopen");
return-1;
}

ptr=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//映射字符設(shè)備到進(jìn)程的地址空間權(quán)限為可讀可寫映射為共享大小為一個(gè)頁(yè)面
if(ptr==MAP_FAILED){
perror("failtommap");
return-1;
}


memcpy(ptr,"helloworld!!!", 15);//寫mmap映射的內(nèi)存直接操作,不需要進(jìn)行特權(quán)級(jí)別的陷入!


if(read(fd,buff,15)==-1){//讀接口來(lái)讀取映射的內(nèi)存,這里會(huì)進(jìn)行內(nèi)核空間到用戶空間的數(shù)據(jù)拷貝(需要調(diào)用系統(tǒng)調(diào)用在內(nèi)核空間進(jìn)行拷貝,然后才能訪問)
perror("failtoread");
return-1;
}
puts(buff);

pause();
return0;
}

Makefile文件:

exportARCH=arm64
exportCROSS_COMPILE=aarch64-linux-gnu-

KERNEL_DIR?=~/kernel/linux-5.11
obj-m:=0copy_demo.o

modules:
$(MAKE)-C$(KERNEL_DIR)M=$(PWD)modules

app:
aarch64-linux-gnu-gcctest.c-otest
cptest$(KERNEL_DIR)/kmodules

clean:
$(MAKE)-C$(KERNEL_DIR)M=$(PWD)clean

install:
cp*.ko$(KERNEL_DIR)/kmodules

編譯驅(qū)動(dòng)代碼和應(yīng)用代碼,然后拷貝到qemu中運(yùn)行:

編譯驅(qū)動(dòng)模塊代碼:
$makemodules

編譯并拷貝應(yīng)用:
$makeapp

拷貝驅(qū)動(dòng)模塊到qemu:
$makeinstall

加載驅(qū)動(dòng)代碼:
#insmod0copy_demo.ko
[23328.532194]######misc_demo_init:91######

查看生成的設(shè)備節(jié)點(diǎn):
#ls-l/dev/misc_dev
crw-rw----10010,5Apr719:26/dev/misc_dev

后臺(tái)運(yùn)行應(yīng)用程序:
#./test&
#[23415.280501]######misc_dev_open:56######
[23415.281052]######misc_dev_read:20kbuff:helloworld!!!######
helloworld!!!

查看test的pid:
#pidoftest
1768


查看內(nèi)存映射:
#cat/proc/1768/maps
aaaabc5a0000-aaaabc5a1000r-xp0000000000:198666193/mnt/test
aaaabc5b0000-aaaabc5b1000r--p0000000000:198666193/mnt/test
aaaabc5b1000-aaaabc5b2000rw-p0000100000:198666193/mnt/test
aaaacf033000-aaaacf054000rw-p0000000000:000[heap]
ffff8a911000-ffff8aa52000r-xp00000000fe:00152/lib/libc-2.27.so
ffff8aa52000-ffff8aa61000---p00141000fe:00152/lib/libc-2.27.so
ffff8aa61000-ffff8aa65000r--p00140000fe:00152/lib/libc-2.27.so
ffff8aa65000-ffff8aa67000rw-p00144000fe:00152/lib/libc-2.27.so
ffff8aa67000-ffff8aa6b000rw-p0000000000:000
ffff8aa6b000-ffff8aa88000r-xp00000000fe:00129/lib/ld-2.27.so
ffff8aa91000-ffff8aa92000rw-s0000000000:05152/dev/misc_dev//映射設(shè)備文件到用戶空間
ffff8aa92000-ffff8aa94000rw-p0000000000:000
ffff8aa94000-ffff8aa96000r--p0000000000:000[vvar]
ffff8aa96000-ffff8aa97000r-xp0000000000:000[vdso]
ffff8aa97000-ffff8aa98000r--p0001c000fe:00129/lib/ld-2.27.so
ffff8aa98000-ffff8aa9a000rw-p0001d000fe:00129/lib/ld-2.27.so
ffffecb5a000-ffffecb7b000rw-p0000000000:000[stack]

執(zhí)行了以上步驟可以發(fā)現(xiàn)最終內(nèi)核中出現(xiàn)了我在應(yīng)用程序中寫入的“hello world!!!“ 字符串,應(yīng)用程序也能成功讀取到(當(dāng)然本文講解的0拷貝實(shí)現(xiàn)的驅(qū)動(dòng)接口是mmap,而我們讀取使用的是read接口,里面我們用copy_to_user來(lái)實(shí)現(xiàn)的,當(dāng)然我們可以直接操作mmap映射的內(nèi)存不需要任何拷貝操作)。

查看應(yīng)用程序的內(nèi)存映射發(fā)現(xiàn),/dev/misc_dev設(shè)備被映射到了ffff8aa91000-ffff8aa92000這段用戶空間地址范圍,而且權(quán)限為rw-s(可讀可寫共享)。

寫到這里可能大家還是有點(diǎn)不明白那我來(lái)解釋下:

1.用戶空間不能直接訪問內(nèi)核空間數(shù)據(jù)(不能直接讀寫),一旦訪問發(fā)生缺頁(yè)異常,產(chǎn)生段錯(cuò)誤,必須通過read這樣的接口來(lái)訪問,而read這樣的接口會(huì)通過系統(tǒng)調(diào)用的方式寫入到內(nèi)核態(tài),然后通過copy_to_user這樣的內(nèi)核api來(lái)拷貝內(nèi)核空間數(shù)據(jù)到用戶空間之后才能正常訪問。

2.通過mmap這種方式之后,用戶進(jìn)程可以直接訪問這塊內(nèi)存,memcpy訪問的也只不過是用戶空間地址,由于訪問的時(shí)候已經(jīng)分配好了物理頁(yè)面和建立好了物理頁(yè)到虛擬頁(yè)的映射,所有不會(huì)發(fā)生缺頁(yè)異常,也不會(huì)發(fā)生用戶態(tài)到內(nèi)核態(tài)的陷入動(dòng)作。

3.用戶態(tài)進(jìn)程正常訪問內(nèi)核態(tài)數(shù)據(jù)需要首先通過系統(tǒng)調(diào)用等方式陷入內(nèi)核,進(jìn)行數(shù)據(jù)拷貝,然后再次回到用戶態(tài),用戶態(tài)和內(nèi)核態(tài)直接的進(jìn)出需要進(jìn)行上下文切換,需要2次上下文切換,需要一定的開銷,而mmap映射好之后以后訪問都不需要進(jìn)行上下文切換。

4.mmap映射這種方法由于物理頁(yè)面通過頁(yè)面共享更加節(jié)省內(nèi)存,而用戶態(tài)和內(nèi)核態(tài)內(nèi)存拷貝需要兩份物理頁(yè)面。

3.實(shí)現(xiàn)原理

我們發(fā)現(xiàn)通過mmap映射之后,我們?cè)趹?yīng)用程序中可以直接讀寫這段內(nèi)存,不需要任何用戶空間和內(nèi)核空間的拷貝動(dòng)作,大大提高了內(nèi)存訪問效率,那么就是是如何實(shí)現(xiàn)的呢?下面我們來(lái)揭開它神秘的面紗:

實(shí)現(xiàn)0拷貝功不可沒的是mmap接口中的remap_pfn_range內(nèi)核api,它將內(nèi)核空間映射的物理內(nèi)存重新映射到了用戶空間,下面我們來(lái)看這個(gè)函數(shù)的實(shí)現(xiàn):remap_pfn_range函數(shù)參數(shù)如下:

intremap_pfn_range(structvm_area_struct*vma,unsignedlongaddr,
|unsignedlongpfn,unsignedlongsize,pgprot_tprot)

vma為需要映射的進(jìn)程的vma(進(jìn)程調(diào)用mmap的時(shí)候內(nèi)核會(huì)找到一個(gè)合適的vma), addr為vma中的一個(gè)起始映射地址(這是用戶空間的一個(gè)虛擬地址),pfn為頁(yè)幀號(hào)(在驅(qū)動(dòng)的mmap接口中會(huì)將內(nèi)核空間的地址轉(zhuǎn)化為物理地址的頁(yè)幀號(hào)),size為需要映射的大小,prot為映射的權(quán)限(一般取mmap時(shí)傳遞的權(quán)限如rw)

remap_pfn_range實(shí)現(xiàn)主要如下代碼段:

remap_pfn_range
...
pgd=pgd_offset(mm,addr);
flush_cache_range(vma,addr,end);
do{
next=pgd_addr_end(addr,end);
err=remap_p4d_range(mm,pgd,addr,next,
pfn+(addr>>PAGE_SHIFT),prot);
if(err)
break;
}while(pgd++,addr=next,addr!=end);

解釋下:remap_pfn_range函數(shù)會(huì)查找進(jìn)程的頁(yè)表,然后填寫頁(yè)表,會(huì)將映射的物理頁(yè)幀號(hào)和訪問權(quán)限填寫到進(jìn)程的對(duì)應(yīng)頁(yè)表中,這會(huì)遍歷進(jìn)程的各級(jí)頁(yè)表找到最終的頁(yè)表項(xiàng)然后進(jìn)行填寫,具體過程自行查看代碼。

我們需要注意的是:

1.一般情況下,用戶程序調(diào)用mmap只是申請(qǐng)?zhí)摂M內(nèi)存(即是獲得一塊沒有使用用戶空間內(nèi)存,使用vma描述),實(shí)際的物理頁(yè)表都是通過進(jìn)程訪問的時(shí)候缺頁(yè)異常的方式來(lái)申請(qǐng)的,但是本場(chǎng)景中是物理頁(yè)面已經(jīng)申請(qǐng)好了,進(jìn)程訪問時(shí)不會(huì)再發(fā)生缺頁(yè)異常,不會(huì)申請(qǐng)物理頁(yè)面。

2.同樣,物理頁(yè)面到用戶空間虛擬頁(yè)面的映射也在調(diào)用mmap的時(shí)候,驅(qū)動(dòng)調(diào)用mmap接口的remap_pfn_range映射好了,也不需要在訪問的時(shí)候發(fā)生缺頁(yè)異常來(lái)建立映射。所以,只要用戶進(jìn)程通過mmap映射之后就可以正常訪問,訪問過程中不會(huì)發(fā)生缺頁(yè)異常,映射虛擬頁(yè)對(duì)應(yīng)的物理頁(yè)面已經(jīng)在驅(qū)動(dòng)中申請(qǐng)好映射好。

下面給出mmap映射原理的圖示:

d0adc1d6-f677-11ec-ba43-dac502259ad0.png


4.應(yīng)用場(chǎng)景

最后,我們來(lái)看下使用framebuffer的lcd對(duì)0拷貝的使用情況

fbmem_init//drivers/video/fbdev/core/fbmem.c
->register_chrdev(FB_MAJOR,"fb",&fb_fops)//注冊(cè)framebuffer字符設(shè)備

->structfile_operationsfb_fops={
->.mmap=fb_mmap
->fb_mmap//framebuffer的實(shí)現(xiàn)
->vm_iomap_memory
->io_remap_pfn_range
->remap_pfn_range

->fb_class=class_create(THIS_MODULE,"graphics")//創(chuàng)建設(shè)備類

lcd驅(qū)動(dòng)代碼中會(huì)設(shè)置好最終注冊(cè)framebuffer:

xxxfb_probe
->register_framebuffer
->do_register_framebuffer
->fb_info->dev=device_create(fb_class,fb_info->device,
|MKDEV(FB_MAJOR,i),NULL,"fb%d",i);//創(chuàng)建設(shè)備會(huì)出現(xiàn)/dev/fdx設(shè)備節(jié)點(diǎn)

可以看到當(dāng)系統(tǒng)支持framebuffer設(shè)備時(shí),在fbmem_init中會(huì)創(chuàng)建framebuffer設(shè)備類關(guān)聯(lián)字符設(shè)備操作集fb_fops,lcd的驅(qū)動(dòng)代碼中會(huì)調(diào)用register_framebuffer創(chuàng)建framebuffer設(shè)備(就會(huì)創(chuàng)建出了/dev/fdx 設(shè)備節(jié)點(diǎn)),應(yīng)用程序就可以通過mmap來(lái)映射framebuffer設(shè)備到用戶空間,然后進(jìn)行屏幕繪制操作,不需要任何數(shù)據(jù)拷貝。

5.總結(jié)

可以看的出,通過mmap實(shí)現(xiàn)0拷貝非常簡(jiǎn)單,只需要在驅(qū)動(dòng)的mmap接口中調(diào)用remap_pfn_range來(lái)將內(nèi)核空間映射的那塊物理頁(yè)再次映射到用戶空間即可,這就實(shí)現(xiàn)了用戶空間和內(nèi)核空間的數(shù)據(jù)共享,這和用戶進(jìn)程之間的共享內(nèi)存機(jī)制非常相似,都需要操作進(jìn)程的頁(yè)表將這段物理內(nèi)存映射到進(jìn)程虛擬地址空間。

原文標(biāo)題:5.總結(jié)

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

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

    關(guān)注

    68

    文章

    20255

    瀏覽量

    252413
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1468

    瀏覽量

    42888
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11761

    瀏覽量

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

    關(guān)注

    0

    文章

    16

    瀏覽量

    7616

原文標(biāo)題:5.總結(jié)

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    碳園區(qū)的能源結(jié)構(gòu)優(yōu)化需要哪些技術(shù)支持?

    碳園區(qū)的核心目標(biāo)是實(shí)現(xiàn)能源消耗與碳排放的脫鉤,而能源結(jié)構(gòu)優(yōu)化作為核心路徑,絕非簡(jiǎn)單的“以綠代煤”,而是需依托多領(lǐng)域技術(shù)創(chuàng)新,構(gòu)建“清潔供給充足、消費(fèi)效率領(lǐng)先、存儲(chǔ)調(diào)節(jié)靈活、智能管控精準(zhǔn)”的復(fù)合型
    的頭像 發(fā)表于 02-04 09:45 ?485次閱讀
    <b class='flag-5'>零</b>碳園區(qū)的能源結(jié)構(gòu)優(yōu)化需要哪些<b class='flag-5'>技術(shù)</b>支持?

    碳園區(qū)如何實(shí)現(xiàn)能源互聯(lián)

    在“雙碳”目標(biāo)縱深推進(jìn)背景下,碳園區(qū)已從單一能源替代邁向多能協(xié)同的高階階段,而能源互聯(lián)正是打通各類能源壁壘、實(shí)現(xiàn)全域碳運(yùn)營(yíng)的核心紐帶。不同于傳統(tǒng)能源系統(tǒng)的分散運(yùn)行模式,碳園區(qū)能源
    的頭像 發(fā)表于 02-02 15:32 ?267次閱讀
    <b class='flag-5'>零</b>碳園區(qū)如何<b class='flag-5'>實(shí)現(xiàn)</b>能源互聯(lián)

    碳園區(qū)如何實(shí)現(xiàn)高效能源管理與綠色電力消納——探索現(xiàn)代能源系統(tǒng)的技術(shù)路徑

    在全球應(yīng)對(duì)氣候變化、推進(jìn)可持續(xù)發(fā)展的背景下,“碳園區(qū)”作為區(qū)域碳中和的關(guān)鍵載體,正逐漸從理念走向?qū)嵺`。然而,在建設(shè)過程中,園區(qū)面臨著能源結(jié)構(gòu)復(fù)雜、綠色電力消納難、減排技術(shù)成本高等多重挑戰(zhàn)。如何通過
    的頭像 發(fā)表于 01-05 14:19 ?725次閱讀
    <b class='flag-5'>零</b>碳園區(qū)如何<b class='flag-5'>實(shí)現(xiàn)</b>高效能源管理與綠色電力消納——探索現(xiàn)代能源系統(tǒng)的<b class='flag-5'>技術(shù)</b>路徑

    內(nèi)存拷貝函數(shù) memcpy原理及實(shí)現(xiàn)

    內(nèi)存拷貝函數(shù)memcpymemcpy是memory copy的縮寫,意為內(nèi)存復(fù)制,在寫C語(yǔ)言程序的時(shí)候,我們常常會(huì)用到它。它的函原型如下:void *memcpy(void *dest, const
    發(fā)表于 12-26 08:03

    飛凌嵌入式ElfBoard-文件I/O的深入學(xué)習(xí)之存儲(chǔ)映射I/O

    并不是完美的,它所映射的文件只能是固定大小,因?yàn)槲募成涞膮^(qū)域已經(jīng)在調(diào)用mmap函數(shù)時(shí)通過length參數(shù)指定了。另外,文件映射的內(nèi)存區(qū)域的大小必須是系統(tǒng)頁(yè)大小的整數(shù)倍,比如映射文件的大小為100字節(jié)
    發(fā)表于 12-06 16:39

    實(shí)測(cè)2778MB/s,AMP核間通信“快如閃電”,瑞芯微RK3576

    的AMP核間通信——共享內(nèi)存方案,具有“ 拷貝 ”、“ 高帶寬 ”的顯著優(yōu)勢(shì),直接解決用戶痛點(diǎn),下面用實(shí)測(cè)數(shù)據(jù)說(shuō)話! ? ▍共享內(nèi)存方案優(yōu)勢(shì) 拷貝 “共享內(nèi)存方案”能夠讓不同核心直
    的頭像 發(fā)表于 12-04 14:14 ?428次閱讀
    實(shí)測(cè)2778MB/s,AMP核間通信“快如閃電”,瑞芯微RK3576

    磁通電流探頭的技術(shù)原理與應(yīng)用分析

    磁通電流探頭通過磁平衡技術(shù)解決傳統(tǒng)開環(huán)探頭的測(cè)量瓶頸,具有高精度、寬頻帶、低插入阻抗和良好的溫度穩(wěn)定性,廣泛應(yīng)用于電力電子和精密測(cè)量領(lǐng)域。
    的頭像 發(fā)表于 10-20 09:31 ?486次閱讀

    通過PWM全橋轉(zhuǎn)換器實(shí)現(xiàn)電壓開關(guān)

    設(shè)計(jì)小貼士中,將演示對(duì)脈寬調(diào)制 (PWM) 控制的全橋的簡(jiǎn)單修改,該全橋可以通過實(shí)現(xiàn)電壓開關(guān) (ZVS) 來(lái)提高效率,并消除變壓器繞組上的諧振振鈴。
    的頭像 發(fā)表于 10-07 10:08 ?1484次閱讀
    <b class='flag-5'>通過</b>PWM全橋轉(zhuǎn)換器<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>零</b>電壓開關(guān)

    碳園區(qū)如何實(shí)現(xiàn)智慧管理?有哪些方面?

    碳園區(qū)是指在園區(qū)內(nèi),通過綜合運(yùn)用能源轉(zhuǎn)型、產(chǎn)業(yè)升級(jí)、技術(shù)創(chuàng)新、管理優(yōu)化等手段,實(shí)現(xiàn)園區(qū)運(yùn)營(yíng)全生命周期內(nèi)碳排放總量持續(xù)下降并趨近于的綜合性
    的頭像 發(fā)表于 08-07 13:35 ?705次閱讀
    <b class='flag-5'>零</b>碳園區(qū)如何<b class='flag-5'>實(shí)現(xiàn)</b>智慧管理?有哪些方面?

    黑芝麻智能一芯多域拷貝共享內(nèi)存技術(shù):破解車載大數(shù)據(jù)傳輸效能困局

    通過 拷貝共享內(nèi)存技術(shù) ,黑芝麻智能解決車載多域間大數(shù)據(jù)傳輸?shù)难舆t與資源消耗問題。核心技術(shù)包括 全局內(nèi)存管理單元 和 dmabuf機(jī)制優(yōu)化
    發(fā)表于 06-23 17:53 ?1724次閱讀
    黑芝麻智能一芯多域<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>共享內(nèi)存<b class='flag-5'>技術(shù)</b>:破解車載大數(shù)據(jù)傳輸效能困局

    汽車部件的MES系統(tǒng)解決方案:實(shí)現(xiàn)智能制造轉(zhuǎn)型的核心利器

    迫使傳統(tǒng)制造模式亟需突破。制造執(zhí)行系統(tǒng)(MES)作為連接計(jì)劃層與控制層的核心樞紐,已成為汽車部件企業(yè)實(shí)現(xiàn)智能制造轉(zhuǎn)型的戰(zhàn)略級(jí)工具,通過構(gòu)建全流程數(shù)字主線,推動(dòng)生
    的頭像 發(fā)表于 06-18 14:28 ?952次閱讀
    汽車<b class='flag-5'>零</b>部件的MES系統(tǒng)解決方案:<b class='flag-5'>實(shí)現(xiàn)</b>智能制造轉(zhuǎn)型的核心利器

    安科瑞微電網(wǎng)能源管理系統(tǒng)助力園區(qū)實(shí)現(xiàn)碳工廠 實(shí)現(xiàn)低碳轉(zhuǎn)型

    競(jìng)爭(zhēng)力、規(guī)避碳關(guān)稅壁壘的戰(zhàn)略選擇。然而,實(shí)現(xiàn)工廠運(yùn)營(yíng)的“凈排放”,需突破能源結(jié)構(gòu)單一、能效管理粗放、碳排數(shù)據(jù)模糊等瓶頸。 1、 什么是碳工廠? 碳工廠是指以
    的頭像 發(fā)表于 03-28 14:05 ?807次閱讀
    安科瑞微電網(wǎng)能源管理系統(tǒng)助力園區(qū)<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>零</b>碳工廠 <b class='flag-5'>實(shí)現(xiàn)</b>低碳轉(zhuǎn)型

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間與用戶空間的數(shù)據(jù)拷貝之?dāng)?shù)據(jù)拷貝介紹

    空間之間進(jìn)行數(shù)據(jù)傳輸時(shí),需要進(jìn)行數(shù)據(jù)拷貝操作。Linux內(nèi)核提供了幾種方法來(lái)實(shí)現(xiàn)內(nèi)核空間與用戶空間之間的數(shù)據(jù)拷貝。copy_to_user()和copy_from_user()這兩個(gè)函數(shù)用于在內(nèi)核空間
    發(fā)表于 03-20 11:50

    飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核空間與用戶空間的數(shù)據(jù)拷貝之?dāng)?shù)據(jù)拷貝介紹

    在Linux系統(tǒng)中,內(nèi)核空間和用戶空間是兩個(gè)獨(dú)立的地址空間,它們有不同的訪問權(quán)限和內(nèi)存保護(hù)機(jī)制。在內(nèi)核空間和用戶空間之間進(jìn)行數(shù)據(jù)傳輸時(shí),需要進(jìn)行數(shù)據(jù)拷貝操作。Linux內(nèi)核提供了幾種方法來(lái)實(shí)現(xiàn)內(nèi)核
    發(fā)表于 03-19 08:55

    USB3.0移動(dòng)硬盤拷貝機(jī) 如何選 ?

    捷美USB3.2移動(dòng)硬盤拷貝機(jī)專為大規(guī)模硬盤復(fù)制設(shè)計(jì),一次可同時(shí)復(fù)制40顆硬盤,僅需3.5小時(shí)完成,比傳統(tǒng)計(jì)算機(jī)拷貝快500%。采用一鍵式操作,無(wú)需人工監(jiān)控,降低人力成本。內(nèi)建bit to bit比對(duì)功能,確保數(shù)據(jù)完整性和安全性。獨(dú)立運(yùn)行,開機(jī)即用,無(wú)需計(jì)算機(jī)或額外軟件,
    的頭像 發(fā)表于 03-18 17:16 ?1425次閱讀
    USB3.0移動(dòng)硬盤<b class='flag-5'>拷貝</b>機(jī) 如何選 ?