Professional Documents
Culture Documents
آزمایشگاه سیستمعامل
پروژه دوم :فراخوانی سیستمی
تاریخ تحویل :یکشنبه 21آبان 1402
اهداف پروژه
● آشنایی با علت نیاز به فراخوانی سیستمی
● آشنایی با سازوکار و چگونگی صدا زده شدن فراخوانیهای سیستمی 1در هسته xv6
● آشنایی با افزودن فراخوانیهای سیستمی در هسته xv6
● آشنایی با نحوه ذخیرهسازی پردازهها و ساختاردادههای مربوط به آن
مقدمه
هر برنامه در حال اجرا یک پردازه 2نام دارد .به این ترتیب یک سیستم رایانهای ممکن است در
آن واحد ،چندین پردازه در انتظار سرویس داشته باشد .هنگامی که یک پردازه در سیستم در حال
ِ
1
System Call
2
Process
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
اجرا است ،پردازنده روال معمول پردازش را طی میکند :خواندن یک دستور ،افزودن مقدار
شمارنده برنامه 3به میزان یک واحد ،اجرای دستور و نهایتا ً تکرار حلقه .در یک سیستم
رویدادهایی وجود دارند که باعث میشوند به جای اجرای دستور بعدی ،کنترل از سطح کاربر
به سطح هسته منتقل شود .به عبارت دیگر ،هسته کنترل را در دست گرفته و به برنامههای سطح
4:
کاربر سرویس میدهد
)۱ممکن است دادهای از دیسک دریافت شده باشد و به دالیلی الزم باشد بالفاصله آن داده از ثبات
مربوطه در دیسک به حافظه منتقل گردد .انتقال جریان کنترل در این حالت ،ناشی از وقفه 5خواهد
بود .وقفه به طور غیرهمگام با کد در حال اجرا رخ میدهد.
)۲ممکن است یک استثنا 6مانند تقسیم بر صفر رخ دهد .در اینجا برنامه دارای یک دستور تقسیم
بوده که عملوند مخرج آن مقدار صفر داشته و اجرای آن کنترل را به هسته میدهد.
)۳ممکن است برنامه نیاز به عملیات ممتاز داشته باشد .عملیاتی مانند دسترسی به اجزای
سختافزاری یا حالت ممتاز سیستم (مانند محتوای ثباتهای کنترلی) که تنها هسته اجازه دسترسی
به آنها را دارد .در این شرایط برنامه اقدام به فراخوانی فراخوانی سیستمی میکند .طراحی
سیستمعامل باید به گونهای باشد که مواردی از قبیل ذخیرهسازی اطالعات پردازه و بازیابی
اطالعات رویدا ِد به وقوع پیوسته مثل آرگومانها را به صورت ایزولهشده از سطح کاربر انجام
دهد .در این پروژه ،تمرکز بر روی فراخوانی سیستمی است.
در اکثریت قریب به اتفاق موارد ،فراخوانیهای سیستمی به طور غیرمستقیم و توسط توابع
کتابخانهای پوشاننده 7مانند توابع موجود در کتابخانه استاندارد Cدر لینوکس یعنی glibcصورت
میپذیرد 8.به این ترتیب قابلیتحمل 9برنامههای سطح کاربر افزایش مییابد .زیرا به عنوان مثال
چنانچه در ادامه مشاهده خواهد شد ،فراخوانیهای سیستمی با شمارههایی مشخص میشوند که
3
Program Counter
ی
متفاوت برای این گذارها به 4در xv6به تمایم این موارد trapگفته یمشود .در حایل که در حقیقت در x86نامهای
کار یمرود.
5
Interrupt
6
Exception
7
Wrapper
ی ً ً
در ،glibcتوابع پوشاننده غالبا دقیقا نام و پارامت ی
هات مشابه فراخواتهای سیستیم دارند. 8
9
Portability
2
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
در معماریهای مختلف ،متفاوت است .توابع پوشاننده کتابخانهای ،این وابستگیها را مدیریت
میکنند .توابع پوشاننده 6xvدر فایل usys.Sتوسط ماکروی SYSCALLتعریف شدهاند.
)۱کتابخانههای (قاعدتا ً سطح کاربر ،منظور فایلهای تشکیلدهنده متغیر ULIBدر Makefile
است) استفاده شده در 6xvرا از منظر استفاده از فراخوانیهای سیستمی و علت این استفاده
بررسی نمایید.
تعداد فراخوانیهای سیستمی ،وابسته به سیستمعامل و حتی معماری پردازنده است .به عنوان
مثال در لینوکس ،فریبیاسدی 10و ویندوز ۷به ترتیب حدود ۵۰۰ ،۳۰۰و ۷۰۰فراخوانی
سیستمی وجود داشته که بسته به معماری پردازنده اندکی متفاوت خواهد بود [ .]1در حالی که
xv6تنها ۲۱فراخوانی سیستمی دارد.
فراخوانی سیستمی سربارهایی دارد )۱ :سربار مستقیم که ناشی از تغییر مد اجرایی و انتقال به
مد ممتاز بوده و )۲سربار غیرمستقیم که ناشی از آلودگی ساختارهای پردازنده شامل انواع
حافظههای نهان 11و خط لوله 12میباشد .به عنوان مثال ،در یک فراخوانی سیستمی () writeدر
۲
لینوکس تا حافظه نهان سطح یک داده خالی خواهد شد [ .]2به این ترتیب ممکن است کارایی به
۳
نصف کاهش یابد .غالبا ً عامل اصلی ،سربار غیرمستقیم است .تعداد دستورالعمل اجرا شده به
ازای هر سیکل (IPC)13هنگام اجرای یک فراخوانی سیستمی در بار کاری 2006 SPEC CPU
روی پردازنده Core i7اینتل در نمودار زیر نشان داده شده است [.]2
10
FreeBSD
11
Caches
12
Pipeline
13
Instruction per Cycle
3
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
مشاهده میشود که در لحظهای IPCبه کمتر از ۰.۴رسیده است .روشهای مختلفی برای
فراخوانی سیستمی در پردازندههای x86استفاده میگردد .روش قدیمی که در 6xvبه کار میرود
استفاده از دستور اسمبلی intاست .مشکل اساسی این روش ،سربار مستقیم آن است .در
پردازندههای مدرنتر x86دستورهای اسمبلی جدیدی با سربار انتقال کمتر مانند
sysenter/sysexitارائه شده است .در لینوکس glibc ،در صورت پشتیبانی پردازنده ،از این
دستورها استفاده میکند .برخی فراخوانیهای سیستمی (مانند() gettimeofdayدر لینوکس)
فرکانس دسترسی باال و پردازش کمی در هسته دارند .لذا سربار مستقیم آنها بر برنامه زیاد
14
خواهد بود .در این موارد میتوان از روشهای دیگری مانند اشیای مجازی پویای مشترک
)(vDSOدر لینوکس بهره برد .به این ترتیب که هسته ،پیادهسازی فراخوانیهای سیستمی را در
فضای آدرس سطح کاربر نگاشت داده و تغییر مد به مد هسته صورت نمیپذیرد .این دسترسی
نیز به طور غیرمستقیم و توسط کتابخانه glibcصورت میپذیرد .در ادامه سازوکار اجرای
فراخوانی سیستمی در xv6مرور خواهد شد.
)۲دقت شود فراخوانیهای سیستمی تنها روش دسترسی سطح کاربر به هسته نیست .انواع این
روشها را در لینوکس به اختصار توضیح دهید .میتوانید از مرجع [ ]3کمک بگیرید.
14
Virtual Dynamic Shared Objects
4
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
این ساختارها در 6xvدر قالب یک ساختار هشت بایتی موسوم به struct gatedescتعریف
شدهاند (خط .)۸۵۵به ازای هر انتقال به هسته (فراخوانی سیستمی و هر یک از انواع وقفههای
5
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
سختافزاری و استثناها) یک Gateدر حافظه تعریف شده و یک شماره تله 15نسبت داده میشود.
این Gateها توسط تابع () tvinitدر حین بوت (خط )۱۲۲۹مقداردهی میگردندInterrupt .
Gateاجازه وقوع وقفه در پردازنده حین کنترل وقفه را نمیدهد .در حالی که Trap Gate
اینگونه نیست .لذا برای فراخوانی سیستمی از Trap Gateاستفاده میشود تا وقفه که اولویت
بیشتری دارد ،همواره قابل سرویسدهی باشد (خط .)۳۳۷۳عملکرد Gateها را میتوان با
بررسی پارامترهای ماکروی مقداردهنده به Gateمربوط به فراخوانی سیستمی بررسی نمود:
پارامتر T_SYSCALL[idt]t :۱محتوای Gateمربوط به فراخوانی سیستمی را نگه میدارد.
آرایه ( idtخط )۳۳۶۱بر اساس شماره تلهها اندیسگذاری شده است .پارامترهای بعدی ،هر یک
بخشی از T_SYSCALL[idt]tرا پر میکنند.
پارامتر :۲تعیین نوع Gateکه در اینجا Trap Gateبوده و لذا مقدار یک دارد.
پارامتر :۳نوع قطعه کدی که بالفاصله پس از اتمام عملیات تغییر مد پردازنده اجرا میگردد .کد
کنترلکننده فراخوانی سیستمی در مد هسته اجرا خواهد شد .لذا مقدار 3<<SEG_KCODEبه
ماکرو ارسال شده است.
پارامتر :۴محل دقیق کد در هسته که vectors[T_SYSCALL]tاست .این نیز بر اساس شماره
تلهها شاخصگذاری شده است.
پارامتر :۵سطح دسترسی مجاز برای اجرای این تله DPL_USER .است .زیرا فراخوانی سیستمی
توسط (قطعه) کد سطح کاربر فراخوانی میگردد.
)۳آیا باقی تلهها را نمیتوان با سطح دسترسی DPL_USERفعال نمود؟ چرا؟
به این ترتیب برای تمامی تلهها idtمربوطه ایجاد میگردد .به عبارت دیگر پس از اجرای
() tvinitآرایه idtبه طور کامل مقداردهی شده است .حال باید هر هسته پردازنده بتواند از
اطالعات idtاستفاده کند تا بداند هنگام اجرای هر تله چه کد مدیریتی باید اجرا شود .بدین منظور
تابع () idtinitدر انتهای راهاندازی اولیه هر هسته پردازنده ،اجرا شده و اشارهگر به جدول idt
را در ثبات مربوطه در هر هسته بارگذاری مینماید .از این به بعد امکان سرویسدهی به تلهها
فراهم است .یعنی پردازنده میداند برای هر تله چه کدی را فراخوانی کند.
15
Trap Number
6
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
یکی از راههای فعالسازی هر تله استفاده از دستور > int <trap noمیباشد .لذا با توجه به این
که شماره تله فراخوانی سیستمی ۶۴است (خط ،)۳۲۲۶کافی است برنامه ،جهت فراخوانی
فراخوانی سیستمی دستور int 64را فراخوانی کند int .یک دستورالعمل پیچیده در پردازنده
( x86یک پردازنده )CISCاست .ابتدا باید وضعیت پردازه در حال اجرا ذخیره شود تا بتوان پس
از فراخوانی سیستمی وضعیت را در سطح کاربر بازیابی نمود .اگر تله ناشی از خطا باشد (مانند
خطای نقص صفحه 16که در فصل مدیریت حافظه معرفی میگردد) ،کد خطا نیز در انتها روی
پشته قرار داده میشود .حالت پشته (سطح هسته )17پس از اتمام عملیات سختافزاری مربوط به
دستور ( intمستقل از نوع تله با فرض Pushشدن کد خطا توسط پردازنده) در شکل زیر نشان
داده شده است .دقت شود مقدار espبا Pushکردن کاهش مییابد.
)۴در صورت تغییر سطح دسترسی ss ،و espروی پشته Pushمیشود .در غیراینصورت
Pushنمیشود .چرا؟
گام ،intبردار تله یا همان کد کنترلکننده مربوط به فراخوانی سیستمی اجرا میگردد
در آخرین ِ
که در شکل زیر نشان داده شده است.
16
Page Fault
17دقت شود با توجه به اینکه قرار است تله در هسته مدیریت گردد ،پشته سطح هسته نیاز است .این پشته پیش از
اجرای هر برنامه سطح کاربر ،توسط تابع )(switchuvmبرای اجرا هنگام وقوع تله در آن برنامه آماده یمگردد.
7
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
.globl vector64
vector64:
pushl $0
pushl $64
jmp alltraps
در اینجا ابتدا یک کد خطای بیاثر صفر و سپس شماره تله روی پشته قرار داده شده است .در
انتها اجرا از کد اسمبلی alltrapsادامه مییابد .حالت پشته ،پیش از اجرای کد alltrapsدر
شکل زیر نشان داده شده است.
Ss
Esp
eflags
Cs esp
Eip
error code
trapno
)(empty
alltrapsباقی ثباتها را Pushمیکند .به این ترتیب تمامی وضعیت برنامه سطح کاربر پیش
از فراخوانی سیستمی ذخیره شده و قابل بازیابی است .شماره فراخوانی سیستمی و پارامترهای
آن نیز در این وضعیت ذخیره شده ،حضور دارند .این اطالعات موجود در پشته ،همان قاب تله
هستند که در پروژه قبل مشابه آن برای برنامه initcode.Sساخته شده بود .حال اشارهگر به
باالی پشته ( )espکه در اینجا اشارهگر به قاب تله است روی پشته قرار داده شده (خط )۳۳۱۸
و تابع )( trapفراخوانی میشود .این معادل اسمبلی این است که اشارهگر به قاب تله به عنوان
8
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
پارامتر به )( trapارسال شود .حالت پشته پیش از اجرای )( trapدر شکل زیر نشان داده شده
است.
9
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
به توابع است که در فایل syscall.cقرار دارد (خط .)۳۶۷۲هر کدام از فراخوانیهای سیستمی،
خود ،وظیفه دریافت پارامتر را دارند .ابتدا مختصری راجع به فراخوانی توابع در سطح زبان
اسمبلی توضیح داده خواهد شد .فراخوانی توابع در کد اسمبلی شامل دو بخش زیر است:
(گام )۱ایجاد لیستی از پارامترها بر روی پشته .دقت شود پشته از آدرس بزرگتر به آدرس
کوچکتر پر میشود.
ترتیب Pushشدن روی پشته :ابتدا پارامتر آخر ،سپس پارامتر یکی مانده به آخر و در نهایت
پارامتر نخست.
مثالً برای تابع )(a,b,cا fکد اسمبلی کامپایل شده منجر به چنین وضعیتی در پشته سطح کاربر
میشود:
esp+8 C
esp+4 B
esp A
(گام )۲فراخوانی دستور اسمبلی معادل callکه منجر به Pushشدن محتوای کنونی اشارهگر
دستورالعمل ( )eipبر روی پشته میگردد .محتوای کنونی مربوط به اولین دستورالعمل بعد از
تابع فراخوانیشده است .به این ترتیب پس از اتمام اجرای تابع ،آدرس دستورالعمل بعدی که باید
اجرا شود روی پشته موجود خواهد بود.
مثالً برای فراخوانی تابع قبلی پس از اجرای دستورالعمل معادل callوضعیت پشته به صورت
زیر خواهد بود:
esp+12 c
esp+8 b
esp+4 a
esp Ret Addr
در داخل تابع fنیز میتوان با استفاده از اشارهگر ابتدای پشته به پارامترها دسترسی داشت .مثالً
برای دسترسی به bمیتوان از 8+espاستفاده نمود .البته اینها تنها تا زمانی معتبر خواهند
بود که تابع fتغییری در محتوای پشته ایجاد نکرده باشد.
10
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
در فراخوانی سیستمی در xv6نیز به همین ترتیب پیش از فراخوانی سیستمی پارامترها روی
پشته سطح کاربر قرار داده شدهاند .به عنوان مثال چنانچه در پروژه یک آزمایشگاه دیده شد،
برای فراخوانی سیستمی () sys_execدو پارامتر $argvو $initو آدرس برگشتی صفر به
ترتیب روی پشته قرار داده شدند (خطوط ۸۴۱۰تا .)۸۴۱۲سپس شماره فراخوانی سیستمی که
در SYS_execقرار دارد در ثبات eaxنوشته شده و int $T_SYSCALLجهت اجرای تله
فراخوانی سیستمی اجرا شد sys_exec)( .میتواند مشابه آنچه در مورد تابع )(fذکر شد به
پارامترهای فراخوانی سیستمی دسترسی پیدا کند .به این منظور در xv6توابعی مانند ()argint
و() argptrارائه شده است .پس از دسترسی فراخوانی سیستمی به پارامترهای مورد نظر ،امکان
اجرای آن فراهم میگردد.
)۵در مورد توابع دسترسی به پارامترهای فراخوانی سیستمی به طور مختصر توضیح دهید .چرا
در() argptrبازه آدرسها بررسی میگردد؟ تجاوز از بازه معتبر ،چه مشکل امنیتی ایجاد میکند؟
در صورت عدم بررسی بازهها در این تابع ،مثالی بزنید که در آن ،فراخوانی
سیستمی() sys_readاجرای سیستم را با مشکل روبرو سازد.
شیوه فراخوانی فراخوانیهای سیستمی جزئی از واسط باینری برنامههای کاربردی ) (ABI18یک
سیستمعامل روی یک معماری پردازنده است .به عنوان مثال در سیستمعامل لینوکس در معماری
،xv6پارامترهای فراخوانی سیستمی به ترتیب در ثباتهای edi، esi، edx، ecx،ebxو ebp
قرار داده میشوند 19.ضمن این که طبق این ،ABIنباید مقادیر ثباتهای edi، esi،ebxو ebp
پس از فراخوانی تغییر کنند .لذا باید مقادیر این ثباتها پیش از فراخوانی فراخوانی سیستمی در
مکانی ذخیره شده و پس از اتمام آن بازیابی گردند تا ABIمحقق شود .این اطالعات و شیوه
20.
فراخوانی فراخوانیهای سیستمی را میتوان در فایلهای زیر از کد منبع glibcمشاهده نمود
sysdeps/unix/sysv/linux/i386/syscall.S
sysdeps/unix/sysv/linux/i386/sysdep.h
18
Application Binary Interface
حداکت شش پار ی
امت ارسال یمگردد. ر 19فرض این است که
مستها مربوط به glibc-2.26است.
20ر
11
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
به این ترتیب در لینوکس برخالف xv6پارامترهای فراخوانی سیستمی در ثبات منتقل میگردند.
یعنی در لینوکس در سطح اسمبلی ،ابتدا توابع پوشاننده پارامترها را در پشته منتقل نموده و سپس
پیش از فراخوانی فراخوانی سیستمی ،این پارامترها ضمن جلوگیری از از دست رفتن محتوای
ثباتها ،در آنها کپی میگردند.
در هنگام تحویل سواالتی از سازوکار فراخوانی سیستمی پرسیده میشود .دقت شود در مقابل
،ABIمفهومی تحت عنوان واسط برنامهنویسی برنامه کاربردی( (API21وجود دارد که شامل
مجموعهای از تعاریف توابع (نه پیادهسازی) در سطح زبان برنامهنویسی بوده که واسط قابلحمل
سیستمعامل( (POSIX22نمونهای از آن است .پشتیبانی توابع کتابخانهای سیستمعاملها از این
تعاریف ،قابلیتحمل برنامهها را افزایش میدهد 23.مثالً امکان کامپایل یک برنامه روی لینوکس
و iOSفراهم خواهد شد .جهت آشنایی بیشتر با POSIXو پیادهسازی آن در سیستمعاملهای
لینوکس ،اندروید و iOSمیتوان به مرجع [ ]5مراجعه نمود.
در این قسمت با توجه به توضیحاتی که تا االن داده شدهاست ،قسمتی از روند اجرای یک سیستمکال
را در سطح هسته بررسی خواهیدکرد .ابتدا یک برنامه ساده سطح کاربر بنویسید که بتوان از
یک نقطه طریق آن ،فراخوانیهای سیستمی () getpidدر xv6را اجرا کرد.
توقف( )breakpointدر ابتدای تابع syscallقرار دهید .حال برنامه سطح کاربر نوشتهشده را
اجرا کنید .زمانی که به نقطه توقف برخورد کرد ،دستور btرا در gdbاجرا کنید .توضیح
کاربرد این دستور ،تصویر خروجی آن و تحلیل کامل تصویر خروجی را در گزارشکار ثبت
کنید.
حال دستور (downتوضیح کارکرد این دستور را نیز در گزارش ذکر کنید) را در gdbاجرا
کنید .محتوای رجیستر eaxرا که در tfمیباشد ،چاپ کنید .آیا مقداری که مشاهده میکنید،
21
Application Programming Interface
22
Portable Operating System Interface
23توابع پوشاننده فراخواتهای سیستیم ی
بخش از POSIXهستند.
12
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
برابر با شماره فراخوانی سیستمی () getpidمیباشد؟ علت را در گزارش کار توضیح دهید.
چند بار دستور cرا در gdbاجرا کنید تا در نهایت ،محتوای رجیستر ،eaxشماره فراخوانی
سیستمی () getpidرا در خود داشتهباشد.
دقت کنید میتوانید در ابتدا دستور layout srcرا اجرا کنید تا کد cدر ترمینال gdbنشان
دادهشود و شاید در تحلیل مراحل ،کمکتان کند.
تا اینجای کار با نحوه ارسال آرگومانهای فراخوانیهای سیستمی در سیستمعامل xv6آشنا شدید.
در این قسمت به جای بازیابی آرگومانها به روش معمول ،از ثباتها استفاده میکنیم .فراخوانی
سیستمی زیر که در آن تنها یک آرگومان ورودی از نوع intوجود دارد را پیادهسازی کنید.
در این قسمت بـه جـای بـازیابی آرگومان هـا بـه روش معمول ،از ثباتها استفاده میکنیم .در این
فـراخـوانی ،ریشه دیجیتال عدد ورودی را محاسبه کنید .برای مثال در صورتی که عدد ورودی
284باشد ،شما باید عدد 5را در خروجی چاپ کنید.
عدد nباید مثبت باشد و در غیر این صورت فراخوانی سیستمی عددی منفی برگردانده و برنامه
سطح کاربر این را به کاربر اطالع میدهد.
توضیح :ریشه دیجیتال یک عدد ،حاصل جمع مکرر ارقام آن عدد است تا اینکه حاصل به یک
تک رقم برسد .در مثال گفته شده ،در ابتدا 2+8+4=14میشود و سپس 1+4=5ریشه دیجیتال
عدد است.
دقت داشته باشید که از ثبات برای ذخیره مقدار آرگومان استفاده میکنیم نه برای آدرس محل
قرارگیری آن .ضمن این که پس از اجرای فراخوانی ،باید مقدار ثبات دست نخورده باقی بماند.
13
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
در این آزمایش با پیادهسازی فراخوانیهای سیستمی ،اضافهکردن آنها به هسته xv6را فرا
میگیرید .در این فراخوانیها که در ادامه توضیح داده میشود ،پردازشهایی انجام میشود که
از سطح کاربر قابل انجام نیست .تمامی مراحل کار باید در گزارش کار همراه با فایلهایی
که آپلود میکنید موجود باشند.
24
PID
14
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
برای تست این فراخوانی سیستمی ،یک برنامهی سطح کاربر بنویسید و فراخوانی سیستمی
گفته شده را فراخوانی کنید و نتیجه را نشان دهید .عمل کپی کردن باید به طور کامل در
کرنل و نه در برنامه سطح کاربر انجام شود.
برای تولید فایل ،میتوانید از دستور echoاستفاده کنید و یا فایل READMEرا کپی کنید.
این فراخوانی سیستمی در صورت موفقیت 0و در غیر این صورت -1ریترن میکند .در
صورت خطا در برنامه سطح کاربر به کاربر اطالع داده میشود.
توجه کنید که یک فایل نباید به خودش کپی شود و در این صورت -1ریترن میشود.
اگر نام دوم داده شده از قبل وجود داشته باشد ،میتوانید به دلخواه یا خطا گرفته و یا آن را
overrideکنید.
15
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
16
آزمایشگاه سیستم عامل – پروژه – ۲پاییز ۱۴۰۲
● برای این که بتوانید فراخوانیهای سیستمی خود را تست کنید الزم است که یک برنامه
سطح کاربر بنویسید و در آن فراخوانیها را صدا بزنید .برای این که بتوانید برنامه
سطح کاربر خود را درون Shellاجرا کنید ،باید تغییرات مناسبی را روی Makefile
انجام دهید تا برنامه جدید کامپایل شود و به فایلسیستم xv6اضافه شود.
● برای ردیابی روال فراخوانیها ،پیغامهای مناسبی در جاهای مناسب چاپ کنید.
● برای نمایش اطالعات در سطح هسته از )( cprintfاستفاده کنید.
سایر نکات
● آدرس مخزن و شناسه آخرین تغییر خود را در محل بارگذاری در سایت درس ،بارگذاری
نمایید.
● تمام مراحل کار را در گزارش کار خود بیاورید.
● همه افراد باید به پروژه آپلود شده توسط گروه خود مسلط باشند و لزوما ً نمره افراد یک گروه
با یکدیگر برابر نیست.
● در صورت مشاهده هرگونه مشابهت بین کدها یا گزارش دو گروه ،به هر دو گروه نمره ۰
تعلق میگیرد.
● فصل سه کتاب xv6میتوان کمککننده باشد.
● هر گونه سوال در مورد پروژه را فقط از طریق فروم درس مطرح کنید.
موفق باشید
17
۱۴۰۲ – پاییز۲ آزمایشگاه سیستم عامل – پروژه
مراجع
18