Upload
mohamad-mahmodi
View
131
Download
2
Embed Size (px)
Citation preview
LOGO
Linux System Call
دانشجو : محمدجواد محمودی استاد : مهندس امین صالحیواحد سیستم عامل شبکه
92دانشکده شهید شمسی پور پاییز
سیستم عامل می تواند به سخت افزار دسترسی داشته -
از ب�ا استفاده توان�د و برنام�ه کاربردی نم�ی باش�د ول�ی
system call سیستم از را خاص�ی س�رویس درخواس�ت
از بخاط�ر حفاظ�ت هسته ای�ن فراین�د و کن�د عام�ل م�ی
دسترسی کاربر می باشد؛
- System call وقفه نرم افزاری است که برنامه کاربردی با
POSIX API’s از آن استفاده می کند؛
-API رابط کاربری سطح برنامه و سطح سیستم است ؛2/24SystemCall in Linux
3/24SystemCall in Linux
4/24SystemCall in Linux
-System call در الیه هسته انجام می شود؛ شماره مختص به خود دارد؛system callهر -از - را ی�ک سرویس درخواس�ت کاربردی برنام�ه ی�ک فرآین�د وقت�ی
تشخیص داده می شود IDTهسته می دهد نوع وقفه از روی جدول
؛
ک�د اسمبلی Linuxدر - توس�ط انجام INT $0x80 فراخوان�ی س�یستم
می شود؛
eax)ک�ه ی�ک آرگومان اس�ت( را به ثبات system callهمچنی�ن شماره -
ی�ک دهد. م�ی چن�د APIپاس اس�ت ممک�ن system call کند تولی�د
بنابرای�ن برای مدیری�ت آ�ن ه�ا آرگومان های�ی ه�م فرس�تاده می شود
قرار می گیرد. ecx و ebxکه در ثبات های
5/24SystemCall in Linux
6/24SystemCall in Linux
-( آرای�ه linux kernel 2.6.11هس�ته از ای 289( خانه
sys_call_table سرویس �ر �ه آدرس ذخیره برای
systemcall .ی کند�آرای�ه که شماره اندی�س اس�تفاده م
است.eax میباشد در ثبات systemcallمربوط به
دس�تور- از اس�تفاده ب�ا 0x80 $ int ا�از sysenterی مد
ب�ه کاربر م�ی شود عملیات م�د هسته س�وییچ برای
systemcall تفاده از� از م�د هسته sysexit ی�ا iret و ب�ا اس
به مد کاربر سوییچ می شود.
7/24SystemCall in Linux
8/24SystemCall in Linux
9/24SystemCall in Linux
10/24SystemCall in Linux
TSS (TASKE STATE SEGMENT)
11/24SystemCall in Linux
پردازنده برای مدیریت رجیستر ها از یک پشته خاص به این نام -
شامل رجیستر های دینامیک مثل سیستمی استفاده می کند که
.esp2 تا esp0و عمومی و رجیستر های استاتیک مثل
i/oتغییر مد کاربر و هسته و همچنین مدیریت دسترسی عموما برای - -
به هسته و برعکس استفاده می شود.
پردازنده آدرس پشته مد هسته را از آن بدست می آورد.)که در -
esp0)ذخیره شده است
- برای اینکه پردازنده در مد کاربر نتواند به این سگمنت دست -
است.DPL = 0پیدا کند مقدار
حاوی آدرس توصیفگر آن در جدول توصیفگر می tr- رجیستر
باشد.
GDT می باشد بنابراین بدون مراجعه به hidden آن base و limitمقادیر -
می تواند مستقیما به آدرس برود.
12/24
TSS (TASKE STATE SEGMENT)
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
:syscall handlerفرآیند
وظایف زیر را� انجام می دهد :System call handlerیک
؛مقادیر رجیسترها در پشته سطح هسته نگهداری •
•Handler Systemcall service با استفاده از تابع
xyz ) (؛
ذخیره ارزش های روی خارج شدن از حالت دستیابی : •
پشته مد هسته در رجیسترها و سویچ شدن از مد هسته
به مد کاربر. 14/24SystemCall 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
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
17/24SystemCall 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
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
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
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
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
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
با تشکر24/24SystemCall in Linux