色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

網絡套接字系統調用如何到達sys_socketcall

麥辣雞腿堡 ? 來源:技術簡說 ? 作者:技術簡說 ? 2023-07-24 11:35 ? 次閱讀

套接字系統調用如何到達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

    文章

    5342

    瀏覽量

    120297
  • 函數
    +關注

    關注

    3

    文章

    4329

    瀏覽量

    62588
  • 系統
    +關注

    關注

    1

    文章

    1016

    瀏覽量

    21338
收藏 人收藏

    評論

    相關推薦

    【MiCOKit試用體驗】慶科MiCO系統篇(5)MiCO 套接

    管理協議)、DNS(主域名稱系統)、TFTP(通用文件傳輸協議)等。TCP的通信機制大體可如下圖所示UDP的通信機制大體可如下圖所示二 MiCOKit套接在MiCOKit中,有關Socket
    發表于 10-24 17:05

    UNIX域套接

    UNIX域套接用于在同一臺計算機上運行的進程之間的通信。雖然因特網域套接可用于同一目的,但UNIX域套接
    發表于 09-02 11:59

    命名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

    Harmony堆棧為什么會立即終止套接嗎?

    配置了20個NET_PRES套接、8個BSD套接和20個TCPIP套接。TCPIP堆為64
    發表于 03-19 10:43

    如何通過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次下載
    Windows<b class='flag-5'>網絡</b>編程的原始<b class='flag-5'>套接</b><b class='flag-5'>字</b>詳細說明

    DN93-PCMCIA套接交換

    DN93-PCMCIA套接交換
    發表于 04-19 18:20 ?14次下載
    DN93-PCMCIA<b class='flag-5'>套接</b><b class='flag-5'>字</b>交換

    基于AT89C52單片機和LT8030實現套接規范的計算機通信設計

    網絡設置中有HTTP、SOCKET等類型。SOCKET是建立在傳輸層協議(主要是TCP和UDP)上的一種套接規范,它定義兩臺計算機間進行通信的規范(也是一種編程規范)。如果說兩臺計算機是利用一個
    的頭像 發表于 06-24 16:56 ?2342次閱讀
    基于AT89C52單片機和LT8030實現<b class='flag-5'>套接</b><b class='flag-5'>字</b>規范的計算機通信設計

    Socket套接的原理說明

    和連接,許多計算機操作系統為應用程序與TCP/IP協議交互提供了稱為套接 (Socket)的接口,區分不同應用程序進程間的網絡通信和連接。 生成
    的頭像 發表于 06-18 19:16 ?1848次閱讀
    Socket<b class='flag-5'>套接</b><b class='flag-5'>字</b>的原理說明

    網絡系統調用網絡套接入口函數

    網絡套接入口函數 //所有的網絡套接系統
    的頭像 發表于 07-24 11:02 ?471次閱讀

    套接socket包含哪些參數

    套接(Socket)是計算機網絡中最基本的通信抽象,它定義了兩個進程間通信的端點。在TCP/IP協議棧中,套接是實現
    的頭像 發表于 08-16 11:02 ?427次閱讀
    主站蜘蛛池模板: 精品国产自在现线拍国语| 6080YYY午夜理论片在线观看| 日韩男明星| 欧美黑人巨大videos免费| 老师掀开短裙让我挺进动态| 精品国产手机视频在在线| 好男人好资源在线观看| 国产又湿又黄又硬又刺激视频| 国产精品久久久久久免费字体| 国产成人欧美日韩在线电影| 国产av久久免费观看| 处xxxx.88| 国产成人高清在线观看播放| 国产成人精品免费视频下载| 国产360激情盗摄全集| 国产成a人片在线观看视频99| 国产电影一区二区三区| 国产精品成人久久久久A伋| 国产欧美日韩精品a在线观看高清| 国产精品无码人妻99999| 国产三级在线精品男人的天堂| 国产在线精彩亚洲久久| 精品视频网站| 蜜桃视频无码区在线观看| 捏奶动态图吃奶动态图q| 日本女人下面毛茸茸| 四虎国产精品免费观看视频| 羞羞答答的免费视频在线观看| 亚洲精品永久免费| 中文无码不卡的岛国片国产片| 999国产高清在线精品| 不分昼夜H1V3| 国产久爱青草视频在线观看| 精品三级在线观看| 免费观看a视频| 日本一卡二卡三卡四卡无卡免费播放 | 全身无赤裸裸美女网站| 涩涩在线视频| 亚洲日本欧美天堂在线| 97人妻精品全国免费视频| 成人毛片手机版免费看|