PDA

View Full Version : سیستم فایل مجازی و درایور ها



yassersajjadi
پنج شنبه 20 تیر 1392, 23:52 عصر
سلام
اگه کسی یه نمونه سیستم فایل مجازی و درایور های مربوط به اونو داره معرفی کنه ممنون میشم

MSK
چهارشنبه 20 شهریور 1392, 15:11 عصر
سرس‌کد مینیکس رو دیدی؟ http://www.minix3.org/
در هر صورت سوالت خیلی واضح نیست. مثلا آیا برای کرنل خاصی میخوای؟ دقیقا دنبال چی میگردی؟

yassersajjadi
شنبه 23 شهریور 1392, 15:51 عصر
ممنون دوست عزیز , خودم دارم یه کرنل منویسم میخواستم یه سیستم فایل بنویسم , نمونه هایی که داشتم یکم پیچیده بود , از طرف دیگه نمیدونستم چطوری باید با پردازش هام همگام سازیش کنم , وقتی از پیجینگ استفاده میکنی , برنامه نویسی یکم سخت میشه هر کاری که انجام میدی به دنیا باگ جلوت سبز میشه , مشکلم با سیستم فایل هم همینه , توی برنامه نویسی مشکل دارم , دنبال یه سورس ساده میگشتم تا یه روند دستم بیاد بدونم کجا باید چیکار کنم, بازم ممنون

pswin.pooya
شنبه 23 شهریور 1392, 23:30 عصر
سلام
برای سیستم فایل مجازی میتونی از اشاره گر به تابع استفاده کنی و برای هر فایل ویا سیستم فایل یکسری تابع مثل موارد زیر رو تعریف کنی:

1. open
2. write
3. read
4. close
5. seek

خب حالا برای همگام سازی میتونی از موتکس ها و سمافورها استفاده کنیو فقط یادت باشه تمام این توابع بالا باید اتمیک باشن که کار رو سختر هم میکنه. یعنی بخوای نخوای باید وارد مبحث قفلها شی که خود این مبحث به شدت دردسر سازه.


قتی از پیجینگ استفاده میکنی , برنامه نویسی یکم سخت میشه هر کاری که انجام میدی به دنیا باگ جلوت سبز میشه

وای مشکل من هم همینه. هرکاری میکنم یه دنیا باگ هست. البته بیشتر از پیجنگ مربوط به نواحی بحرانی هست که خودشون رو داخل حافظه نشون میدن. فکر کنم بهترین راه پیاده سازی ساختارهای درست برای فرایندها مثل سیگنالها و .. هست و بعد از اون روی موارد دیگه متمرکز شد. چون مثلا خیلی ها سمافور رو با سیگنالها پیاده سازی کردن.

اگر روی اینجور مباحث بحث کنیم میتونه خیلی مفید باشه ( لااقل برای توسعه دهنده ها)

yassersajjadi
چهارشنبه 27 شهریور 1392, 11:11 صبح
هر وقت پیجینگ فعال میشه دیگه نمیتونیم از یک اشاره گر دو بار در یک تابع استفاده کنیم چون این دسترسی در پیجینگ محدود میشه , متاسفانه همین قاعده ی ساده کلی منو به اشتباه انداخته بود و وقت منو گرفت
من ساموفر ها و قفل ها رو پیاده سازی کردم خوب هم کار میکنه ولی یکم مشکله بدونی کجا لازمه و کجا لازم نیست که استفاده بشن , یه جایی از قفل ها استفاده میکنیم باعث میشه کرنل وارد یک بن بست بشه در حالی که اصلا راه حل استفاده از قفل نبوده و مشکل رویه برنامه نویسی هست , متاسفانه من خیلی به این مشکل بر میخورم و پیدا کردن مشکل هم خیلی سخته , این هم بخاطر عدم اگاهی کافی از ابزار های دباگینگ هست که طول میکشه یاد بگیری چطور میشه ازشون استفاده کرد مثلا objdump









اگر روی اینجور مباحث بحث کنیم میتونه خیلی مفید باشه ( لااقل برای توسعه دهنده ها)



من هم موافقم , کلا بحث راجع به این مباحث میتونه مارو بیشتر اگاه کنه و از دنیای کپی پیست بیاره بیرون

pswin.pooya
چهارشنبه 27 شهریور 1392, 22:45 عصر
من ساموفر ها و قفل ها رو پیاده سازی کردم خوب هم کار میکنهخیلی عالیه. اگر کدت رو به اشتراک بذاری خیلی خوب میشه. ما هم استفاده می کنیم. متاسفانه سمافورهای من مشکل دارن.


هر وقت پیجینگ فعال میشه دیگه نمیتونیم از یک اشاره گر دو بار در یک تابع استفاده کنیممتوجه منظورت نشدم.


ولی یکم مشکله بدونی کجا لازمه و کجا لازم نیست قفلها باید بیشتر برای ساختارهای داده باشه تا موارد دیگه مثل هر مدخل فایل یا فایل سیستم باید یه قفل داشته باشه.



این هم بخاطر عدم اگاهی کافی از ابزار های دباگینگ هست که طول میکشه یاد بگیری چطور میشه ازشون استفاده کرد مثلا objdump

من هم روی دیباگ کردن زیاد کار کردم . منتها هنوز جواب نگرفتم. ظاهرا توی شبیه سازهایی مثل qemu میشه با استفاده از سوئیچ -s S و استفاده از دیباگر gdb کارهایی کرد. منتها توی تست های من درست جواب نداده. نمی دونم دلیلش چیه. شاید در آبنده از پورت سریال برای اینکار استفاده کنم.

yassersajjadi
پنج شنبه 28 شهریور 1392, 13:28 عصر
تو فکر گذاشتن کدهام هستم

استفاده از قفل ها باعث تلف شدن وقت سی پی یو میشه ، واسه همین من سعی کردم از قفل ها واسه ساختار هام استفاده نکنم ، ساموفر ها رو به جای قفل ها استفاده کردم تا هر پردازشی که وارد ناحیه مربوطه میشه از حالت اجرا به حالت تعویق درون ساختار ساموفر که شامل یک queue هست بره و از لیست پردازش ها حذف بشه ، و در عوض خود ساموفر از قفل ها استفاده میکنه
هر وقت پردازش تمام شد ساموفر یک پردازش را در اول لیست قرار میده تا در اولین فرست به صورت running در بیاد

pswin.pooya
پنج شنبه 28 شهریور 1392, 21:40 عصر
استفاده از قفل ها باعث تلف شدن وقت سی پی یو میشه ، واسه همین من سعی کردم از قفل ها واسه ساختار هام استفاده نکنم

اگر قفل busy/wait باشه مثل spinlockها زمان cpu رو هدر میده. اما انواع دیگه قفل اینجوری نیست. مثلا برای وقفه ها از همین سیستم سمافور استفاده میشه به شکلی که هر وقت وقفه مثلا کی بورد راه افتاد قفل آزاد میشه و در نتیجه روتین مربوطه اجرا میشه و در پایان دوباره قفل میشه.


از حالت اجرا به حالت تعویق درون ساختار ساموفر که شامل یک queue هست بره و از لیست پردازش ها حذف بشه ، و در عوض خود ساموفر از قفل ها استفاده میکنه
منم دقیقا اینکار رو کردم. منتها وقتی چهار تا فرایند برای تست گذاشتم جواب نداد. و بعد یه مدت page fault میده. نمی دونم ایراد از کجاست.

yassersajjadi
جمعه 29 شهریور 1392, 11:14 صبح
این کدیه که من استفاده میکنم ، من هم مشکل شما رو داشتم ، منتها مشکل بخاطر غلط بودن پیش فرض هام بود ، که با memset حل شد یعنی تمام قسمت حافظه تعلق گرفته باید در اول صفر باشن



void
initsem(struct semaphore *sem, char* name){
memset(sem, 0, sizeof(struct semaphore));
initlock(&sem->lock, name);
queue_init ( &sem->queue );
}
void
sem_wait(struct semaphore *sem){

acquire(&sem->lock);

if ( proc )
{
if(sem->count < 0)
{
struct proc *next,*backup;
backup = queue_get(&g_RunningQueue, FIRST);
while ( (next = queue_remove ( &g_RunningQueue, LAST, NULL )) )
{

if(next == proc){
next->state = SLEEPING;
queue_prepend ( &sem->queue, next, &next->queue );

cprintf("semaphore up %d \n", sem->count);
break;
}
else{
queue_prepend ( &g_RunningQueue, next, &next->queue );
}

if(next == backup)break;
}
}else{
sem->count--;
//cprintf("semaphore up %d \n", sem->count);
}
}
//cprintf("semaphore up %d \n", sem->count);
release(&sem->lock);
}

void
sem_signal(struct semaphore *sem){
acquire(&sem->lock);

if(proc)
{
struct proc *next;
if ( (next = queue_remove ( &sem->queue, FIRST, NULL )) )
{

next->state = RUNNABLE;
queue_prepend ( &g_RunnableQueue, next, &next->queue );

cprintf("semaphore down %d \n", sem->count);
}else{
sem->count++;
}

//cprintf("semaphore down %d \n", sem->count);
}

release(&sem->lock);
}



البته خطای حافظه میتونه به خاطر موارد دیگه ای هم باشه ، ولی اگه حافظه قبل از استفاده set نشده ، پیشنهاد میکنم این کارو انجام بدید ،

yassersajjadi
جمعه 29 شهریور 1392, 11:25 صبح
ساختار ساموفر هم بصورت زیر

struct semaphore{
struct spinlock lock;
uint count;
struct queue_t queue;
};

من مقدار شمارشگر ساموفر رو بین دو مقدار صفر و منهای یک سویچ میکنم ، هر وقت صفره یعنی پردازشی وجود نداره و وقتی اولین پردازش یه sem_wait میرسه مقدارش منهای یک میشه و از این به بعد پردازش ها ذخیره میشن ، وقتی به sem_signal میرسیم اگر در لیست ساموفری موجود باشه در حالت اماده قرار میگیره در غیر این صورت به مقدار count یک واحد اضافه میکنه که به صفر تغییر میکنه که این به معنای خالی شدن ساموفر هست