vdso(7) - wariua/manpages-ko GitHub Wiki

NAME

vdso - 가상 ELF 동적 곡유 였브젝트 μ†Œκ°œ

SYNOPSIS

#include <sys/auxv.h>

void *vdso = (uintptr_t) getauxval(AT_SYSINFO_EHDR);

DESCRIPTION

"vDSO" (virtual dynamic shared object: 가상 동적 곡유 였브젝트)λŠ” 컀널이 λͺ¨λ“  μ‚¬μš©μž 곡간 μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ μ£Όμ†Œ κ³΅κ°„μœΌλ‘œ μžλ™μœΌλ‘œ λ§΅ ν•˜λŠ” μž‘μ€ 곡유 λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€. 보톡 vDSOλ₯Ό ν˜ΈμΆœν•˜λŠ” 것은 C λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ―€λ‘œ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” 일반적으둜 μžμ„Έν•œ λ‚΄μš©μ— μ‹ κ²½μ“Έ ν•„μš”κ°€ μ—†λ‹€. ν‘œμ€€ ν•¨μˆ˜λ“€μ„ μ‚¬μš©ν•˜λŠ” 정상적인 λ°©μ‹μœΌλ‘œ μ½”λ”© ν•˜λ©΄ C λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ•Œμ•„μ„œ vDSOλ₯Ό 톡해 μ‚¬μš© κ°€λŠ₯ν•œ κΈ°λŠ₯듀을 μ΄μš©ν•œλ‹€.

그런데 vDSOλŠ” λ„λŒ€μ²΄ μ™œ μ‘΄μž¬ν•˜λŠ” κ²ƒμΌκΉŒ? 컀널이 μ œκ³΅ν•˜λŠ” μ‹œμŠ€ν…œ 호좜 μ€‘μ—λŠ” μ‚¬μš©μž 곡간 μ½”λ“œμ—μ„œ μ›Œλ‚™ λΉˆλ²ˆν•˜κ²Œ μ‚¬μš©ν•΄μ„œ κ·Έ ν˜ΈμΆœλ“€μ΄ 전체 μ„±λŠ₯에 크게 영ν–₯을 쀄 수 μžˆλŠ” 것듀이 μžˆλ‹€. 이건 호좜 λΉˆλ„λ§Œμ΄ μ•„λ‹ˆλΌ μ‚¬μš©μž 곡간을 λΉ μ Έλ‚˜μ™€ μ»€λ„λ‘œ λ“€μ–΄κ°€λŠ” κ²ƒμœΌλ‘œ μΈν•œ λ¬Έλ§₯ μ „ν™˜ μ˜€λ²„ν—€λ“œ λ•Œλ¬Έμ΄κΈ°λ„ ν•˜λ‹€.

이 λ¬Έμ„œμ˜ λ‚˜λ¨Έμ§€ 뢀뢄은 일반 κ°œλ°œμžλ³΄λ‹€λŠ” ν˜ΈκΈ°μ‹¬ μžˆλŠ” 이듀 및/λ˜λŠ” C 라이브러리 μž‘μ„±μžμ—κ²Œ 맞좰져 μžˆλ‹€. λ§Œμ•½ C 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹ μ— μ‘μš©μ—μ„œ vDSOλ₯Ό ν˜ΈμΆœν•˜λ € ν•˜κ³  μžˆλ‹€λ©΄ μ•„λ§ˆλ„ λΆ„λͺ…νžˆ 잘λͺ»ν•˜κ³  μžˆλŠ” 것이닀.

λ°°κ²½ μ˜ˆμ‹œ

μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ ν•˜λŠ” 것은 느릴 수 μžˆλ‹€. x86 32λΉ„νŠΈ μ‹œμŠ€ν…œμ—μ„œλŠ” μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈ(int $0x80)λ₯Ό μœ λ°œμ‹œμΌœμ„œ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ ν•˜κ³  μ‹Άλ‹€κ³  μ»€λ„μ—κ²Œ μ•Œλ €μ€„ 수 μžˆλ‹€. ν•˜μ§€λ§Œ 이 μΈμŠ€νŠΈλŸ­μ…˜μ€ λΉ„μš©μ΄ 크닀. ν”„λ‘œμ„Έμ„œμ˜ λ§ˆμ΄ν¬λ‘œμ½”λ“œμ™€ 컀널 λ‚΄μ˜ μΈν„°λŸ½νŠΈ 처리 경둜 전체λ₯Ό κ±°μΉœλ‹€. 더 μ΅œμ‹  ν”„λ‘œμ„Έμ„œμ—λŠ” μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ κ°œμ‹œν•  수 μžˆλŠ” 더 λΉ λ₯Έ (ν•˜μ§€λ§Œ ν•˜μœ„ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ”) μΈμŠ€νŠΈλŸ­μ…˜μ΄ μžˆλ‹€. λŸ°νƒ€μž„μ— 이 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλŠ”μ§€λ₯Ό C λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ•Œμ•„λ‚΄κΈ°λŠ” μš”κ΅¬ν•˜λŠ” λŒ€μ‹ μ— 컀널이 vDSO둜 μ œκ³΅ν•˜λŠ” ν•¨μˆ˜λ“€μ„ C λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ‚¬μš©ν•˜κ²Œ ν•  수 μžˆλ‹€.

μš©μ–΄κ°€ ν˜Όλž€μŠ€λŸ¬μšΈ 수 μžˆμœΌλ‹ˆ μ£Όμ˜ν•˜λΌ. x86 μ‹œμŠ€ν…œμ—μ„œ μš°μ„ μ μΈ μ‹œμŠ€ν…œ 호좜 방법을 μ•Œμ•„λ‚΄λŠ” 데 μ‚¬μš©ν•˜λŠ” vDSO ν•¨μˆ˜μ˜ 이름이 "__kernel_vsyscall"인데, x86-64μ—μ„œλŠ” "vsyscall"μ΄λΌλŠ” μš©μ–΄κ°€ μ§€κΈˆμ΄ λͺ‡ μ‹œμ΄κ³  ν˜ΈμΆœμžκ°€ μ–΄λŠ CPUμ—μ„œ 돌고 μžˆλŠ”μ§€ μ»€λ„μ—κ²Œ 물을 수 μžˆλŠ” ꡬ식 방법을 가리킀기도 ν•œλ‹€.

자주 μ“°λŠ” μ‹œμŠ€ν…œ 호좜둜 gettimeofday(2)κ°€ μžˆλ‹€. 이 μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©μž 곡간 μ‘μš©μ—μ„œ 직접 λΆ€λ₯΄κΈ°λ„ ν•˜κ³  C λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ κ°„μ ‘μ μœΌλ‘œ λΆ€λ₯΄κΈ°λ„ ν•œλ‹€. νƒ€μž„μŠ€νƒ¬ν”„λ‚˜ μ‹œκ°„ μ œμ–΄ 루프, 폴링을 생각해 보라. 이 λͺ¨λ‘μ—μ„œλŠ” λ°”λ‘œ μ§€κΈˆ μ‹œκ°„μ„ 자주 μ•Œμ•„λ‚΄μ•Ό ν•œλ‹€. λ˜ν•œ 이 μ •λ³΄λŠ” 비밀이 μ•„λ‹ˆλ‹€. μ–΄λŠ 특ꢌ λͺ¨λ“œμ˜ μ–΄λ–€ μ‘μš©μ—μ„œλ„ (λ£¨νŠΈλ„, λ‹€λ₯Έ λΉ„νŠΉκΆŒ μ‚¬μš©μžλ„) 같은 닡을 μ–»κ²Œ λœλ‹€. λ”°λΌμ„œ 컀널은 이 μ§ˆλ¬Έμ— λ‹΅ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 정보λ₯Ό ν”„λ‘œμ„ΈμŠ€κ°€ μ ‘κ·Όν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬ 내에 μœ„μΉ˜μ‹œν‚¨λ‹€. 그러면 μ‹œμŠ€ν…œ ν˜ΈμΆœμ΄μ—ˆλ˜ gettimeofday(2)κ°€ 일반 ν•¨μˆ˜ 호좜과 λͺ‡ 번의 λ©”λͺ¨λ¦¬ μ ‘κ·ΌμœΌλ‘œ 바뀐닀.

vDSO μ°ΎκΈ°

(μ‘΄μž¬ν•˜λŠ” 경우) vDSO의 κΈ°μ€€ μ£Όμ†ŒλŠ” 초기 보쑰 벑터(getauxval(3) μ°Έκ³ )의 AT_SYSINFO_EHDR νƒœκ·Έλ₯Ό 톡해 컀널이 각 ν”„λ‘œκ·Έλž¨μ—κ²Œ 전달해 μ€€λ‹€.

vDSOκ°€ μ‚¬μš©μž λ©”λͺ¨λ¦¬ 맡의 νŠΉμ • μœ„μΉ˜μ— μ‚¬μƒλ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•΄μ„œλŠ” μ•ˆ λœλ‹€. 일반적으둜 μƒˆ ν”„λ‘œμ„ΈμŠ€ 이미지가 λ§Œλ“€μ–΄μ§ˆ λ•Œλ§ˆλ‹€ (execve(2) μ‹œμ μ—) κΈ°μ€€ μ£Όμ†Œκ°€ μž„μ˜λ‘œ μ •ν•΄μ§„λ‹€. μ΄λ ‡κ²Œ ν•˜λŠ” 건 "return-to-libc" 곡격을 막기 μœ„ν•œ λ³΄μ•ˆμ  이유 λ•Œλ¬Έμ΄λ‹€.

일뢀 μ•„ν‚€ν…μ²˜μ—λŠ” AT_SYSINFO νƒœκ·Έλ„ μžˆλ‹€. 이 νƒœκ·ΈλŠ” vsyscall μ§„μž…μ μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ κ²ƒμœΌλ‘œ, λ§Žμ€ 경우 λΉ μ Έ μžˆκ±°λ‚˜ 0으둜 μ„€μ •λ˜μ–΄ μžˆλ‹€. (즉, μ‚¬μš© κ°€λŠ₯ν•˜μ§€ μ•Šλ‹€.) 이 νƒœκ·ΈλŠ” 초기 vDSO μž‘μ—…μ˜ μœ μ‚°μ΄λ©° (μ•„λž˜μ˜ 역사 μ°Έκ³ ) μ‚¬μš©μ„ ν”Όν•˜λŠ” 게 μ’‹λ‹€.

파일 ν˜•μ‹

vDSOλŠ” μ™„μ „ν•œ ν˜•νƒœμ˜ ELF μ΄λ―Έμ§€μ΄λ―€λ‘œ κ±°κΈ°μ„œ 심볼 검색을 ν•  수 μžˆλ‹€. κ·Έλž˜μ„œ μ΅œμ‹  컀널 λ¦΄λ¦¬μŠ€μ—μ„œ μƒˆ 심볼을 μΆ”κ°€ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ©° μ—¬λŸ¬ 컀널 λ²„μ „λ“€μ—μ„œ λ™μž‘ν•˜λŠ” C λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λŸ°νƒ€μž„μ— μ‚¬μš© κ°€λŠ₯ν•œ κΈ°λŠ₯을 탐지할 수 μžˆλ‹€. λ§Žμ€ κ²½μš°μ— C λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 첫 번째 ν˜ΈμΆœμ—μ„œ 탐지λ₯Ό ν•˜κ³ μ„œ 이후 ν˜ΈμΆœμ„ μœ„ν•΄ κ·Έ κ²°κ³Όλ₯Ό 캐싱 ν•œλ‹€.

λͺ¨λ“  μ‹¬λ³Όμ—λŠ” λ˜ν•œ 버전이 μžˆλ‹€. (GNU 버전 ν˜•μ‹μ„ μ‚¬μš©ν•œλ‹€.) κ·Έλž˜μ„œ 컀널이 ν•˜μœ„ ν˜Έν™˜μ„±μ„ κΉ¨μ§€ μ•ŠμœΌλ©΄μ„œ ν•¨μˆ˜ μ‹œκ·Έλ„ˆμ²˜λ₯Ό κ°±μ‹ ν•  수 μžˆλ‹€. λ°˜ν™˜ 값뿐 μ•„λ‹ˆλΌ ν•¨μˆ˜κ°€ λ°›λŠ” 인자λ₯Ό λ°”κΎΈλŠ” 것도 κ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ vDSOμ—μ„œ 심볼 검색을 ν•  λ•ŒλŠ” 항상 κΈ°λŒ€ν•˜λŠ” ABI에 λ§žλŠ” 버전을 ν¬ν•¨μ‹œμΌœμ•Ό ν•œλ‹€.

보톡 vDSOλŠ” λ‹€λ₯Έ ν‘œμ€€ 심볼과 κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ λͺ¨λ“  심볼 μ•žμ— "__vdso_"λ‚˜ "__kernel_"을 λΆ™μ΄λŠ” λͺ…λͺ… 관행을 λ”°λ₯Έλ‹€. 예λ₯Ό λ“€μ–΄ "gettimeofday" ν•¨μˆ˜μ˜ 이름이 "__vdso_gettimeofday"κ°€ λœλ‹€.

이 ν•¨μˆ˜λ“€μ„ ν˜ΈμΆœν•  λ•ŒλŠ” ν‘œμ€€ C 호좜 방식을 μ‚¬μš©ν•œλ‹€. μ΄μƒν•œ λ ˆμ§€μŠ€ν„° λ‚΄μ§€ μŠ€νƒ λ™μž‘ 방식에 λŒ€ν•΄ μ—Όλ €ν•  ν•„μš”κ°€ μ—†λ‹€.

NOTES

μ†ŒμŠ€

컀널을 컴파일 ν•  λ•Œ μžλ™μœΌλ‘œ vDSO μ½”λ“œλ₯Ό 컴파일 및 링크 ν•΄ μ€€λ‹€. λ§Žμ€ 경우 μ•„ν‚€ν…μ²˜λ³„ 디렉터리 μ•ˆμ— λ“€μ–΄ μžˆλ‹€.

find arch/$ARCH/ -name '*vdso*.so*' -o -name '*gate*.so*'

vDSO 이름

vDSO의 이름이 μ•„ν‚€ν…μ²˜λ§ˆλ‹€ λ‹€λ₯΄λ‹€. glibc의 ldd(1) 좜λ ₯ 같은 것에 μ’…μ’… λ“±μž₯ν•˜κ²Œ λœλ‹€. μ–΄λ–€ μ½”λ“œμ—λ„ κ·Έ μ •ν™•ν•œ 이름이 μ€‘μš”ν•΄μ„œλŠ” μ•ˆ λ˜λ―€λ‘œ 이름을 ν•˜λ“œμ½”λ”© ν•΄μ„œλŠ” μ•ˆ λœλ‹€.

μ‚¬μš©μž ABI vDSO 이름
aarch64 linux-vdso.so.1
arm linux-vdso.so.1
ia64 linux-gate.so.1
mips linux-vdso.so.1
ppc/32 linux-vdso32.so.1
ppc/64 linux-vdso64.so.1
riscv linux-vdso.so.1
s390 linux-vdso32.so.1
s390x linux-vdso64.so.1
sh linux-gate.so.1
i386 linux-gate.so.1
x86-64 linux-vdso.so.1
x86/x32 linux-vdso.so.1

strace(1) 및 seccomp(2)와 vDSO

strace(1)둜 μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ 좔적할 λ•Œ vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀(μ‹œμŠ€ν…œ ν˜ΈμΆœλ“€)은 좔적 좜λ ₯에 λ‚˜μ˜€μ§€ μ•ŠλŠ”λ‹€. μœ μ‚¬ν•˜κ²Œ 그런 μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ seccomp(2) 필터에 보이지 μ•ŠλŠ”λ‹€.

ARCHITECTURE-SPECIFIC NOTES

μ•„λž˜μ˜ λΆ€μ ˆλ“€μ€ vDSO에 λŒ€ν•œ μ•„ν‚€ν…μ²˜λ³„ λ‚΄μš©μ΄λ‹€.

참고둜 μ‚¬μš©ν•˜λŠ” vDSOλŠ” μ»€λ„μ˜ ABIκ°€ μ•„λ‹ˆλΌ μ‚¬μš©μž 곡간 μ½”λ“œμ˜ ABIλ₯Ό κΈ°μ€€μœΌλ‘œ ν•œλ‹€. λ”°λΌμ„œ 예λ₯Ό λ“€μ–΄ i386 32λΉ„νŠΈ ELF λ°”μ΄λ„ˆλ¦¬λ₯Ό λŒλ¦°λ‹€λ©΄ 이λ₯Ό i386 32λΉ„νŠΈ μ»€λ„μ—μ„œ λŒλ¦¬λ“  x86-64 64λΉ„νŠΈ μ»€λ„μ—μ„œ λŒλ¦¬λ“  상관없이 같은 vDSOλ₯Ό μ–»κ²Œ λœλ‹€. λ”°λΌμ„œ μ•„λž˜μ—μ„œ κ΄€λ ¨ μ ˆμ„ 찾을 λ•Œ μ‚¬μš©μž 곡간 ABI의 이름을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

ARM ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__vdso_gettimeofday LINUX_2.6 (λ¦¬λˆ…μŠ€ 4.1λΆ€ν„° λ‚΄λ³΄μž„)
__vdso_clock_gettime LINUX_2.6 (λ¦¬λˆ…μŠ€ 4.1λΆ€ν„° λ‚΄λ³΄μž„)

λ”λΆˆμ–΄ ARM ν¬νŠΈμ—λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λ“€λ‘œ κ°€λ“ν•œ μ½”λ“œ νŽ˜μ΄μ§€κ°€ μžˆλ‹€. κ·Έλƒ₯ μ½”λ“œκ°€ μžˆλŠ” νŽ˜μ΄μ§€μΌ λΏμ΄λ―€λ‘œ 심볼 κ²€μƒ‰μ΄λ‚˜ 버전 관리λ₯Ό μœ„ν•œ ELF 정보가 μ „ν˜€ μ—†λ‹€. ν•˜μ§€λ§Œ λ‹€λ₯Έ μ‹μœΌλ‘œ 버전을 μ§€μ›ν•œλ‹€.

이 μ½”λ“œ νŽ˜μ΄μ§€μ— λŒ€ν•΄ μ•Œλ €λ©΄ 컀널 λ¬Έμ„œλ₯Ό μ°Έμ‘°ν•˜λŠ” 것이 μ΅œμ„ μ΄λ‹€. μ•„μ£Ό μžμ„Έν•˜λ©° μ•Œμ•„μ•Ό ν•  λͺ¨λ“  것듀을 닀루고 μžˆλ‹€. Documentation/arm/kernel_user_helpers.txt이닀.

aarch64 ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__kernel_rt_sigreturn LINUX_2.6.39
__kernel_gettimeofday LINUX_2.6.39
__kernel_clock_gettime LINUX_2.6.39
__kernel_clock_getres LINUX_2.6.39

bfin (Blackfin) ν•¨μˆ˜ (λ¦¬λˆ…μŠ€ 4.17μ—μ„œ 포트 제거)

이 CPUμ—λŠ” λ©”λͺ¨λ¦¬ 관리 μœ λ‹›(MMU)이 μ—†μœΌλ―€λ‘œ 일반적 의미의 vDSOλ₯Ό λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€. λŒ€μ‹  λΆ€νŒ… λ•Œ μ €μˆ˜μ€€ ν•¨μˆ˜ λͺ‡ 개λ₯Ό λ©”λͺ¨λ¦¬μ˜ κ³ μ •λœ μœ„μΉ˜μ— λ§΅ ν•œλ‹€. 그러면 μ‚¬μš©μž 곡간 μ‘μš©μ—μ„œ κ·Έ μ˜μ—­μ„ λ°”λ‘œ ν˜ΈμΆœν•œλ‹€. ν•˜μœ„ ν˜Έν™˜μ„±μ— μžˆμ–΄μ„  opcodeλ₯Ό ν›”μ³λ³΄λŠ” 것 μ΄μƒμ˜ λ°©μ•ˆμ΄ μ—†μ§€λ§Œ μž„λ² λ””λ“œ CPUμ΄λ―€λ‘œ λ¬Έμ œκ°€ μ•ˆ λœλ‹€. 심지어 μ‹€ν–‰ν•˜λŠ” 였브젝트 ν˜•μ‹ 쀑 μΌλΆ€λŠ” ELF κΈ°λ°˜λ„ μ•„λ‹ˆλ‹€ (bFLT/FLAT).

이 μ½”λ“œ νŽ˜μ΄μ§€μ— λŒ€ν•œ μ •λ³΄λŠ” 곡개된 λ¬Έμ„œλ₯Ό μ°Έμ‘°ν•˜λŠ” 것이 μ΅œμ„ μ΄λ‹€: http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:fixed-code

mips ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__kernel_gettimeofday LINUX_2.6 (λ¦¬λˆ…μŠ€ 4.4λΆ€ν„° λ‚΄λ³΄μž„)
__kernel_clock_gettime LINUX_2.6 (λ¦¬λˆ…μŠ€ 4.4λΆ€ν„° λ‚΄λ³΄μž„)

ia64 (Itanium) ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__kernel_sigtramp LINUX_2.5
__kernel_syscall_via_break LINUX_2.5
__kernel_syscall_via_epc LINUX_2.5

μ•„μ΄ν…Œλ‹ˆμ—„ ν¬νŠΈλŠ” μ’€ λ³΅μž‘ν•˜λ‹€. μœ„μ˜ vDSO에 λ”ν•΄μ„œ "κ²½λŸ‰ μ‹œμŠ€ν…œ 호좜"("fast syscall" λ‚΄μ§€ "fsys"라고도 함)μ΄λΌλŠ” 것이 있으며 vDSO 헬퍼 __kernel_syscall_via_epcλ₯Ό 톡해 ν˜ΈμΆœν•  수 μžˆλ‹€. μ—¬κΈ° λ‚˜μ—΄λœ μ‹œμŠ€ν…œ ν˜ΈμΆœλ“€μ˜ λ™μž‘ κ²°κ³ΌλŠ” syscall(2)을 톡해 직접 ν˜ΈμΆœν–ˆμ„ λ•Œμ™€ λ™μΌν•˜λ―€λ‘œ 각각의 κ΄€λ ¨ λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜λΌ. μ•„λž˜ ν‘œμ—μ„œ 이 λ©”μ»€λ‹ˆμ¦˜μ„ 톡해 μ‚¬μš© κ°€λŠ₯ν•œ ν•¨μˆ˜λ“€μ„ 보여 μ€€λ‹€.

ν•¨μˆ˜
clock_gettime
getcpu
getpid
getppid
gettimeofday
set_tid_address

parisc (hppa) ν•¨μˆ˜

parisc ν¬νŠΈμ—λŠ” μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λ“€μ΄ μžˆλŠ” κ²Œμ΄νŠΈμ›¨μ΄ νŽ˜μ΄μ§€λΌλŠ” μ΄λ¦„μ˜ μ½”λ“œ νŽ˜μ΄μ§€κ°€ μžˆλ‹€. 일반적인 ELF 보쑰 벑터 방식을 μ‚¬μš©ν•˜λŠ” λŒ€μ‹  SR2 λ ˆμ§€μŠ€ν„°λ₯Ό 톡해 νŽ˜μ΄μ§€μ˜ μ£Όμ†Œλ₯Ό ν”„λ‘œμ„ΈμŠ€μ—κ²Œ μ „λ‹¬ν•œλ‹€. νŽ˜μ΄μ§€μ˜ κΆŒν•œμ€ κ·Έ μ£Όμ†Œλ₯Ό μ‹€ν–‰λ§Œ 해도 μžλ™μœΌλ‘œ μ‚¬μš©μž 곡간이 μ•„λ‹Œ 컀널 특ꢌ으둜 μ‹€ν–‰ν•˜κ²Œ λ˜μ–΄ μžˆλ‹€. HP-UX의 λ™μž‘ 방식과 μΌμΉ˜ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.

κ·Έλƒ₯ μ½”λ“œκ°€ μžˆλŠ” νŽ˜μ΄μ§€μΌ λΏμ΄λ―€λ‘œ 심볼 κ²€μƒ‰μ΄λ‚˜ 버전 관리λ₯Ό μœ„ν•œ ELF 정보가 μ „ν˜€ μ—†λ‹€. 브랜치 μΈμŠ€νŠΈλŸ­μ…˜μ„ 톡해 μ μ ˆν•œ μ˜€ν”„μ…‹μœΌλ‘œ ν˜ΈμΆœν•΄ λ“€μ–΄κ°€κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. 예:

ble <offset>(%sr2, %r0)
μ˜€ν”„μ…‹ ν•¨μˆ˜
00b0 lws_entry (CAS μ—°μ‚°λ“€)
00e0 set_thread_pointer (glibcμ—μ„œ μ‚¬μš©)
0100 linux_gateway_entry (syscall)

ppc/32 ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€. * ν‘œμ‹œκ°€ 된 ν•¨μˆ˜λŠ” 컀널이 PowerPC64 (64λΉ„νŠΈ) 컀널일 λ•Œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

심볼 버전
__kernel_clock_getres LINUX_2.6.15
__kernel_clock_gettime LINUX_2.6.15
__kernel_datapage_offset LINUX_2.6.15
__kernel_get_syscall_map LINUX_2.6.15
__kernel_get_tbfreq LINUX_2.6.15
__kernel_getcpu * LINUX_2.6.15
__kernel_gettimeofday LINUX_2.6.15
__kernel_sigtramp_rt32 LINUX_2.6.15
__kernel_sigtramp32 LINUX_2.6.15
__kernel_sync_dicache LINUX_2.6.15
__kernel_sync_dicache_p5 LINUX_2.6.15

CLOCK_REALTIME_COARSE 및 CLOCK_MONOTONIC_COARSE ν΄λŸ­μ€ __kernel_clock_getres 및 __kernel_clock_gettime μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. 컀널이 μ‹€μ œ μ‹œμŠ€ν…œ 호좜둜 λŒλ¦°λ‹€.

ppc/64 ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__kernel_clock_getres LINUX_2.6.15
__kernel_clock_gettime LINUX_2.6.15
__kernel_datapage_offset LINUX_2.6.15
__kernel_get_syscall_map LINUX_2.6.15
__kernel_get_tbfreq LINUX_2.6.15
__kernel_getcpu LINUX_2.6.15
__kernel_gettimeofday LINUX_2.6.15
__kernel_sigtramp_rt64 LINUX_2.6.15
__kernel_sync_dicache LINUX_2.6.15
__kernel_sync_dicache_p5 LINUX_2.6.15

CLOCK_REALTIME_COARSE 및 CLOCK_MONOTONIC_COARSE ν΄λŸ­μ€ __kernel_clock_getres 및 __kernel_clock_gettime μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. 컀널이 μ‹€μ œ μ‹œμŠ€ν…œ 호좜둜 λŒλ¦°λ‹€.

riscv ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__kernel_rt_sigreturn LINUX_4.15
__kernel_gettimeofday LINUX_4.15
__kernel_clock_gettime LINUX_4.15
__kernel_clock_getres LINUX_4.15
__kernel_getcpu LINUX_4.15
__kernel_flush_icache LINUX_4.15

s390 ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__kernel_clock_getres LINUX_2.6.29
__kernel_clock_gettime LINUX_2.6.29
__kernel_gettimeofday LINUX_2.6.29

x390x ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__kernel_clock_getres LINUX_2.6.29
__kernel_clock_gettime LINUX_2.6.29
__kernel_gettimeofday LINUX_2.6.29

sh (SuperH) ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__kernel_rt_sigreturn LINUX_2.6
__kernel_sigreturn LINUX_2.6
__kernel_vsyscall LINUX_2.6

i386 ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__kernel_sigreturn LINUX_2.5
__kernel_rt_sigreturn LINUX_2.5
__kernel_vsyscall LINUX_2.5
__vdso_clock_gettime LINUX_2.6 (λ¦¬λˆ…μŠ€ 3.15λΆ€ν„° λ‚΄λ³΄μž„)
__vdso_gettimeofday LINUX_2.6 (λ¦¬λˆ…μŠ€ 3.15λΆ€ν„° λ‚΄λ³΄μž„)
__vdso_time LINUX_2.6 (λ¦¬λˆ…μŠ€ 3.15λΆ€ν„° λ‚΄λ³΄μž„)

x86-64 ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€. 이 심볼듀 λͺ¨λ‘ "__vdso_" 접두뢀가 μ—†λŠ” ν˜•νƒœλ‘œλ„ μžˆμ§€λ§Œ 그건 λ¬΄μ‹œν•˜κ³  μ•„λž˜ λ‚˜μ—΄λœ μ΄λ¦„λ§Œ μ“°λŠ” 게 μ’‹λ‹€.

심볼 버전
__vdso_clock_gettime LINUX_2.6
__vdso_getcpu LINUX_2.6
__vdso_gettimeofday LINUX_2.6
__vdso_time LINUX_2.6

x86/x32 ν•¨μˆ˜

μ•„λž˜ ν‘œμ— vDSOκ°€ λ‚΄λ³΄μ΄λŠ” 심볼듀이 λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€.

심볼 버전
__vdso_clock_gettime LINUX_2.6
__vdso_getcpu LINUX_2.6
__vdso_gettimeofday LINUX_2.6
__vdso_time LINUX_2.6

역사

vDSOλŠ” μ›λž˜ ν•¨μˆ˜ ν•˜λ‚˜, 즉 vsyscallμ΄μ—ˆλ‹€. 이전 μ»€λ„λ“€μ—μ„œλŠ” "vdso"κ°€ μ•„λ‹ˆλΌ ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬ λ§΅μ—μ„œ κ·Έ 이름을 λ³Ό μˆ˜λ„ μžˆμ—ˆλ‹€. μ‹œκ°„μ΄ μ§€λ‚˜λ©΄μ„œ 이 λ©”μ»€λ‹ˆμ¦˜μ΄ μ‚¬μš©μž κ³΅κ°„μœΌλ‘œ 더 λ§Žμ€ κΈ°λŠ₯을 전달할 λ©‹μ§„ λ°©λ²•μ΄λΌλŠ” κ±Έ μ‚¬λžŒλ“€μ΄ μ•Œκ²Œ λ˜μ—ˆκ³ , κ·Έλž˜μ„œ ν˜„μž¬ ν˜•μ‹μ˜ vDSO둜 λ‹€μ‹œ μƒκ°ν•˜κ²Œ λ˜μ—ˆλ‹€.

SEE ALSO

syscalls(2), getauxval(3), proc(5)

λ¦¬λˆ…μŠ€ μ†ŒμŠ€ μ½”λ“œ 트리의 λ¬Έμ„œ, μ˜ˆμ‹œ, μ†ŒμŠ€ μ½”λ“œ:

  • Documentation/ABI/stable/vdso
  • Documentation/ia64/fsys.txt
  • Documentation/vDSO/* (vDSO μ‚¬μš© μ˜ˆμ‹œ 포함)
find arch/ -iname '*vdso*' -o -iname '*gate*'

2019-08-02

⚠️ **GitHub.com Fallback** ⚠️