日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

关于用户空间和内核空间

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于用户空间和内核空间 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)一個(gè)任務(wù)(進(jìn)程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時(shí),我們就稱(chēng)進(jìn)程處于內(nèi)核運(yùn)行態(tài)(內(nèi)核態(tài))。在內(nèi)核態(tài)下,CPU可執(zhí)行任何指令。當(dāng)進(jìn)程在執(zhí)行用戶(hù)自己的代碼時(shí),則稱(chēng)其處于用戶(hù)運(yùn)行態(tài)(用戶(hù)態(tài))。用戶(hù)態(tài)不能訪問(wèn)內(nèi)核空間,包括代碼和數(shù)據(jù)。

進(jìn)程處于用戶(hù)態(tài)時(shí)能訪問(wèn)的是用戶(hù)空間,處于內(nèi)核態(tài)時(shí)能訪問(wèn)的稱(chēng)為內(nèi)核空間。

CPU執(zhí)行程序所訪問(wèn)的地址都是虛擬地址,MMU 必須通過(guò)讀取控制寄存器CR3中的值作為當(dāng)前頁(yè)面目錄的指針,進(jìn)而根據(jù)分頁(yè)內(nèi)存映射機(jī)制(參看相關(guān)文檔)將該虛擬地址轉(zhuǎn)換為真正的物理地址才能讓CPU真正的訪問(wèn)到物理地址。

進(jìn)程有4G的尋址空間,其中第一部分為“用戶(hù)空間”,用來(lái)映射其整個(gè)進(jìn)程空間(0x0000 0000-0xBFFF FFFF)即3G字節(jié)的虛擬地址;第二部分為“系統(tǒng)空間”,用來(lái)映射(0xC000 0000-0xFFFF FFFF)1G字節(jié)的虛擬地址。可以看出Linux系統(tǒng)中每個(gè)進(jìn)程的頁(yè)面目錄的第二部分是相同的,所以從進(jìn)程的角度來(lái)看,每個(gè)進(jìn)程有4G字節(jié)的虛擬空間,較低的3G字節(jié)是自己的用戶(hù)空間,最高的1G字節(jié)則為與所有進(jìn)程以及內(nèi)核共享的系統(tǒng)空間。

if(數(shù)據(jù)在物理內(nèi)存中)
????????{ ?????? 虛擬地址轉(zhuǎn)換成物理地址
?????????????????讀數(shù)據(jù) }
????????else
????????{ ??? if(數(shù)據(jù)在磁盤(pán)中)
??????????????{
?????????????????????if(物理內(nèi)存還有空閑)
?????????????????????{??????????把數(shù)據(jù)從磁盤(pán)中讀到物理內(nèi)存
?????????????????????????????????虛擬地址轉(zhuǎn)換成物理地址
?????????????????????????????????讀數(shù)據(jù)
?????????????????????}
?????????????????????else
?????????????????????{ ???????? 把物理內(nèi)存中某頁(yè)的數(shù)據(jù)存入磁盤(pán)
?????????????????????????????????把要讀的數(shù)據(jù)從磁盤(pán)讀到該頁(yè)的物理內(nèi)存中
?????????????????????????????????虛擬地址轉(zhuǎn)換成物理地址
?????????????????????????????????讀數(shù)據(jù)
?????????????????????}
??????????????}
??????????????else
??????????????{ ??? 報(bào)錯(cuò) ?????? } }

?

請(qǐng)問(wèn)如何在驅(qū)動(dòng)程序里邊通過(guò)用戶(hù)空間的虛擬地址得到它對(duì)應(yīng)的物理地址呢?

一般的驅(qū)動(dòng)程序里邊都要實(shí)現(xiàn)read函數(shù)
read函數(shù)里邊有一個(gè)參數(shù)char* buf是用戶(hù)空間傳遞過(guò)來(lái)的指針,是用戶(hù)空間的虛擬地址,請(qǐng)問(wèn)我怎么通過(guò)這個(gè)虛擬地址得到它對(duì)應(yīng)的物理地址呢?
(因?yàn)槲蚁雽?shí)現(xiàn)通過(guò)dma把內(nèi)核空間的數(shù)據(jù)傳送到用戶(hù)空間去,所以一定要知道buf對(duì)應(yīng)的物理地址)

請(qǐng)問(wèn)有可能嗎?

謝謝

?

?

我覺(jué)得有三種解決方案.第一種性能差些,但是簡(jiǎn)單,即先從內(nèi)核到內(nèi)核dma,然后再調(diào)用現(xiàn)成的copy_to_usr等函數(shù).第二種就是搜索該用戶(hù)進(jìn)程的頁(yè)表,(找到該進(jìn)程的task結(jié)構(gòu),task->pgd...),從頁(yè)表中搜索虛擬地址對(duì)應(yīng)的物理地址.第三種就是在內(nèi)核中開(kāi)辟一塊內(nèi)存,用于存放dma后的數(shù)據(jù),然后將它映射到用戶(hù)空間去.這種方法我以前采用過(guò),依稀的一些印象是.mknod一個(gè)設(shè)備文件,然后對(duì)該設(shè)備文件進(jìn)行一些ioctl請(qǐng)求(ioctl的各個(gè)操作函數(shù)當(dāng)然是自己寫(xiě)),必需實(shí)現(xiàn)的一個(gè)函數(shù)是該文件的***_mmap.(這樣mmap系統(tǒng)調(diào)用->do_mmap()->do_mmap_pgoff()然后再找到你的***_mmap()),在這個(gè)map函數(shù)中,一個(gè)關(guān)鍵可用的內(nèi)核函數(shù)是remap_page_range().該函數(shù)則可用來(lái)生成一個(gè)用戶(hù)空間的vma段,然后將其和給定的物理內(nèi)存(設(shè)備文件片斷)聯(lián)系起來(lái),將返回的虛擬地址傳回用戶(hù)空間(ioctl)后,就可以在用戶(hù)空間對(duì)那塊內(nèi)存操作了

總結(jié)

以上是生活随笔為你收集整理的关于用户空间和内核空间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。