套接字系統調用如何到達sys_socketcall
accept函數為例
系統調用中參數從用戶態向內核態的傳遞是通過寄存器完成的,eax表示系統調用,ebx表示第一個參數,ecx表示第二個參數,edx表示第三個參數(主要針對socke.S)
第一層:accept.s文件
(glibc函數庫)sysdepsunissysvlinuxaccept.S
#define socket accept //將socket定義為accept
#define _socket _libc_accept
#define NARGS 3 //系統調用的個數
#include < socket.S > //這幾個套接字函數的通用實現
第二層:socket.S文件
#include < sysdep.h >
#include < sys/socketcall.h >
#define P(a, b) P2(a, b)
#define P2(a, b) a##b
.text
/* The socket-oriented system calls are handled unusally in Linux.
They are all gated through the single `socketcall' system call number.
`socketcall' takes two arguments: the first is the subcode, specifying
which socket function is being called; and the second is a pointer to
the arguments to the specific function.
The .S files for the other calls just #define socket and #include this. */
.globl P(__,socket)
ENTRY (P(__,socket))
/* Save registers. */
movl %ebx, %edx
movl $SYS_ify(socketcall), %eax/* System call number in %eax. */
//展開$SYS_iff()宏
/* Use ## so `socket' is a separate token that might be #define'd. */
movl $P(SOCKOP_,socket), %ebx/* Subcode is first arg to syscall. */
lea 4(%esp), %ecx/* Address of args is 2nd arg. */
/* Do the system call trap. */
int $0x80
/* Restore registers. */
movl %edx, %ebx
/* %eax is < 0 if there was an error. */
cmpl $-125, %eax
jae syscall_error
/* Successful; return the syscall's value. */
ret
PSEUDO_END (P(__,socket))
c
weak_alias (P(__,socket), socket)
重點看:
movl $SYS_ify(socketcall), %eax /* System call number in %eax. */
展開SYS_iff()宏 (glibc函數庫: sysdepsunixsysdep.h)
#ifdef __STDC__
#define SYS_ify(syscall_name) SYS_##syscall_name
#else
#define SYS_ify(syscall_name) SYS_/**/syscall_name
#endif
預處理后為:
movl $SYS_socketcall,%eax
//將系統調用號放入eax中,但是對于網絡套接字所有的接口函數而言,他們的共同入口函數是sys_socketcall
//在內核中,總入口函數sys_socketcall的系統調用號為_NR_socketcall,定義在include/linux/unistd.h
#define __NR_socketcall102
//在glib函數庫中,有如下的預定義
#define SYS_socketcall _NR_socketcall
所以:
movl $SYS_socketcall,%eax
//將sys_socketcall函數對應的系統調用號賦予eax寄存器,從而使套接字系統調用進入到正常的入口函數中
這樣套接字系統調用進入到正確的函數中了。
那么第一個參數是識別系統調用的具體函數的,這個參數在socket.S(glibc庫)中:
movl $P(SOCKOP_,socket), %ebx
//預處理后:
movl $SOCKOP_accept,%ebx//這就完成了第一個參數的傳遞
關于SOCKOP_accept:
查看(glibc庫:sysdepsunixsysvlinuxsocketcall.h)
#ifndef _SYS_SOCKETCALL_H
#define _SYS_SOCKETCALL_H 1
/* Define unique numbers for the operations permitted on socket. Linux
uses a single system call for all these functions. The relevant code
file is /usr/include/linux/net.h.
We cannot use a enum here because the values are used in assembler
code. */
#define SOCKOP_socket 1
#define SOCKOP_bind 2
#define SOCKOP_connect 3
#define SOCKOP_listen 4
//可以看到SOCKOP_accept對應的值為5
#define SOCKOP_accept 5
#define SOCKOP_getsockname 6
#define SOCKOP_getpeername 7
#define SOCKOP_socketpair 8
#define SOCKOP_send 9
#define SOCKOP_recv 10
#define SOCKOP_sendto 11
#define SOCKOP_recvfrom 12
#define SOCKOP_shutdown 13
#define SOCKOP_setsockopt 14
#define SOCKOP_getsockopt 15
#define SOCKOP_sendmsg 16
#define SOCKOP_recvmsg 17
#endif /* _SYS_SOCKETCALL_H */
在linux內核(include/linux/net.h):
#ifndef _SYS_SOCKETCALL_H
#define _SYS_SOCKETCALL_H 1
/* Define unique numbers for the operations permitted on socket. Linux
uses a single system call for all these functions. The relevant code
file is /usr/include/linux/net.h.
We cannot use a enum here because the values are used in assembler
code. */
#define SOCKOP_socket 1
#define SOCKOP_bind 2
#define SOCKOP_connect 3
#define SOCKOP_listen 4
//這與glibc庫中的SOCKOP_accept對應的值相同
#define SOCKOP_accept 5
#define SOCKOP_getsockname 6
#define SOCKOP_getpeername 7
#define SOCKOP_socketpair 8
#define SOCKOP_send 9
#define SOCKOP_recv 10
#define SOCKOP_sendto 11
#define SOCKOP_recvfrom 12
#define SOCKOP_shutdown 13
#define SOCKOP_setsockopt 14
#define SOCKOP_getsockopt 15
#define SOCKOP_sendmsg 16
#define SOCKOP_recvmsg 17
#endif /* _SYS_SOCKETCALL_H */
第二個參數
在socket.S中:以指針的方式設置了sys_socketcall的第二個參數
lea 4(%esp), %ecx /* Address of args is 2nd arg. */
設置完以上的系統調用號還有參數后進入軟中斷:int $0x80,進入了內核態進行處理
第三層:entry.S文件
_system_call:
pushl %eax # save orig_eax
SAVE_ALL
movl $-ENOSYS,EAX(%esp)
cmpl $(NR_syscalls),%eax
jae ret_from_sys_call
/*對應上面,未調用軟中斷之前,eax寄存器中被初始化為系統調用號,即_NR_socketcall,
這個調用號別用于在_sys_call_table數組中進行函數指針的尋址,將對應的函數地址對eax寄存器賦值 */
movl _sys_call_table(,%eax,4),%eax
testl %eax,%eax
je ret_from_sys_call
movl _current,%ebx
andl $~CF_MASK,EFLAGS(%esp) # clear carry - assume no errors
movl $0,errno(%ebx)
movl %db6,%edx
movl %edx,dbgreg6(%ebx) # save current hardware debugging status
testb $0x20,flags(%ebx) # PF_TRACESYS
jne 1f
/*上面給eax復制后,這里進行調用該函數,到這為止,accept系統調用將請求傳遞給了sys_socketcall,
然后將socket.S中設置的參數傳遞給sock_accept函數,就完成了應用層接口函數accept到BSD socket層函數的請求傳遞工作
*/
call *%eax
movl %eax,EAX(%esp) # save the return value
movl errno(%ebx),%edx
negl %edx
je ret_from_sys_call
movl %edx,EAX(%esp)
orl $(CF_MASK),EFLAGS(%esp) # set carry to indicate error
jmp ret_from_sys_call
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
寄存器
+關注
關注
31文章
5608瀏覽量
129970 -
函數
+關注
關注
3文章
4417瀏覽量
67504 -
系統
+關注
關注
1文章
1046瀏覽量
22311
發布評論請先 登錄
相關推薦
熱點推薦
【MiCOKit試用體驗】慶科MiCO系統篇(5)MiCO 套接字
管理協議)、DNS(主域名稱系統)、TFTP(通用文件傳輸協議)等。TCP的通信機制大體可如下圖所示UDP的通信機制大體可如下圖所示二 MiCOKit套接字在MiCOKit中,有關Socket
發表于 10-24 17:05
命名UNIX域套接字
雖然socketpair函數能創建一對相互連接的套接字,但是每一個套接字都沒有名字。這意味著無關進程不能使用它們。如果我們試圖綁定同一地址時,該文件已經存在,那么bind請求會失敗。當
發表于 09-02 14:45
交換機網絡從Soft_AP到Infrastructure后,套接字始終返回無效
與以下代碼的客戶端連接通過這個實現,TCPPOEN函數返回一個有效的套接字,但是在進入無限循環之后,我們通過在網頁中配置網絡來配置網絡處于基礎結構模式。當
發表于 04-24 09:57
STM32例程能否與MFC網絡套接字通信?
如題。。想自己寫一個PC上的MFC界面。不要求太高的實時性和過大過高的傳輸數據量,偶爾一次傳輸幾十字節即可,不知道STM32例程能否與MFC網絡套接字通信。如果可以就入手一套了,另外,
發表于 08-02 04:36
如何通過socket系統調用創建一個套接字
。服務器端:首先服務器 應用程序通過socket系統調用創建一個套接字,他是系統分配給該服務器進程的類似文件描述符的資源,不能和其他進程分享
發表于 12-24 06:38
RTT網絡框架及SAL套接字抽象層介紹
基于自己對各層級的理解,作為劃分依據。應用編程、協議棧與網卡驅動首先請允許我簡單粗暴地把所有基于協議棧應用接口開發的相關代碼,都歸屬于應用編程下,在帶操作系統的情況下,通常協議棧都會提供套接字
發表于 07-28 11:40
netlink 套接字在系統通信中的應用研究
分析了當前普遍應用的幾種內核和用戶進程的通信方式的不足,詳細討論了linux2.4 以上版本所提供的netlink套接字在內核和用戶進程通信中的應用。Linux 作為一種全新的、功能齊備
發表于 08-18 08:47
?17次下載
Windows網絡編程的原始套接字詳細說明
利用“原始套接字”(Raw Socket),我們可訪問位于基層的傳輸協議。本章專門講解如何運用這種原始套接字,來模擬 IP的一些實用工具,比如 Tr a c e r o u t e和P
發表于 03-21 08:00
?1次下載
基于AT89C52單片機和LT8030實現套接字規范的計算機通信設計
在網絡設置中有HTTP、SOCKET等類型。SOCKET是建立在傳輸層協議(主要是TCP和UDP)上的一種套接字規范,它定義兩臺計算機間進行通信的規范(也是一種編程規范)。如果說兩臺計算機是利用一個
套接字socket包含哪些參數
套接字(Socket)是計算機網絡中最基本的通信抽象,它定義了兩個進程間通信的端點。在TCP/IP協議棧中,套接字是實現
網絡套接字系統調用如何到達sys_socketcall
評論