簡體   English   中英

在x86_64 Linux上定義的ioctl系統調用的用戶空間包裝器在哪里?

[英]Where is userspace wrapper for ioctl system call defined on x86_64 Linux?

我(出於好奇)一直想知道在x86_64 Linux上定義了ioctl系統調用的用戶空間包裝器。 我的第一個想法是glibc - 在我的Fedora 24盒子上檢查已安裝版本上的暴露符號之后,我可以看到(除非我做錯了)libc將ioctl符號暴露為'W'意味着它是一個弱符號默認實現。 misc / ioctl.c中的glibc源代碼樹中的默認實現似乎是一個存根,只是將errno設置為ENOSYS並返回-1。

從來沒有,ioctl工作(顯然或我的系統不會很有用)。 我知道它可能是匯編代碼在一個文件中的某個地方以某種方式組裝和鏈接,從而覆蓋glibc暴露的弱符號。 我也知道應用程序完全可以使用系統調用直接調用ioctl,可以通過glibc syscall包裝器直接調用也可以直接使用程序集調用。

也就是說,鑒於庫源代碼我碰巧觀察(libdrm)包含標准的ioctl頭文件/usr/include/sys/ioctl.h,並且似乎沒有包含我自己可以看到的包裝器實現,我想知道我應該在哪里看。

這是我更深入地了解GNU / Linux系統最低級別的一部分。 感謝您的任何指示,並且如果之前已經提出過這樣的道歉,但如果有的話,我看不到任何答案。

更新:我忽略了上面提到但我還檢查了內核映射的虛擬vdso庫 - 我只能在其中找到以下內容:

0000000000000a00 W clock_gettime
0000000000000db0 W getcpu
0000000000000c40 W gettimeofday
0000000000000000 A LINUX_2.6
0000000000000d90 W time
0000000000000a00 T __vdso_clock_gettime
0000000000000db0 T __vdso_getcpu
0000000000000c40 T __vdso_gettimeofday
0000000000000d90 T __vdso_time

更新:看起來我錯誤的glibc默認定義是存根。 正如nos在評論中指出的那樣,反匯編表明它正在執行真正的系統調用。 我已經發布了一個答案來反映這一點。

正如我在原始問題的評論中提到的那樣,它實際上確實在libc中定義,在我的例子中如下:

00000000000f8ce0 <ioctl>:
   f8ce0:       b8 10 00 00 00          mov    $0x10,%eax
   f8ce5:       0f 05                   syscall
   f8ce7:       48 3d 01 f0 ff ff       cmp    $0xfffffffffffff001,%rax
   f8ced:       73 01                   jae    f8cf0 <ioctl+0x10>
   f8cef:       c3                      retq
   f8cf0:       48 8b 0d 71 31 2c 00    mov    0x2c3171(%rip),%rcx        # 3bbe68 <_DYNAMIC+0x308>
   f8cf7:       f7 d8                   neg    %eax
   f8cf9:       64 89 01                mov    %eax,%fs:(%rcx)
   f8cfc:       48 83 c8 ff             or     $0xffffffffffffffff,%rax
   f8d00:       c3                      retq
   f8d01:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
   f8d08:       00 00 00
   f8d0b:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)

這顯然是在這里進行系統調用 - 正如nos所說,它必須是自動生成的,這就是我無法在glibc源代碼樹中直接找到它的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM