在推薦另一篇blog:
同樣是對64位linux的系統呼叫機制進行研究,但其中的某些實驗我沒有能夠復現。
好,言歸正傳。
先來看vdso與vsyscall的出現原因:由於進行系統呼叫時,作業系統要由使用者態切換到核心態,而這一操作是非常浪費時間的操作,無論採用早期的int 0x80/iret中斷,還是sysenter/sy***it指令,再到syscall/sy***it指令。另一方面,某些系統呼叫並不會向核心提交引數,而僅僅只是從核心裡請求讀取某個資料,例如gettimeofday(),核心在處理這部分系統呼叫時可以把系統當前時間寫在乙個固定的位置,而應用程式直接從該位置簡單讀取即可,無需發起系統呼叫。核心與使用者態程式之間進行資料互動的方法就是mmap。但由於vsyscall採用固定位址對映的方式,所以存在一定的安全隱患,這一方式便被vdso所改進,vdso的隨機對映在一定程度上緩解了安全威脅。雖然有了vdso,但從歷史相容性上來講,vsyscall不能就此完全拋棄,否則將導致一些陳舊的(特別是靜態連線的)應用程式無法執行,因此現在在我的3.19核心上,將同時看到vdso和vsyscal。
舉個簡單的例子:
cat /proc/self/maps
00400000-0040c000 r-xp 00000000 08:08 2883607 /bin/cat
0060b000-0060c000 r--p 0000b000 08:08 2883607 /bin/cat
0060c000-0060d000 rw-p 0000c000 08:08 2883607 /bin/cat
01778000-01799000 rw-p 00000000 00:00 0 [heap]
7eff551eb000-7eff558cd000 r--p 00000000 08:08 401027 /usr/lib/locale/locale-archive
7eff558cd000-7eff55a8d000 r-xp 00000000 08:08 3412306 /lib/x86_64-linux-gnu/libc-2.21.so
7eff55a8d000-7eff55c8d000 ---p 001c0000 08:08 3412306 /lib/x86_64-linux-gnu/libc-2.21.so
7eff55c8d000-7eff55c91000 r--p 001c0000 08:08 3412306 /lib/x86_64-linux-gnu/libc-2.21.so
7eff55c91000-7eff55c93000 rw-p 001c4000 08:08 3412306 /lib/x86_64-linux-gnu/libc-2.21.so
7eff55c93000-7eff55c97000 rw-p 00000000 00:00 0
7eff55c97000-7eff55cbb000 r-xp 00000000 08:08 3412278 /lib/x86_64-linux-gnu/ld-2.21.so
7eff55e78000-7eff55e9d000 rw-p 00000000 00:00 0
7eff55eb8000-7eff55eba000 rw-p 00000000 00:00 0
7eff55eba000-7eff55ebb000 r--p 00023000 08:08 3412278 /lib/x86_64-linux-gnu/ld-2.21.so
7eff55ebb000-7eff55ebc000 rw-p 00024000 08:08 3412278 /lib/x86_64-linux-gnu/ld-2.21.so
7eff55ebc000-7eff55ebd000 rw-p 00000000 00:00 0
7ffc08293000-7ffc082b4000 rw-p 00000000 00:00 0 [stack]
7ffc082e4000-7ffc082e6000 r--p 00000000 00:00 0 [vvar]
7ffc082e6000-7ffc082e8000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
此處可以清晰的看到在程序空間裡同時存在vdso與vsyscall,我曾試著將這兩個檔案轉儲出來,不過還沒有成功。
所以我也就沒有辦法從現象出發對原始碼進行分析。
此處還要提乙個函式名為__kernel_vsyscall,名字和vsyscall很像,不過正好相反,這個函式是與vdso相關的函式。根據《深入理解linux核心》,__kernel_vsyscall是為相容int 0x80與sysenter兩種系統呼叫觸發方式,而存在的函式。但在x64上不再需要__kernel_vsyscall,因為它只有一種呼叫方式,即syscall指令。
SQL與NoSQL MySQL與NoSQL的融合
寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...
指標與陣列 a與 a區別
假設宣告了乙個陣列a,則 a表示陣列a的首位址,a與 a 0 表示陣列a首元素的首位址,那麼 a 1與a 1有哪些區別呢?通過下面的實驗來說明。int i 0 int a 5 int p int a 1 for i 0 i 5 i printf a 0x p,a 0x p,a 1 0x p n a,...
apache與tomcat與weblogic對比
apache,tomcat,weblogic都是常用的中介軟體,發布 等應用都離不開這些好東東。強大程度對比apache 新手容易將apache與tomcat混亂。apache與tomcat都是同乙個公司生產的,apache是輕量級的,tomcat是企業級的。apache一般與php mysql等整...