最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

一文細(xì)說vDSO機(jī)制原理

2023-05-25 14:55 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

1. 什么是 vDSO

眾所周知,操作系統(tǒng)為我們管理硬件資源,并以系統(tǒng)調(diào)用的方式對(duì)用戶進(jìn)程提供 API,但是?syscall?很慢,涉及陷入內(nèi)核以及上下文切換。對(duì)于少量頻繁調(diào)用的系統(tǒng)調(diào)用(比如獲取當(dāng)期系統(tǒng)時(shí)間)來說,是否可以某種安全的方式開放到用戶空間,讓用戶直接訪問而不需要經(jīng)過?syscall?呢?

vDSO?就是用來解決這個(gè)問題的。

vDSO?全稱為?virtual dynamic shared object,dynamic shared object 這個(gè)名詞大家應(yīng)該有所耳聞,就是 Linux 下的動(dòng)態(tài)庫(kù)的全稱,而 virtual 表明,這個(gè)動(dòng)態(tài)庫(kù)是通過某種手段虛擬出來的,并不真正存在于 Linux 文件系統(tǒng)中。

要驗(yàn)證這點(diǎn)也很簡(jiǎn)單,只需要通過 ldd 命令,查看一些可執(zhí)行文件所依賴的動(dòng)態(tài)庫(kù)即可,

可以明顯看出,在ls 這個(gè)可執(zhí)行文件依賴的動(dòng)態(tài)庫(kù)列表中,除了 linux-vdso.so.1 都有明確的路徑,同時(shí)還可以通過 proc 文件系統(tǒng)中進(jìn)程的內(nèi)存映射(memory map)情況來映射這一點(diǎn):

可以看出,vDSO 確實(shí)是以共享庫(kù)的形式存在于每一個(gè)進(jìn)程當(dāng)中的。

通過 vDSO,進(jìn)程訪問一些系統(tǒng)提供的 API,就可以直接在自己的地址空間訪問,而不需要進(jìn)行用戶-內(nèi)核態(tài)的狀態(tài)切換了

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

linux-vdso.so.1?既然不是一個(gè)實(shí)實(shí)在在的文件,那其中的內(nèi)容就應(yīng)該直接保存在內(nèi)存中,Linux 使用?vdso_image?來表示

2.1 vDSO image

在?arch/x86/entyr/vdso/vdso-image-64.c?文件中,定義了下面的?vdso_image:

vdso_image.raw_data?對(duì)應(yīng)的就是 vDSO 提供的所有系統(tǒng)調(diào)用的二進(jìn)制指令,一共有 8192 字節(jié),相當(dāng)于下面的結(jié)構(gòu):

vdso_iamge_64?自然需要保存到全局變量中才能發(fā)揮作用,這就涉及接下來要提到的 vDSO 初始化。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?


2.2 vDSO 初始化

vDSO 通過?init_vdso()?函數(shù)來初始化,通過條件編譯對(duì) 32/64 bit 的 image 進(jìn)行選擇。同時(shí)也需要通過?subsys_initcall(init_vdso)?將?init_vdso()?放到?initcall?列表中。

init_vdso_image()?這里不過多介紹,主要是用來優(yōu)化指令,畢竟 vdso_image 中提供的二進(jìn)制指令是手動(dòng)放在一個(gè)數(shù)組中的,還有相當(dāng)大的優(yōu)化空間

2.3 vDSO 和 可執(zhí)行程序

如果你對(duì) Linux 可執(zhí)行程序的 加載-執(zhí)行機(jī)制有所研究,就知道對(duì)于 elf 格式的可執(zhí)行程序而言,最終調(diào)用了?load_elf_binary()?這個(gè)回調(diào)函數(shù),在這個(gè)函數(shù)中,會(huì)根據(jù) elf 文件頭中的描述,設(shè)置好新進(jìn)程的各個(gè)段,并將 elf 文件中的內(nèi)容拷貝到相應(yīng)位置。

為什么好端端的,要提到可執(zhí)行程序加載呢?這是因?yàn)椋谙到y(tǒng)初始化完成之后,vdso_image?已經(jīng)設(shè)置完畢,只需要在每次加載二進(jìn)制可執(zhí)行程序的時(shí)候,分配一塊內(nèi)存空間,將?vdso_image?加載到該位置即可。

這就是?arch_setup_additional_pages()?函數(shù)所要完成的任務(wù)了:

map_vdso_randomized()?會(huì)通過?stack protect?機(jī)制,選擇一個(gè)隨機(jī)的加載地址,并調(diào)用?map_vdso?完成 mapping 工作,該函數(shù)內(nèi)容較多,這里不贅述。

最終,vDSO 會(huì)向用戶提供四個(gè)系統(tǒng)調(diào)用:

你還別不信,可以自行驗(yàn)證一下:

  • 使用命令?cat /proc/1/maps?找到?[vdso]?對(duì)應(yīng)的內(nèi)存位置。

  • 通過 dd 命令將內(nèi)存的影像 dump 到文件中,如:dd if=/proc/1/mem of=/tmp/linux-vdso.so skip=140728627781632 ibs=1 count=4096,其中 skip 的值為 vdso 的內(nèi)存起始地址,count 為這塊內(nèi)存的大小。

  • 使用?objdump?命令查看?linux-vdso.so?中所有符號(hào)?objdump -T /tmp/linux-vdso.so,最終結(jié)果如下。


一文細(xì)說vDSO機(jī)制原理的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
瓦房店市| 罗定市| 米泉市| 天津市| 锦州市| 辽中县| 新巴尔虎左旗| 佛教| 清丰县| 晋宁县| 江津市| 新昌县| 岳阳市| 博野县| 揭阳市| 大同县| 卓尼县| 周宁县| 冕宁县| 曲阜市| 太仓市| 剑阁县| 葫芦岛市| 清流县| 腾冲县| 泗阳县| 宣汉县| 长沙市| 宾川县| 枣强县| 洛浦县| 广平县| 孟村| 铜梁县| 五华县| 武胜县| 鄂托克前旗| 龙海市| 临泉县| 安吉县| 丹寨县|