منبع اصلی نوشتار زیر در این لینک قرار دارد

افزودن فراخوانی سیستمی( system call)به kernel لینوکس

در این متن قرار است یک system call به نام wordcounts را به کرنل اضافه کنیم.

مراحل انجام کار:

ابتدا سورس هسته را از آدرس زیر دانلود می کنیم:

https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.tar.bz2

سپس آن را از حالت فشرده خارج می کنیم.

به این ترتیب آدرس سورس هسته به صورت زیر می باشد:

Usr/src/linux-3.5

سپس برای معرفی system call خود به فایل systemcall_32.tbl به آدرس زیر می رویم:

Home/linux-3.5/arch/x86/syscalls/syscall_32.tbl

سپس در فایل ،خط زیر را اضافه می کنیم:

۳۵۰  i386  s  sys_s

با توجه به اینکه در این فایل شماره ی system call نیز مشخص است و آخرین شماره هم ۳۴۹ است پس شماره ی system call ما ۳۵۰ است.

10

 

حال به فایل syscalls.h که شامل prototype همه ی system call ها است می رویم.با ادرس زیر:

Linux-3.5/include/linux/syscalls.h

و خط زیر را به آخر فایل اضافه می کنیم:

;(Asmlinkage int sys_s(void

Asmlinkage به کامپایلر می گوید که آرگومان های تابع روی پشته قرار دارند.اکنون با دستور mkdir kernel/s فولدر به نام s را می سازیم.حال یک ویرایشگر متنی را باز می کنیم و در پوشه  ی s برنامه به زبان c را در آن تایپ می کنیم.حال در ترمینال به مسیر فولدر s می رویم.

سپس با دستور gedit یک ویرایشگر متنی به اسم Makefile بدون پسوند می سازیم و خطزیر را در آن می نویسیم:

Obj-$(CONFIG_M)+=s.o

اکنون در ترمینال دستور gedit kernel/Kconfig.m را تایپ کرده و در ویرایشگر متنی ظاهر شده، عبارت زیر را وارد می کنیم:

Config M

Bool “list current process”

Default y

Help

this will list all current running process pid and their state

که این فرایند یکپارچه سازی system call جدید را به سورس هسته کامل می کند.

11

اکنون Makefile موجود در پوشه ی linux را باز کرده و خط زیر را به آن اضافه می کنیم:

EXTREVERSION=.syscall

12

حال باید هسته را کامپایل کرد.برای این کار دستور زیر را تایپ می کنیم:

Make oldconfig

Make modules_install

Make install

تست برنامه:

برای اینکار،یک برنامه ی تست به زبان c نوشته و بعد از کامپایل آن را اجرا می کنیم:

#include <stdio.h>

#include <conio.h>

void main(){

char s[50],ch;

int i,c=0;

clrscr();

printf(“Enter any string : “);

for(i=0;ch!=’n’;i++){

ch=getchar();

s[i]=ch;

}

s[i]=’′;

for(i=0;s[i]!=’′;i++){

if(s[i]==’ ‘){

c++;

while(s[i]==’ ‘)

i++;

}

}

printf(“nnTotal words are %d”,c+1);

getch();

}

دستورات برای اجرای این برنامه:

Gcc s.c –os

m/.



برچسب ها :