24
LOGO Linux System Call ی ح ل صا ن می دس ا ن ه م اد : ن س ا ودی م ح م واد ج مد ح م و : ج! ش ن دا که ن! س ل م م عا ت س سی واحد ز ی1 ی ا5 ور پ5 پ ی س ش د ن ه! ش کده! ش ن دا92

SystemCall in Linux

Embed Size (px)

Citation preview

Page 1: SystemCall in Linux

LOGO

Linux System Call

دانشجو : محمدجواد محمودی استاد : مهندس امین صالحیواحد سیستم عامل شبکه

92دانشکده شهید شمسی پور پاییز

Page 2: SystemCall in Linux

سیستم عامل می تواند به سخت افزار دسترسی داشته -

از ب�ا استفاده توان�د و برنام�ه کاربردی نم�ی باش�د ول�ی

system call سیستم از را خاص�ی س�رویس درخواس�ت

از بخاط�ر حفاظ�ت هسته ای�ن فراین�د و کن�د عام�ل م�ی

دسترسی کاربر می باشد؛

- System call وقفه نرم افزاری است که برنامه کاربردی با

POSIX API’s از آن استفاده می کند؛

-API رابط کاربری سطح برنامه و سطح سیستم است ؛2/24SystemCall in Linux

Page 3: SystemCall in Linux

3/24SystemCall in Linux

Page 4: SystemCall in Linux

4/24SystemCall in Linux

Page 5: SystemCall in Linux

-System call در الیه هسته انجام می شود؛ شماره مختص به خود دارد؛system callهر -از - را ی�ک سرویس درخواس�ت کاربردی برنام�ه ی�ک فرآین�د وقت�ی

تشخیص داده می شود IDTهسته می دهد نوع وقفه از روی جدول

؛

ک�د اسمبلی Linuxدر - توس�ط انجام INT $0x80 فراخوان�ی س�یستم

می شود؛

eax)ک�ه ی�ک آرگومان اس�ت( را به ثبات system callهمچنی�ن شماره -

ی�ک دهد. م�ی چن�د APIپاس اس�ت ممک�ن system call کند تولی�د

بنابرای�ن برای مدیری�ت آ�ن ه�ا آرگومان های�ی ه�م فرس�تاده می شود

قرار می گیرد. ecx و ebxکه در ثبات های

5/24SystemCall in Linux

Page 6: SystemCall in Linux

6/24SystemCall in Linux

Page 7: SystemCall in Linux

-( آرای�ه linux kernel 2.6.11هس�ته از ای 289( خانه

sys_call_table سرویس �ر �ه آدرس ذخیره برای

systemcall .ی کند�آرای�ه که شماره اندی�س اس�تفاده م

است.eax میباشد در ثبات systemcallمربوط به

دس�تور- از اس�تفاده ب�ا 0x80 $ int ا�از sysenterی مد

ب�ه کاربر م�ی شود عملیات م�د هسته س�وییچ برای

systemcall تفاده از� از م�د هسته sysexit ی�ا iret و ب�ا اس

به مد کاربر سوییچ می شود.

7/24SystemCall in Linux

Page 8: SystemCall in Linux

8/24SystemCall in Linux

Page 9: SystemCall in Linux

9/24SystemCall in Linux

Page 10: SystemCall in Linux

10/24SystemCall in Linux

Page 11: SystemCall in Linux

TSS (TASKE STATE SEGMENT)

11/24SystemCall in Linux

Page 12: SystemCall in Linux

پردازنده برای مدیریت رجیستر ها از یک پشته خاص به این نام -

شامل رجیستر های دینامیک مثل سیستمی استفاده می کند که

.esp2 تا esp0و عمومی و رجیستر های استاتیک مثل

i/oتغییر مد کاربر و هسته و همچنین مدیریت دسترسی عموما برای - -

به هسته و برعکس استفاده می شود.

پردازنده آدرس پشته مد هسته را از آن بدست می آورد.)که در -

esp0)ذخیره شده است

- برای اینکه پردازنده در مد کاربر نتواند به این سگمنت دست -

است.DPL = 0پیدا کند مقدار

حاوی آدرس توصیفگر آن در جدول توصیفگر می tr- رجیستر

باشد.

GDT می باشد بنابراین بدون مراجعه به hidden آن base و limitمقادیر -

می تواند مستقیما به آدرس برود.

12/24

TSS (TASKE STATE SEGMENT)

SystemCall in Linux

Page 13: SystemCall in Linux

( استفاده میشو�د: MSR)از سه رجیستر خاص منظوره

SYSENTER_CS_MSR segment selector for kernel code segment

SYSENTER_EIP_MSR linear address for kernel entry point

SYSENTER_ESP_MSR kernel stack pointer

) ( سه رجیستر enable_sep_cpuدر هر پردازنده ای هسته بوسیله تابع

را مقدار دهی اولیه می کند :

می SYSENTER_CS_MSRرا در انتخابگر سگمنت کد هسته . 1

نویسد ؛

SYSENTER_CS_EIPرا در ) ( sysenter_entryتابع آدرس خطی . 2

می نویسد ؛

می SYSENTER_CS_ESPرا در TSSآدرس خطی انتهای مکان . 3

نویسد .

13/24SystemCall in Linux

Page 14: SystemCall in Linux

:syscall handlerفرآیند

وظایف زیر را� انجام می دهد :System call handlerیک

؛مقادیر رجیسترها در پشته سطح هسته نگهداری •

•Handler Systemcall service با استفاده از تابع

xyz ) (؛

ذخیره ارزش های روی خارج شدن از حالت دستیابی : •

پشته مد هسته در رجیسترها و سویچ شدن از مد هسته

به مد کاربر. 14/24SystemCall in Linux

Page 15: SystemCall in Linux

USER MODE KERNEL MODE

system_call: …. sys_xyz() …. SYSEXIT

sys_xyz(){ … }

xyz (){ …. SYSCALL …. }

. . . xyz (); . . .

API of system call

system call routin

in standard library

systemcall handler systemcall service routine

15/24SystemCall in Linux

Page 16: SystemCall in Linux

16/24

و پوشه های :برای اجرای یک فراخوان سیستمی ،فایل ها1. ~/linux/arch/i386/kernel/syscall_table.S MیMاMه MنMاMوMخMاMرMف MمMاMن MلMمMاMش

--------سMیMسMتMمMی

.M 2 -----------شMاMمMلM شMمMاMرMهM فMرMاMخMوMاMنM هMاMیM سMیMسMتMمMی/M~linux/include/asm−i386/unistd.h

3. ~/linux/include/linux/syscalls.h ----------------------- MعMبMاMوMت MلMمMاMش فMرMاMخMوMاMنM هMاMیM سMیMسMتMمMی

و فایل ها و پوشه های :تغییر را 1. ~/mycall پوشه ای برای نگهداری فایل

-----------------------------------------ها

2. ~/mycall/Makefile فایل اجرایی -----------------------------------------------3. ~/mycall/mycall.c ----------------------------- فایل منبع کد فراخوان هایسیستمی4. testmycall.c------------------------- فایلی که از فراخوان های سیستمیاستفاده می کند5. testmycall.h هدر فایل آن------------------------------------------------------

می کنیم.ایجادرا

SystemCall in Linux

Page 17: SystemCall in Linux

17/24SystemCall in Linux

Page 18: SystemCall in Linux

syscall_table.SAdd “.long sys_mycall" at the end of the list نام فراخوان سیستم را تعریف می کنیم

18/24

unistd.hAdd "#define __NR_mycall <Last_System_Call_Num + 1>" at the end of the list.If the last system call defined here is:"#define __NR_vmsplice316", then add:"#define __NR_mycall317" at the end of the list.And change "#define NR_syscalls 317" to:"#define NR_syscalls 318"syscalls.h Add "asmlinkage long sys_mycall(int i);” at the end of the file

Modify

SystemCall in Linux

Page 19: SystemCall in Linux

mycall : mycallیک پوشه در مسیر روبرو ایجاد می کنیم و نام آن را می گذاریم

/usr/src/linux

19/24

mycall.c mycall.cیک فایل در مسیر روبرو ایجاد می کنیم و نام آن را می گذاریم :

/usr/src/linux/mycall#include<linux/linkage.h>asmlinkage long sys_mycall(int i){return i+10;}Asmlinkage به کامپايلر مي گويد آرگوما نهاي تابع روي پشته ---- کرنل قرار دارد

Creat

testmycall.hاین هدر فایل را ایجاد می کنیم و شامل هر برنامه ای است که با فراخوان

سیستمی ما کار می کند#include<linux/unistd.h>#define __NR_mycall 317_syscall1(long, mycall, int, i)

Makefileobj−y := mycall.o

SystemCall in Linux

Page 20: SystemCall in Linux

20/24

Creat

testmycall.c MهMک MیMا MهMشMوMپ MنMاMمMه MرMد MمMه MاMر MلMیMاMف MنMیMاtestmycall.h MیMم M، MمMیMتMخMاMس MاMر

.MمMیMزMاMس

#include<stdio.h>#include<syscalls.h>#include "testmycall.h"int main(void){printf("%d\n", mycall(15));} long mycall(int i){return syscall(__NR_mycall, i);}

SystemCall in Linux

Page 21: SystemCall in Linux

socket)( : int socket)int domain, int type, int protocol(; create an endpoint for communication and returns a descriptor

21/24

domain selects the protocol family which will be used for communication. These families are defined in <sys/socket.h>

Local communication, IPv4 ,IPv6 ,  IPX - Novell ,  Kernel user interface device ,ITU-T X.25 / ISO-8208 ,etc.typewhich specifies the communication semanticsSOCK_STREAM : Provides sequenced, reliable, two-way, connection-based byte streams. An out-of-band data transmission mechanism may be supported. SOCK_RAW : Provides raw network protocol access.

SystemCall in Linux

Page 22: SystemCall in Linux

Connect )( : int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

22/24

Sockfd : number of socket discriptor*serv_addr : address of tableaddrlen : kind of addressing

Listen )( : int listen)int sockfd, int backlog(; Socket Used to for listening Inline

backlog : defines the maximum length the queue of pending connections may grow to

SystemCall in Linux

Page 23: SystemCall in Linux

Refrences:

- understanding the linux kernel , 3rd edition , by Daniel P.Bovet, Marco Cesati

- Implement a Sys Call on Linux 2.6 for i386 , by Amit Choudhary

- INTEL 80386 PROGRAMMER'S REFERENCE MANUAL

-Operating Systems Design and Implementation, Third Edition, By Andrew S.

Tanenbaum

-Operating System Concepts ,Abraham Silberschatz,)2013(

23/24SystemCall in Linux

Page 24: SystemCall in Linux

با تشکر24/24SystemCall in Linux