# برنامه نویسی سطح پایین > توسعه‌ی هسته‌ی سیستم عامل >  نوشتن یک سیستم عامل ساده ۱۶ بیتی - قدم به قدم

## prpe26

با سلام.

مدتی هست توی وبلاگ شخصیم دارم در مورد پیاده سازی سیستم عامل توضیح میدم، و جمعا چهار تا مقاله با یه ضمیمه تونستم بنویسم که نتیجه کل چهارتاش میشه یه سیستم عامل کوچک!

قسمت اول : نمایش یک کرکتر بعد از بوت شدن کرنل 
http://haghiri75.com/?p=1033

قسمت دوم: نمایش یک رشته بعد از بوت شدن کرنل
http://haghiri75.com/?p=1043

قسمت سوم : دریافت ورودی از کاربر 
http://haghiri75.com/?p=1051

قسمت سه و نیم : نمایش ارور به دستورات تعریف نشده + ضمیمه (شامل نحوه ساخت فایل قابل بوت از سیستم عامل)
http://haghiri75.com/?p=1059

قسمت پایانی : اضافه کردن دستورات about و help و reboot ، توضیح وقفه مربوط به reboot 
http://haghiri75.com/?p=1062

با تشکرات فراوان.

----------


## pswin.pooya

شما می دونید تعریف سیستم عامل چیه؟ فرق اون با برنامه معمولی چیه؟!

به هر برنامه ای که بوت شه سیستم عامل نمی گن که برادر من. تو رو خدا از این ایرانی بازیها دست بردارید با همچین تیترهایی توی کل دنیا مسخره خاص و عام کردین جماعت.

اوکی علاقه شدید دارید سیستم عامل بسازید. (قابل درک هست.) اما اینکه یه برنچ خالی از مثلا FreeBSD می گیرید بعد می دید بیرون میگن سیستم عامل ایرانی .... بابا زشته. از اون زشتر میرید داخل وبلاگ خارجی اصرار می کنید که آقا بگو فلانی سیستم عامل نوشته. میرید همایش می زارید و ... بعد میای یه برنامه بوت ساده می نویسی (اونم ۱۶ بیت باز لااقل ۳۲ بود می گفتیم بلده یه کارایی بکنه). میگی طراحی سیستم عامل قدم به قدم؟!!!!!!! 

ببینید یه چیزی به اسم حیاء هست. من واقعا برام جای تعجب هست که شما چجوری .... برادر من می دونم دوست داری بقیه فکر کنن کار خفن می کنی. اما کار خفن مطالعه، زمان و ... می خواد مهمتر از همه متانت می خواد. میای کد MikeOS رو عوض می کنی اونم ناقص می نویسی سیستم عامل از پایه ساختم (حداقل درست کپی پیست کن) میای BSD رو کامپایل می کنی میگی سیستم عامل از پایه ساختم:

https://barnamenevis.org/showthread.p...88%D8%B1%D8%AC

حالا یه بوت لودر ساده میسازی بعدش می گی آموزش سیستم عامل قدم به قدم؟! من یادم میاد توی یه مجله سال ۷۶ بچه های دانشگاه آزاد شبستر یه مقاله کامل برای بوت کردن نوشته بودن همچین ادعایی نکردن (تازه اونم سال ۷۶) (نزدیک ۲۰ سال پیش) حتی ربات ساختن که با استفاده از اون بوت لودر کنترل می شد و یه سیستم به اون بزرگی رو گذاشته بودن روی رباتشون بنده خداها. جالبه برام اگر جای اونها بودی عنوان تاپیکت چی می شد (یا همایش). 

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

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

----------


## کامبیز اسدزاده

من در عجبم شما در 19 سالگی به همه چیز یک سیستم عامل پی بردی! و در 4 مثال ساده یک سیستم عامل رو پیاده کردی!!! بیلی جون این رو ببینه درجا سکته مغزی و قلبی اونم به صورت همزمان میکنه !!!
حالا بیشتر توضیح نمیدم چون مدیر بخش جواب کامل و منطقی رو به اندازه کافی داده.

فقط به عنوان یک برنامه نویس تقاضا میکنم واقعا از این کارها دست بردارید! و از ارسال مجدد همچین پست هایی که آبروی برنامه نویس و مملکت رو میبره خودداری کنید.
درضمن این عنوان* "A beautiful mind"* که رو وبلاگتون هست با کاری که شما انجام دادین هم خوانی نداره.

آخه تا کی باید شاهد همچین مواردی باشیم... :اشتباه:  :ناراحت:

----------


## hoax3r

سلام

 دیدن یه چیزایی واقعا درد آوره که باعث میشه مایی که عادت بود بیایم یه نگاهی به سایت بندزیم بعد میرفتیم پی کارموم اینبار نتونم به راحتی این کارو کنم و دیدم که باید حرفمو بزنم. در مورد شما مدیر (ان) محترم صحبت میکنم. 

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

https://en.wikipedia.org/wiki/Operating_system

An operating system (OS) is system software that manages computer hardware and 
software resources and provides common services for computer programs.

همه احتیاج دارن fun داشته باشن هم شما آقای pswin.pooya همچنین prpre26 و همه شاید نخوان یک سیستم عامل کامل بنویسن (که شما هم شاملشین) فقط یه بخشتی ازش رو تو یه بازه زمانی انجام بدن. چون انجام دادن این کارا حال میده و همونطور که گفتم همه حق دارن از این حس لذت ببرن  :لبخند: .

pswin.pooya شما هم مدیرین  تو این سایت و این راه پر پیچ و خم نوشتن یک سیستم عامل رو طی کردین بیشتر تو چشمین می تونی از خودت یک تصویر مزخرف درست کنی یا می تونی یه الگوی بهتر باشی، تو یه زمینه هایی تخصص دارین و طبق تجربه میبینید کسی مسیر درستی نمیره بجایی که با این لحن فرد رو از ادامه دادن مسیر متوقف کنین  می تونی از دانشتون برای کمک کردن فرد استفاده کنید. به قولی به راه راست هدایت کنید. 
و در آخر بگم هدفم از زدن این پست توهین به کسی نیست و اگه لحن صحبت منم یکم تند بود و باعث آزده خاطری کسی شد عذر خواهی میکنم

شاد باشید

----------


## pswin.pooya

> یک فردی در چارچوب قوانین سایت حق داره در مورد هر مطلبی که می خواهد و  مرتبط با موضوعات اون سایت هست پستی منتشر کنه و به نظرم کسی حق نداره با  چنین لحنی با فرد مربوطه برخود کنه.


کسی با انتشار پست مشکل نداره. مشکل اصلی قرار دادن مطالبی هست که بقیه رو منحرف می کنن. مثلا ایشون می نویسه ساخت سیستم عامل قدم به قدم. کاربری هم که اطلاع نداره میاد و خوشحال شروع می کنه که آره پیدا کردم. این موضوع حتی در نتایج سرچ آنلاین و یا خود فروم هم تاثیر داره و منجر به تولید مطالب کذب میشه و در نتیجه کاربرها باید وقت بیشتری رو طلف کنن.





> شما مدیر محترم که می گی سیستم عامل ۳۲ بیتی نوشتین که دو سه تا ترید ایجاد  میکنه و میگه سلام، اینطوری نظر دادن کاری نداره هر کسی می تونه اینکارو  بکنه منم می تونم بگم کاری که شما کردین هم سیستم عامل نیست


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

کاری که من کردم یک سیستم عامل معمولی هست و با تعریف سیستم عامل می خونه که یکی از اونها به اشتراک گذاری منابع هست بین پروسسها هست (آراکس منابعی مانند حافظه و پردازنده و ... ) رو می تونه به اشتراک بزاره. هرچند که از این نظر قوی نیست اما در تعریف سیستم عامل می گنجه. 





> می تونم بگم کاری که شما کردین هم سیستم عامل نیست چون به جز نمایش یکسری متن کاره دیگه ای نمیکنه


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

2. از نظر فنی شما زمانی می تونید نظر بدید که در سطح یکسان و یا بیشتر از طرف مقابل باشید. مثلا یه برنامه نویس غیر سیستمی نمی تونه ادعا کنه چون این داره نمایش می ده سیستم عامل نیست. چون عملا هیچ درکی نسبت به سیستم عامل نداره و مراحل طراحی اون نداره. به عنوان مثال آراکس صفحه بندی حافظه و چند برنامه گی و ... رو داره هندل می کنه که جزء اصلی ترین قسمتهای سیستم عامل هستند. امکان داره شما برنامه نویسی سیستمی کرده باشید. اما اگر اینجوری بود همچین نظری سطحی رو نمی دادید. 




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


جواب بالا داده شده.





> همه احتیاج دارن fun داشته باشن هم شما آقای pswin.pooya همچنین prpre26 و  همه شاید نخوان یک سیستم عامل کامل بنویسن (که شما هم شاملشین) فقط یه  بخشتی ازش رو تو یه بازه زمانی انجام بدن. چون انجام دادن این کارا حال  میده و همونطور که گفتم همه حق دارن از این حس لذت ببرن .


بله همه می تونن fun داشتن باشن اما همه حق ندارن ادعا کنن جار بزنن. شما شاید تفریحتون تعمیر ماشین باشی اما چون تونستی لاستیک ماشین خودت رو عوض کنی یا روغنش رو عوض کنی و ... نمی تونی بگی من تعمیرکار هستم. برای اون position باید حتما لیاقت کافی داشته باشی.

بعد شما به بوت لودر می گین سیستم عامل؟ و اون رو قسمتی از سیستم عامل می دونید؟ با حساب شما شل و برنامه ها هم باید سیستم عامل باشن. یا اصلا خود گراب هم سیستم عامل به شمار میره؟! یا بوت لودر ویندوز؟! باید بگم که تمامی مراحل نوشتن دقیقا بعد از بوت لودر شروع میشه.

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




> می تونی از خودت یک تصویر مزخرف درست کنی یا می تونی  یه الگوی بهتر باشی، تو یه زمینه هایی تخصص دارین و طبق تجربه میبینید کسی  مسیر درستی نمیره بجایی که با این لحن فرد رو از ادامه دادن مسیر متوقف  کنین  می تونی از دانشتون برای کمک کردن فرد استفاده کنید. به قولی به راه  راست هدایت کنید.


1. اگر کسی سوال پرسیده باشه و تونسته باشم حلش کنم فورا جواب می دم.

2. اگر کسی تاپیکی مبتی بر طراحی زده و حرفش هم درست بوده حمایت کردم که از دوستان هم بدون، می تونید بپرسید.

3. اگر کسی ادعای بیخود کرده باشه. حرف مفت بزنه. من جلوش وای می ایستم. برام من مهم نیست چهرم  رو بد کنه یا از سایت بیرونم کنن و ... . من کاری رو که باید می کردم کردم و به چیزی که باورش داشتم انجامش دادم. متاسفانه کلا همه جا پر از ادعای الکی شده و یکی از مسائلی که برنامه نویسهای امروز درگیرن همین افرادی هستن که ادعای الکی می کنن و بازارشون رو خراب می کنن. متاسفانه تعدادشون اینقدر زیاد شده که نمیشه کاری خاصی کرد.

----------


## hoax3r

> کسی با انتشار پست مشکل نداره. مشکل اصلی قرار دادن مطالبی هست که بقیه رو منحرف می کنن. مثلا ایشون می نویسه ساخت سیستم عامل قدم به قدم. کاربری هم که اطلاع نداره میاد و خوشحال شروع می کنه که آره پیدا کردم. این موضوع حتی در نتایج سرچ آنلاین و یا خود فروم هم تاثیر داره و منجر به تولید مطالب کذب میشه و در نتیجه کاربرها باید وقت بیشتری رو طلف کنن.


مساله اینه که شما می خواهید حرف فقط حرف شما باشه، و برعکس چیزی که میگین مشکل شما دقیقا با انتشار پسته ولی پستایی که شما منحرف و بی اعتبار می دونید. بعد ایشون میگن قدم به قدم و تو هر سیستم عاملی مساله بوت هم هست همه سیستم عامل بوت لودر دارن که بعضی شخصی و بعضی عممومین و نمی دونم پست آخر این فرد رو داخل وبلاگشون دیدین که اینجا نقل میکنم.




> _بزودی سری جدیدی از این مقالات شروع میشه که سیستم عامل کوچولومون رو میبریم توی مود حفاظت شده ( Protected Mode ) که یک مود ۳۲ بیتی هست و احتمال خیلی زیاد از بوت لودر GRUB برای بوت کردنش استفاده خواهیم کرد!_


این نشون میده این فرد اطلاعاتی در این زمنیه داره و قدم بعدیشون هم که واضح بیان کردن ولی بخاطر اینکه بقول شما ایرانی بازی داره در میاره و یک کدی پایین تر از کد شما نوشته اصلا نباید وجود داشته باشه و باید کارشو متوقف کنه و اصلا هیچ ارزشی حتی برای یک کار ساده  کوچیک قائل نیستین. در حالی که اگر ایشون یا حالا هرکی یه کد ۶۴ بیتی می نوشت که مختصری هم ویژگی های مورد نیاز  مود long mode  رو میداشت و از کد شما بهتر میبود احتمالا شما می پرستیدینش. 




> خوشبختانه جز تاپیک خود آراکس نمی تونید جایی دیگه از من مطلبی پیدا کنید که ادعای ساخت سیستم عامل داشته باشم (یعنی جار زده باشم. ) و تمامی اطلاعات از جمله سورس کد و نحوه پیشرفت رو منتشر کردم که چند تا از دوستان هم تونستن و استفاده کردن (حداقل کامپایلش کردن).
> 
> کاری که من کردم یک سیستم عامل معمولی هست و با تعریف سیستم عامل می خونه که یکی از اونها به اشتراک گذاری منابع هست بین پروسسها هست (آراکس منابعی مانند حافظه و پردازنده و ... ) رو می تونه به اشتراک بزاره. هرچند که از این نظر قوی نیست اما در تعریف سیستم عامل می گنجه.


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

اینی که گفتم مثاله زیاد جدی نگیرین




> 2. از نظر فنی شما زمانی می تونید نظر بدید که در سطح یکسان و یا بیشتر از طرف مقابل باشید. مثلا یه برنامه نویس غیر سیستمی نمی تونه ادعا کنه چون این داره نمایش می ده سیستم عامل نیست. چون عملا هیچ درکی نسبت به سیستم عامل نداره و مراحل طراحی اون نداره. به عنوان مثال آراکس صفحه بندی حافظه و چند برنامه گی و ... رو داره هندل می کنه که جزء اصلی ترین قسمتهای سیستم عامل هستند. امکان داره شما برنامه نویسی سیستمی کرده باشید. اما اگر اینجوری بود همچین نظری سطحی رو نمی دادید.


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

تو کد شما  همونی که تو sourceforge‌ گذاشتین رو یه نگاه کردم الان در واقع فایل atomic.h و spinlock.c رو می گم اشتباه نوشتین این بخشو معلومه اصلا متوجه نشدین که اینا برای چی به بوجود اومدن اصلا چرا بهش atomic میگن. حالا من همین اولین مسیر تو پوشه سورس شما رو طی کردم و فایلها رو بررسی کردم معلوم نیست چقدر ایراد دیگه ممکنه این سیستم عامل شما داشته باشه (توجه بشه که دارم از روش خودت استفاده میکنم، بدون راهنمایی فقط میگم خراب کردی  و بلد نیستی :لبخند:  به خاطر اینکه فکر میکنم سیستم عامل که شما نوشین فقط دو ترد میزنه سلام مکینه) پایین تر هم گفتی که سمافور هم کار نمیده بخاطر اینکه یه نکته خیلی خیلی مهم را تو این کدا جا انداختی.




> بله همه می تونن fun داشتن باشن اما همه حق ندارن ادعا کنن جار بزنن. شما شاید تفریحتون تعمیر ماشین باشی اما چون تونستی لاستیک ماشین خودت رو عوض کنی یا روغنش رو عوض کنی و ... نمی تونی بگی من تعمیرکار هستم. برای اون position باید حتما لیاقت کافی داشته باشی.


تو مدل دیکتاری بله کسی حق حرف زدن و احظار نظر نداره، و اینکه همه از یه جایی شروع میکنن یکی سیستم عامل می خواد بنویسه اول از بوت لودر شروع میکنه یکی بخواد تعمیر کار ماشین بشه از پنچر گیری و تعویض روغن شروع میکنه و این مسیر غلط نیست اگه این افراد حالا جایی هم بگن که تعمیر کارن با این هدف که بیشتر یاد بگیرن و باعث پیشرفت بشه. حالا این وسط بله سود جود هم هست و عجیب هم نیست اینو در نظر بگیر که تو این کشور خیلی چیزا هردنبیل هم هست اینطوری دیگه تشخیص اینکه کی کار درست میکنه و غلط شاید تو نگاه اول مشخص نباشه ولی یکی بعد از یک مدت نشون میده که کدوم دسته هست و واقعا نیاز به این همه تحقیر و داد بیداد با طرف مقابل نیست (حداقل نظر من اینطوری)




> بعد شما به بوت لودر می گین سیستم عامل؟ و اون رو قسمتی از سیستم عامل می دونید؟ با حساب شما شل و برنامه ها هم باید سیستم عامل باشن. یا اصلا خود گراب هم سیستم عامل به شمار میره؟! یا بوت لودر ویندوز؟! باید بگم که تمامی مراحل نوشتن دقیقا بعد از بوت لودر شروع میشه.


همه چیزایی که گفتین به هر حال در کنار هم معنی میدن، کرنلی که نتونه لود بشه به چه درد می خوره یا همون کرنل اگه کاربری شلی نداشته باشه که باهاش کار کنه چه فایده ای داره. و چه بسا که یکسری جاها اختصاصی همه قسمت رو خودشون می نویسن و این حرفا رو هم نمیزنن (که به نظر میاد چونه خودتون برای سیستم عامل خودتون اینطوری تصمیم گرفتین که بوت لودر ننویسین با هر توجیحی این نظر رو میدین،)

در ضمن بوت لودر رو دست کم گرفتی شما خودش کم از سیستم عامل نداره همین گراب رو میشه برایش ماژول نوشت یه چیزی مثل ماژول (درایور ) تو کرنل لود میشه کار برات انجام میده/مدیریت حافطه داره/با دستگاهای مختلف می تونه کار کنه/ اخیرا یه بابایی پایتون رو روی همین گراب بالا آورده بود که یکسری تست مربوط به سخت افزار رو توش انجام بده. (برای اطلاعات بیشتر grub bits رو سرچ کنید این مقاله رو هم بخونید در صورت علاقه)




> 1. اگر کسی سوال پرسیده باشه و تونسته باشم حلش کنم فورا جواب می دم.
> 
> 2. اگر کسی تاپیکی مبتی بر طراحی زده و حرفش هم درست بوده حمایت کردم که از دوستان هم بدون، می تونید بپرسید.


 بهتره همه اینطوری باشن




> 3. اگر کسی ادعای بیخود کرده باشه. حرف مفت بزنه. من جلوش وای می ایستم. برام من مهم نیست چهرم رو بد کنه یا از سایت بیرونم کنن و ... . من کاری رو که باید می کردم کردم و به چیزی که باورش داشتم انجامش دادم. متاسفانه کلا همه جا پر از ادعای الکی شده و یکی از مسائلی که برنامه نویسهای امروز درگیرن همین افرادی هستن که ادعای الکی می کنن و بازارشون رو خراب می کنن. متاسفانه تعدادشون اینقدر زیاد شده که نمیشه کاری خاصی کرد.


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

----------


## pswin.pooya

> بعد ایشون میگن قدم به قدم و تو هر سیستم عاملی مساله بوت هم هست  همه سیستم عامل بوت لودر دارن که بعضی شخصی و بعضی عممومین و نمی دونم پست  آخر این فرد رو داخل وبلاگشون دیدین که اینجا نقل میکنم.


می تونم بهتون اطمینان بدم که توی همه سیستم عاملها نیست. به عنوان مثال سیستم عاملهای میکروکنترلرها و یا کلا بهتره بگم سیستم هایی که حافظه اونها مپ شده بوت لودر ندارن و خود پردازنده می دونه باید از کدوم آدرس شروع کنه. توی برخی از معماری ها وقتی شما به آدرس خاصی از حافظه دسترسی دارید اون یعنی اون آدرس دقیقا آدرس فلش هست. پس بنابرین با شروع کد از مکان خاصی رو فلش می شه خیلی راحت اجرا کرد و نیازی به بوت لودر نیست. (البته این فقط محدود به فلش نیست حتی ریجیستر دستگاه ها هم مپ میشن رو  حافظه که دیگه شما احتیاجی به مواردی مانند پورت های سخت افزاری برای تعامل  با دستگاه ها ندارین). اما در برخی دیگه از سیستم ها از جمله x86 حتما لازمه که کد از رسانه به حافظه انتقال داده بشه که بوت لودر روی کار میاد و این عملیات رو انجام میده. 





> تو کد شما  همونی که تو sourceforge‌ گذاشتین رو یه نگاه کردم الان در واقع  فایل atomic.h و spinlock.c رو می گم اشتباه نوشتین این بخشو معلومه اصلا  متوجه نشدین که اینا برای چی به بوجود اومدن اصلا چرا بهش atomic میگن.


خوشحال می شم ایرادشون رو بدونم؟! چون من spinlock رو خیلی کامل تست کردم و می دونم درست کار می کنه. atomic.h هم برای یکسری کارهای اتمیک کنار گذاشته شده. بیشتر مربوط به ساختارهای کامپایلری و مربوط به معماری هستن که می تونه همیشه وجود نداشته باشن. 




> بدون راهنمایی فقط میگم خراب کردی  و بلد نیستی


برای این نباشه که نمی دونی چرا؟ اصولا وقتی آدم ها می دونن چه خبره خیلی راحت می گن و حل میشه اما این بچه بازیها برای زمانی هست که چیزی تو چنته ندارن.




> سمافور هم کار نمیده بخاطر اینکه یه نکته خیلی خیلی مهم را تو این کدا جا انداختی


دوباره خوشحال می شم بدونم چه نکته ای رو توی سمافور جا انداختم؟! هرچند با توجه به track کردن کدم فکر کنم همچین چیزی باشه




> کرنل اگه کاربری شلی نداشته باشه که باهاش کار کنه چه فایده ای داره.


می خوای کلی برات سیستم عامل مثال بزنم که شل ندارن؟ یا حتی بقول شما نقطه استارت (بوت لودر ) ندارن؟. حتی خیلی راحت می تونید شل لینوکس رو حذف کنید ازش کار بکشید. مساله همینه درک اشتباه از کارکرد سیستم عامل و ادعا کردن. ببین دوست من سیستم عاملهای زیادی هستن که شل ندارن مثلا RTOS و ... حتی سیستم عاملهایی هم که پیش فرض روشون هست میشه شل رو  حذف کرد و ازشون کار کشید. حتی توی ویندوز  می تونید explorer.exe که یجورایی شل اون حساب میشه رو stop کنید. و دوباره می بینید که داره سرویس میده. برنامه ها اجرا میشن و ... پس حتی ویندوز داغون هم بدون شل کار می کنه چه برسه به بقیه. یا اصلا ویندوز رو ول کن. شما شل داس رو که اگر اشتباه نکنم command.com بود رو هم می تونید بر دارید و جایگزین کنید. (یکی توی دانشگاه اومد پیشم گفت من سیستم عامل ساختم. من یکم تعجب کردم دیدم بهش نمی خوره. بعد از این ور اونور کردن دردیم command.com رو گرفته برداشته بجاش برنامه خودش رو گذاشته.)




> که اونجا هستن افرادی که روی بوت لودر هم کار میکنن


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

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

----------


## hoax3r

> می تونم بهتون اطمینان بدم که توی همه سیستم عاملها نیست. به عنوان مثال سیستم عاملهای میکروکنترلرها و یا کلا بهتره بگم سیستم هایی که حافظه اونها مپ شده بوت لودر ندارن و خود پردازنده می دونه باید از کدوم آدرس شروع کنه. توی برخی از معماری ها وقتی شما به آدرس خاصی از حافظه دسترسی دارید اون یعنی اون آدرس دقیقا آدرس فلش هست. پس بنابرین با شروع کد از مکان خاصی رو فلش می شه خیلی راحت اجرا کرد و نیازی به بوت لودر نیست. (البته این فقط محدود به فلش نیست حتی ریجیستر دستگاه ها هم مپ میشن رو حافظه که دیگه شما احتیاجی به مواردی مانند پورت های سخت افزاری برای تعامل با دستگاه ها ندارین). اما در برخی دیگه از سیستم ها از جمله x86 حتما لازمه که کد از رسانه به حافظه انتقال داده بشه که بوت لودر روی کار میاد و این عملیات رو انجام میده.


این یعنی روی معماری های x86 آدرس مپ شدن نداریم؟ مثلا این که میگن تو معماری x86 سی پی یو از آدرس FFFF_FFF0h شروع میکنه به اجرا و داخل این آدرس یک دستور پرش که به BIOS میپره. خوب تو اون لحظه مگه BIOS تو حافظه اصلی لود شده؟ اصلا تو این لحظه دقیقا کد از کجا شروع به اجرا میشه؟ مگه از حافظه فلش مربوط به BIOS نیست؟ 

طبق حرف شما فرق زیادی بین x86 معماری های میکروکنترلری که میگین نیستش (نه که هیچ فرقی نیست ولی این مساله مپ آدرس اینا تو x86 هم هست)، 

اینجا آدرس رو برای اطلاعات بیشتر یه نگاهی بندازین که سیستم های بر پایه PCI چطور کار می کنن
http://resources.infosecinstitute.com/system-address-map-initialization-in-x86x64-architecture-part-1-pci-based-systems





> خوشحال می شم ایرادشون رو بدونم؟! چون من spinlock رو خیلی کامل تست کردم و می دونم درست کار می کنه. atomic.h هم برای یکسری کارهای اتمیک کنار گذاشته شده. بیشتر مربوط به ساختارهای کامپایلری و مربوط به معماری هستن که می تونه همیشه وجود نداشته باشن.


من تو اون لحظه یه مساله خیلی به چشم میمود  اونم اینکه دستوری که قراره atomic باشه با یه lock prefix همراهه ولی خوب شما چون روی یک هسته کار میکنین این فعلا خیلی مساله ای ایجاد نمی کنه




> می خوای کلی برات سیستم عامل مثال بزنم که شل ندارن؟ یا حتی بقول شما نقطه استارت (بوت لودر ) ندارن؟. حتی خیلی راحت می تونید شل لینوکس رو حذف کنید ازش کار بکشید. مساله همینه درک اشتباه از کارکرد سیستم عامل و ادعا کردن. ببین دوست من سیستم عاملهای زیادی هستن که شل ندارن مثلا RTOS و ... حتی سیستم عاملهایی هم که پیش فرض روشون هست میشه شل رو حذف کرد و ازشون کار کشید. حتی توی ویندوز می تونید explorer.exe که یجورایی شل اون حساب میشه رو stop کنید. و دوباره می بینید که داره سرویس میده. برنامه ها اجرا میشن و ... پس حتی ویندوز داغون هم بدون شل کار می کنه چه برسه به بقیه. یا اصلا ویندوز رو ول کن. شما شل داس رو که اگر اشتباه نکنم command.com بود رو هم می تونید بر دارید و جایگزین کنید. (یکی توی دانشگاه اومد پیشم گفت من سیستم عامل ساختم. من یکم تعجب کردم دیدم بهش نمی خوره. بعد از این ور اونور کردن دردیم command.com رو گرفته برداشته بجاش برنامه خودش رو گذاشته.)


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

و یه نکته دیگه و پر واضح اینه که شما تجربه هایی با افراد نابلد داشتین و این طرز فکر به وجود آمده که همه اینجوری هستن و خوب و بد رو با هم به یک شکل برخورد می کنین




> شما هیچ شخص دانایی رو پیدا نمی کنی. که روی بوت لودر کار کنه و بگه سیستم عامل ساختم. هرچند که گفتم بوت لودر هم فقط در برخی از معماری ها از جمله x86 استفاده میشه.


با این استدلال واقعا نمی دونم چی می تونم بگم، یعنی اونایی که بوت لودر ساختن و بعدم سیستم عامل ساختن آدم های دانایی نبودن
ولی شما که داری روی سیستم عامل کار میکنی و بوت لودر اونا رو هم استفاده میکنی آدم دانایی هستی؟

----------


## pswin.pooya

> این یعنی روی معماری های x86 آدرس مپ شدن نداریم؟ مثلا این که میگن تو معماری x86 سی پی یو از آدرس FFFF_FFF0h شروع میکنه به اجرا و داخل این آدرس یک دستور پرش که به BIOS میپره. خوب تو اون لحظه مگه BIOS تو حافظه اصلی لود شده؟


قبل از شروع کار بله دقیقا بایوس لود میشه. 

the BIOS executes the normal power-on self test, decompresses the BIOS and copies it into the RAM that's _actually_ located at FFFF:0000 



> طبق حرف شما  فرق زیادی بین x86 معماری های میکروکنترلری که میگین نیستش (نه که هیچ  فرقی نیست ولی این مساله مپ آدرس اینا تو x86 هم هست)،


شما هموز فرق map با لود کردن(‌کپی کردن ) رو نمی دونید. بله داخل x86 هم مپ وجود داره. مثلا بافر فریم کارت گرافیک و یکسری موارد دیگه می تونن مپ شن. اما برادر من دارم می گم کد (مثلا فلش) مپ شده و یا پورت مپ شده که کلا جریانش خیلی خیلی فرق می کنه. من نمی دونم چرا موقع خودن دقت نمی کنید. مورد بعدی اینه که توی x86 مپ کردن دستی انجام می گیره (توسط برنامه نویس یا بایوس) اما داخل معماری های دیگه جز طبیعت اون معماری هست. یعنی زمان دیزاین سخت افزاری برای اینکار در نظر گرفته میشه که پیش فرض به آدرسهایی مپ کرده.

مثلا داخل میکرو کنترلرهای ARM قسمتی از حافظه به پورت ها تعلق داره که با تغییر اونها ثباتهای داخل پورت تغییر می کنه. بعد از قسمت کد هستش که از طریق باس کد به فلش متصل هست. و هر آدرسی درخواست بدین توی اون ناحیه از فلش درخواست می شه (معماری هاروارد رو مطالعه کنید- برای باس کد) بعد از قسمت مربوط به کد حافظه RAM (SRAM) قرار داره و .... 




> من تو اون لحظه یه مساله خیلی به چشم میمود  اونم اینکه دستوری که قراره  atomic باشه با یه lock prefix همراهه ولی خوب شما چون روی یک هسته کار  میکنین این فعلا خیلی مساله ای ایجاد نمی کنه


۱. من هنوز نگرفتم منظورتون چیه و ایراد کجاست؟!
۲. مشکل spinlock چی بود؟ که کلا اشتباه بود از نظر شما؟
۳. مشل سمافور چی بود؟ که می گفتن چیزی رو جا انداختم؟
(لطفا گرینه به گزینه جواب بدین)(اگر واقعا الکی ادعا کردی - که به نظرم اینطوره - می تونی بگی اشتباه کردم. اشتباه متوجه شده بودم. یا امثال اون. اما بدترین کاری که می تونی بکنی ادامه اشتباه هست.‌).

در مورد اتمیک. ما قراره یکسری متغییرهای اتمیک با عملیات اتمیک روی اونها داشته باشیم. x86 از برخی مدلها به بعد یکسری عمیات اتمیک رو ساپورت می کنه (دستور اسمبلی داره) که داخل خیلی از معماری ها نیستن. برای این دستورها توابعی فراهم شده توی آراکس که شکل یکریخت داشته باشن تا بشکل دیگه در معماری های دیگه پیاده سازی شن (مثلا با یه قفل و ... ). برای همین فایل هدر atmoic.h در پوشه arch که مرتبط با معماری خاص هست قرار داده شده. تا کد تا حد امکان portable باشه بین معماری های مختلف. برای برخی از این موارد خود gcc ماکروهایی داره که من از اونها استفاده کردم. برخی موارد دیگه عملیات تغییر حافظه با یک دستور اسمبلی استفاده میشه و ... . فعلا از این دستورها داخل کد استفاده نشده. و می تونه هر ایرادی داشته باشن. احتمال استفاده در آینده هم کم هست چون ما قرار ساختارها رو محافظت بکنیم. مثلا چیزی شبیه به یک نود فایل سیستم. نه متغییر خاصی رو که کد قابل حملتر باشه. اینها حدود ۴ سال پیش قدمهای اولیه برای پیاده سازی انواع قفلها و بعد از اون پیاده سازی فایل سیستم و در نهایت IPC در آراکس بود. لطفا این موارد رو با چیزهایی شبیه توابع اتمیک خود هسته و ... اشتباه نگرید. 




> شما چون روی یک هسته کار  میکنین


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




> شل منظور اینه که در نهایت باید یه راه ارتباطی بین کاربر و سیستم عامل  وجود داشته باشه یا نه مثلا همین یه سرویس رو بخوای قطع کنی چطوری می خوای  به سیستم عامل بگی؟ و واقعا نیازی به توضیح بیشتر نداره به نظرم


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




> با این استدلال واقعا نمی دونم چی می تونم بگم، یعنی اونایی که بوت لودر ساختن و بعدم سیستم عامل ساختن آدم های دانایی نبودن
> ولی شما که داری روی سیستم عامل کار میکنی و بوت لودر اونا رو هم استفاده میکنی آدم دانایی هستی؟


دوباره جمله رو دقیق نخوندی. معنی جمله من: هیچ کسی که بوت لودر ساخته. اسم بوت لودرش رو سیستم عامل نمی زاره. (اگر شعور کافی بهره مند باشه) بله بعدا امکان دارن سیستم عامل بسازن اما اون سیستم عامل هست و قبلیش بوت لودر. (دو تا معقوله جدا هستن.)

----------


## hoax3r

> قبل از شروع کار بله دقیقا بایوس لود میشه. 
> 
> the BIOS executes the normal power-on self test, decompresses the BIOS and copies it into the RAM that's _actually located at FFFF:0000_





> شما هموز فرق map با لود کردن(‌کپی کردن ) رو نمی دونید. بله داخل x86 هم مپ وجود داره. مثلا بافر فریم کارت گرافیک و یکسری موارد دیگه می تونن مپ شن. اما برادر من دارم می گم کد (مثلا فلش) مپ شده و یا پورت مپ شده که کلا جریانش خیلی خیلی فرق می کنه. من نمی دونم چرا موقع خودن دقت نمی کنید. مورد بعدی اینه که توی x86 مپ کردن دستی انجام می گیره (توسط برنامه نویس یا بایوس) اما داخل معماری های دیگه جز طبیعت اون معماری هست. یعنی زمان دیزاین سخت افزاری برای اینکار در نظر گرفته میشه که پیش فرض به آدرسهایی مپ کرده.
> 
> مثلا داخل میکرو کنترلرهای ARM قسمتی از حافظه به پورت ها تعلق داره که با تغییر اونها ثباتهای داخل پورت تغییر می کنه. بعد از قسمت کد هستش که از طریق باس کد به فلش متصل هست. و هر آدرسی درخواست بدین توی اون ناحیه از فلش درخواست می شه (معماری هاروارد رو مطالعه کنید- برای باس کد) بعد از قسمت مربوط به کد حافظه RAM (SRAM) قرار داره و ....


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

حالا باز باید همه رو دوباره بگم، اول شما گفتین میکرو ها با x86 فرق داره چون آدرس ها مپ شده و و ... و من بعد گفتم این قضیه داخل x86 هم وجود داره و نحوه بوت هم به این صورت که سی پی یو از آدرس FFFF_FFF0h که بهش reset vector می گن شروع می کنه به اجرا و این آدرس مپ میشه به فلش BIOS (نه حافظه اصلی و در این مرحله BIOS داخل حافظه اصلی نیست فعلا) و اونجا یه دستور پرش وجود داره که به دستورات راه انداز BIOS پرش میکنه. دراین مرحله کلی اتفاق می افته (مراحل 1 تا 5A  از مقاله ای که ارجاع دادم و شما زحمت خوندن به خودتون ندادین) تا برسه به مرحله ای که BIOS کدشو (اگر فشرده است از حالت فشرده خارج می کنه) داخل حافظه اصلی کپی میکنه (میشه مرحله 5B) و ادامه ماجرا که دستگاه قابل بوت انتخاب بشه و لود بشه و ....




> ۱. من هنوز نگرفتم منظورتون چیه و ایراد کجاست؟!
> ۲. مشکل spinlock چی بود؟ که کلا اشتباه بود از نظر شما؟
> ۳. مشل سمافور چی بود؟ که می گفتن چیزی رو جا انداختم؟
> (لطفا گرینه به گزینه جواب بدین)(اگر واقعا الکی ادعا کردی - که به نظرم اینطوره - می تونی بگی اشتباه کردم. اشتباه متوجه شده بودم. یا امثال اون. اما بدترین کاری که می تونی بکنی ادامه اشتباه هست.‌).
> 
> در مورد اتمیک. ما قراره یکسری متغییرهای اتمیک با عملیات اتمیک روی اونها داشته باشیم. x86 از برخی مدلها به بعد یکسری عمیات اتمیک رو ساپورت می کنه (دستور اسمبلی داره) که داخل خیلی از معماری ها نیستن. برای این دستورها توابعی فراهم شده توی آراکس که شکل یکریخت داشته باشن تا بشکل دیگه در معماری های دیگه پیاده سازی شن (مثلا با یه قفل و ... ). برای همین فایل هدر atmoic.h در پوشه arch که مرتبط با معماری خاص هست قرار داده شده. تا کد تا حد امکان portable باشه بین معماری های مختلف. برای برخی از این موارد خود gcc ماکروهایی داره که من از اونها استفاده کردم. برخی موارد دیگه عملیات تغییر حافظه با یک دستور اسمبلی استفاده میشه و ... . فعلا از این دستورها داخل کد استفاده نشده. و می تونه هر ایرادی داشته باشن. احتمال استفاده در آینده هم کم هست چون ما قرار ساختارها رو محافظت بکنیم. مثلا چیزی شبیه به یک نود فایل سیستم. نه متغییر خاصی رو که کد قابل حملتر باشه. اینها حدود ۴ سال پیش قدمهای اولیه برای پیاده سازی انواع قفلها و بعد از اون پیاده سازی فایل سیستم و در نهایت IPC در آراکس بود. لطفا این موارد رو با چیزهایی شبیه توابع اتمیک خود هسته و ... اشتباه نگرید.





> دقیقا قرار نیست. فقط روی یک هسته پردازنده باشه.


مساله سر نبودن LOCK هست که بعد دیدم که تو یک هسته اصلا شاید لازم نباشه به این پیشوند که اشاره کردم به این موضوع ولی شما میگین برای چند هسته ای هم به این صورت می خواین استفاده کنید که  در این صورت باید از این prefix استفاده بشه حداقل تا جایی که من اطلاع دارم، چون شما هم میگین بدون اینا می خواین  اگه راه دیگه ای وجود داره خوشحال میشم در موردشون صحبت کنید




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


من ارتباطی بین LOCK با وقفه ها پیدا نمی کنم، ما که در مورد وقفه صحبتی نکردیم، بیشتر در این مورد توضیح بدین، ممنون
و همچنین در مورد دیگر قفل ها،




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


خوشحال می شم اطلاعاتتون رو در اختیار من و دیگران بگذارین چون دیگر کاربرها هم شاید براشون این موضوعات جالب باشه (و خود من) و استفاده می کنیم




> بله بعدا امکان دارن سیستم عامل بسازن اما اون سیستم عامل هست و قبلیش بوت لودر. (دو تا معقوله جدا هستن.)


خوب این نظر خودته نباید به کسی تحمیلش کنی.

----------


## M_Ali_Safdari

واقعآ در فضایی دوستانه نمی شه تبادل اطلاعات داشت؟
آدم حس میدون جنگ بهش دست میده. چقدر زشته که با اطلاعات به رخ کشیدن با هم بجنگیم.
متآسفم.

----------


## joker

> واقعآ در فضایی دوستانه نمی شه تبادل اطلاعات داشت؟
> آدم حس میدون جنگ بهش دست میده. چقدر زشته که با اطلاعات به رخ کشیدن با هم بجنگیم.
> متآسفم.


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

----------


## pswin.pooya

> این مدل به قول شما جنگ ، خیلی هم خوب و مفیده. بخونی کلی چیز یاد میگیری


می دونی چیه بهتره ساکت موند. من یکی دوبار یه مورد رو توضیح می دم دیگه طرف نگرفت یا اصرار داشت متوجه نشه بهتره بزاری بمونه. متاسفانه چون از مطلبی سر در نمیارن فکر می کنن کسی داره بهشون توضیح میده می خواد به رخشون بکشه. دیگه چی میشه گفت؟

من یادم میاد سال ۸۶ که درس برنامه نویسی پیشرفته رو توی دانشگاه برداشتم استاد اومد تو و شروع کرد بد گفتن از زبان C++‎‎‎‎ و تعریف کردن سی شارپ. متاسفانه اون استاد چیزی بجزء توربو سی ندیده بود در نتیجه ذهنش همون قدر مشغول بود بعد من شروع کردم به توضیح دادن و نشون دادن ویژوال استادیو ۲۰۰۵ و کارهایی که میشه با C++‎‎‎‎ کرد. اما نتیجه این شد که استاد فکر کرد من اشتباه می کنم. و درس برنامه نویسی پیشرفته رو بهم ۱۲ داد درصورتی که همون زمان من داشتم روی موتور بازی KGE کار می کردم. و چند سال بعد همون کس وقتی دید من دارم با لینوکس کار می کنم به من گفت لینوکس که کاربردی نداره تو فقط برای پز دادن نصبش کردی. من طبق تجربه گفتم بله استاد دیگه علاقه هست نمیشه کاریش کرد.

دو سال بعد توی دانشگاه درس طراحی زبانهای برنامه نویسی برداشت و بحث از اینکه زبان C++‎‎‎‎ اشکال طراحی داره باز شد. خلاصه کلام من چند تا ادعا کردم که استاد می گفت امکان نداره. اولی اون این بود که کلمه new عملگر هست و نه کلمه کلیدی (کلمات کلیدی رو طبق تعریف زبان نمیشه کاربردشون رو تغییر داد.) بعد یه مورد دیگه تابع main بود که می گفت نمیشه عوضش کرد و حتما باید وجود داشته باشه. (من مدعی بودم که اصلا احتیاجی به تابع main نیست و با تغییر entry point میشه هر تابعی رو که می خوای صدا بزنی یا اصلا یه روش دیگه در پیش بگیری. خلاصه کلام استاد گفت اگر بتونی این رو ثابت کنی من بهت ۲۰ میدم و من جلسه بعد جلوی همه اینکارها رو کردم. اما پایان ترم بهم ۸ داد (اونم شیش واحد) جالبه بدونید که من اون زمان داشتم روی آراکس کار می کردم و یه زبان اسکریپت با راهنمایی های دوست عزیزم آقای محمدی (kochol) ساخته بودم. و البته اینم بگم که هیچ وقت نظر اون استاد تغییر نکرد.

دقیقا همون سال که اوج کار من روی آراکس بود یکی از استادها برگشت بهم گفت چرا داری بیخودی سیستم عامل طراحی می کنی؟!!! این هیچ ارزشی نداره. در جوابش چیز خاصی نداشتم بگم چون کلا هدف من سرگرمی و یادگیری بود و هدف تجاری نداشتم و البته چیزی که اون استاد هیچ وقت درک نکرد این بود من چیزهایی رو یاد گرفته بودم که می تونست کمکم کنه که درک بهتری از سیستم و ... داشته باشم. 

سال بعدش که دیگه ترم های آخرم بود درس کامپایلر داشتیم. یه روز به استاد کامپایلر BNF زبانم رو نشون دادم که نگاه کنه ببینه درسته یا نه. یهو دیدم اصلا ازش سر در نمیاره که چیه (میشه گفت یکی از اولین قدم های طراحی کامپایلر رسم BNF هست که باهاش پارسر رو درست می کنن). اوکی اون استاد بعدش ناراحت شد از دستم و فکر می کرد که پز گذاشتم و کنار همکاراش خرابش کردم (باورتون شاید نشه من فقط BNF رو نشون دادم نفهمید گفت چیه؟ برو بعدا بیا و من رفتم و بعد ۱۲ شدم توی طراحی کامپایلر) همون سال من یک سال بود که زبان اسکریپتم رو ساخته بودم. و حتی آپ کدهای x86 رو مطالعه کرده بودم که باهاش یه موتور JIT برای زبان اسکریپتم بسازم

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

امروز هم این جریانات وجود داره. توی همین تالار یکسری گفتم معماری x86 خوب نیست. یکی از برنامه نویسهای معروف بهم گفت دیگه تعصب روی معماری ندیده بودم شاید برای این بود که اون تنها چیزی که از CPU دیده پایه های زیرش باشه یا heat sink روش و امثال اون. حالا تا صبح هم توضیح بده که برادر من به دلیل x و y پردازنده های x86 اصلا معماری خوبی ندارن (حتی اینتل هم این رو قبول داره و چند سال پیش کل معماری پایه رو تغییر داد و فقط یک لایه واسط x86 روش کشید که بازهم بخاطر موارد دیگه نتونست به اندازه معماریهایی مثل ARM و یا SPARC موفق شه)‌.

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

----------


## M_Ali_Safdari

جناب *pswin.pooya*
یه پیشنهاد ساده اینقدر عکس العمل داره؟
غرور فقط آدم رو احمق میکنه.
اینهمه ذکر مصیبت برای نشان دادن خودتون لازم نیست، از روی نوشته های قبلی هم می شد پی به شخصیت شما برد.

آدمی که همه رو احمق فرض کنه و خودش رو عقل کل نیاز به توضیح نداره.
کلآ آدمی از نوع "بدون شرح" هستید. لازم نیست این داستان ها رو به خودتون سنجاق کنید.نیازی هم به توضیح به دیگران نیست خودتون رو خسته نکنید.
دنبال ایراد در اخلاق و تفکرات خودتون باشید و اصلاح کنید.

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

واقعآ همون بهتر که ساکت بمونید و بیشتر از این خوتون رو نشون ندید!

----------


## hoax3r

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

تو این شکی نیست که شما دانش زیادی تو زمینه های مختلف دارین ولی با این حال اشتباه هم می کنید و متاسفانه این اشتباهات در مورد مسائلی هست که مطلق هستن و عشقی نمیشه در موردشون صحبت کرد. من قبل تر گفتم lock برای اینه که دستور اتومیک روی سی پی یو های چند هسته ای ایجاد کنیم ولی شما کلا این موضوع رو رد کردین !!!؟؟؟

این موضوعی نیست که همینطوری رو هوا برای خودتون بخواین نظر بدین (اصلا نظر دادن در این مورد بی معنیه باید اینا از منبع منتفل بشه نه عشقی نظر داده بشه)، فقط برای اثبات این موضوع:

 Intel 64 and IA-32 Architectures Software Developer's Manual 



> 8.1 LOCKED ATOMIC OPERATIONS
> The 32-bit IA-32 processors support locked atomic operations on locations in system memory. These operations are typically used to manage shared data structures (such as semaphores, segment descriptors, system segments, or page tables) in which two or more processors may try simultaneously to modify the same field or flag. The processor uses three interdependent mechanisms for carrying out locked atomic operations:
> 
> Guaranteed atomic operationsBus locking, using the LOCK# signal and the LOCK instruction prefix 
> ...
> ...


یا این
http://stackoverflow.com/questions/1...-is-so-limited


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


برای اینکه بگم منم بی عیب نیستم میگم در مورد بوت لودر و os اشتباه کردم. نظرم عوض شد اینا جدان و حرف شما درسته. 


این آخر هم داستان تعریف کردین منم برای این که حال و هوای پست از حالت جنگ خارج بشه یه خاطره ای از استادامون بگم. فکر کنم سه سال پیش بشه، یک استاد شبکه داشتیم که یکمی هم ادعا در زمینه امنیت داشت . من اون موقع برای اینکه این وقتی که میزارم میرم دانشگاه که واقعا هم وقت الکی هست رو به یه کار مفید اختصاص بدیم جلسه دوم رفتم پیش استاد گفتم میخوام روی یه پروژه تحلیل خودکار بدافزار کار کنم تو اون لحظه چون دورش یکسری دانشجوی دیگه هم بودن و این استاد هم برای اینکه بپیچونه زود بره گفت خوب شما یک ایمیل بده عنوان پروژه به اضافه ی یکسری مقاله مرتبط برام ایمیل کن تا برسی کنیم. گفتیم باشه. منم اون دوره روی hypervisor خصوصا intel vt-x مطالعاتی داشتم دید خوبی هم روی بدافزارها داشتم یه ایده هایی هم داشتیم رفتم کتابخونه یه ۶-۷ تا مقاله تو این زمینه که می شد تو زمان مطالعه کرد رو خیلی عمیق خوندیم هر نکته ای به درد بخوری بود یادداشت کردم و در نهایت ۳ تا انتخاب کردم با موضوع فرستادم به استاد. جلسه بعد خوشحال بودم که روی این موضوع با یه استاد بتونم کار کنم. ولی خوب اون جلسه اون جوری که من میخواستم پیش نرفت، وقتی سر جلسه رفتم دیدم استاد کمی با استرس صحبت میکنه (به خاطر حظور من) یجوری رفتار کرد که انگار اصلا من وجود ندارم تو کلاس حتی یه بار هم نگاهش به من نیافتاد. من تو اون لحظه به تنها چیزی که فکر نکرده بودم این بود که کسی رو بخوام بترسونم ولی خوب وضعیت اینطوری بود حتی بعد اتمام کلاس هم رفتم جلوتر نشتم که استاده صحبتش با دانشجوها تمام شد برم صحبت کنم دیدم باز همون طوری صحبت مینکه که برای اینکه از این وضعیت در باید منو صدا زد گفت چی بود پروژه و .... که خلاصه در نهایت ما رو پیچوند.

----------


## pswin.pooya

> تو این شکی نیست که شما دانش زیادی تو زمینه های مختلف دارین


مرسی 





> ولی با این  حال اشتباه هم می کنید و متاسفانه این اشتباهات در مورد مسائلی هست که مطلق  هستن و عشقی نمیشه در موردشون صحبت کرد. من قبل تر گفتم lock برای اینه که  دستور اتومیک روی سی پی یو های چند هسته ای ایجاد کنیم ولی شما کلا این  موضوع رو رد کردین !!!؟؟؟


برام جای سوال هست که من کجا همچین چیزی رو رد کردم. می تونن نقل قول کنید تا منم بدونم کجا وجود دستورهای اتمیک رو رد کردم.

هرچند حدس می زنم که شما دارین پیش دستور lock‌ رو می گین. اما این دستور فقط یه قسمت از حافظه رو برای یک عملیات قفل می کنه که می تونه برای مواردی مثل spinlock استفاده بشه. اما در اکثر موارد شما نیاز دارید که یک ساختار رو قفل کنید که شامل یه قسمت از حافظه است (مجموعه ای از آدرس) و بعضی از دستورها خودشون این خاصیت رو دارن مثل دستور cmpxchg  که توی spinlock استفاده کردم نیازی به lock کردن نداره و از طرف دیگه lock کردن می تونه باعث قفل شدن کل پردازنده ها و در پردازندههای جدید باعث قفل شدن کش بشه به اندازه یک دستور بشه. که زیاد خوشایند نیست (یه جورایی شبیه busy and wait). از طرف دیگه این دستور portable نیست پس نمی شه ازش همه جا استفاده کرد. (معماری های مختلف ندارن و حتی فکر کنم مدلهای اولیه معماری x86 هم نداشت.) برای همین موضوع portability بود که من متغییرهای اتمیک رو داخل پوشه arch گذاشتم که بشه از روشهای مختلف یک متغییر رو اتمیک کرد). یه مورد دیگه هم اینه که حتی  دستور lock هم محدود به دستورهای خاصی هست.

یه مورد دیگه در مورد دستورهای اتمیک: می شه گفت تک تک دستورها توی ذات خودشون اتمیک هستن و فقط مشکل جایی پیش میاد که یه دستور بخواد یه خونه حافظه رو بخونه بعد توش تغییر بده و دوباره بنویسه. برای این دستورها هست که مشکل به وجود میاد که بعضا خود اینها هم اتمیک هستن در بعضی موارد هم نیستن. برای همین موارد هست که متغییرهای قفل تعریف می شه. یعنی متغییرهای که عملیات خواندن و نوشتن در قالب یک دستور اتمیک هست.

*در مورد چند پردازندگی (فکر کنم تا حالا ۱۰۰ بار این موضوع رو داخل تالار تذکر دادم):*
با توجه به اینکه به چند هستگی اشاره کردین باید بگم که چند هستگی با چند پردازندگی با چند نخی و حتی نخ هر هسته موضوع های شبیه هم ولی کاملا متفاوت هستند. یه سیستم چند پردازنده یک سیستم با چند واحد CPU مجزا و با ساختارهای مختلف هست (مثلا می تونه حافظه مشترک-shared memory- داشته باشه و یا کلا حافظه جدا باشه)‌ و یا حتی در مورد بقیه موارد. سیستم های چند هسته شبیه سیستم های چند پردازنده هستن اما خیلی خیلی از نظر جزییات فرق دارن. مثلا کلاک سیستم های چند هسته همیشه یکسان هست اما در چند پرازنده اینکار تقریبا نشدنی هست و یا خیلی سخت هست) و یا اینکه سیستم های چند هسته حافظه های جدا از هم دارن (کش های L1) و همراه حافظه های مشترک (خود حافظه و کشهای L۲ و L۳ ---می تونه معماری به معماری فرق کنه---) و اما این در مورد چند پردازنده می تونه کلا فرق کنه. شما اگر ادعا کنید که دارم یک سیستم عامل چند پردازنده ای و چند هسته ای و ... می نویسم باید ساختارهایی رو استفاده کنید که روی همه این موارد کار کنه-که فعلا من همچین ادعایی رو ندارم-)

و در مورد اتمی کردن. ما هیچ وقت یه دستور مثل write رو اتمی نمی کنیم بلکه یه ساختار رو اتمی می کنیم. مثلا دستور write رو اتمی نمی کنیم بلکه ساختار فایل رو اتمی می کنیم تا حتی اگر چند write همزمان بودش روی یک نقطه مشترک تاثیر نذارن. از اینکه می گیم دستوری مثل write اتمیک هست. منظور ما اینه که این دستور با دستورهای دیگه مرتبط بر روی یک ساختار مشترک (معمولا در حافظه) به صورت همزمان عمل نمی کنه. و ۹۹ درصد ساختارهای حافظه تک آدرسی نیست که با یه دستور Lock کنیم اونها و تغییر بدیم توشون. بلکه از چند متغییر تشکیل شدن. مثلا برای صف ما یه اشاره گر صف داریم و یه شمارنده که عملیات اتمیک باید هر دوی اینها رو اتمیک اجرا کنه و با استفاده از متغییرهای اتمیک اونها اتمیک نمی شن.




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


باید سیستم ها و معماری های دیگه رو تجربه کنید. من بالاتر هم توضیح دادم که بین اون چیزی که از مپ شدن شما تعریف می کنید با تعریف من فرق خیلی زیادی هست. به عنوان مثال می تونید در مورد پورتهای مپ شده روی حافظه و معماری اونها تحقیق کنید و یا اینکه در مورد معماری Standford تحقیق کنید ( و فرقش با ون نیومن که توی x86 استفاده شده) همینطور می تونید مواردی مثل پردازنده های ARM (یا حتی میکروهای اون رو تجربه کنید) تا ببینید حافظه کد مپ شده چه شکلی کار می کنه.  




> برای اینکه بگم منم بی عیب نیستم میگم در مورد بوت لودر و os اشتباه کردم. نظرم عوض شد اینا جدان و حرف شما درسته.


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




> منم اون دوره روی hypervisor خصوصا intel vt-x مطالعاتی داشتم دید خوبی هم  روی بدافزارها داشتم یه ایده هایی هم داشتیم رفتم کتابخونه یه ۶-۷ تا  مقاله تو این زمینه که می شد تو زمان مطالعه کرد رو خیلی عمیق خوندیم هر  نکته ای به درد بخوری بود یادداشت کردم و در نهایت ۳ تا انتخاب کردم با  موضوع فرستادم به استاد.


من واقعا نگرفتم. بین hyper-visor که یه نوع ماشین مجازی هست با تشخیص بد افزار خیلی تفاوت هست. برای تشخیص ویروس چند تا متد مختلف داریم که شامل موارد زیر می شه (می تونه بیشتر هم باشه)
۱. تشخیص امضاء:‌با بررسی محتویات فایل و جستجو از روی کدهای مخصوص (خودش می تونه چند نوع باشه) 
۲. رفتار شناسی: بررسی رفتار یک ویروس. مثلا شما از روی رفتار یک فرد در مورد صحت کارهایی که انجام می ده مشکوک می شین. ویروس کشها هم دقیقا با تعریف یک hook روی API و بررسی کارهایی که ویروسها انجام می دن می تونن بهشون پی ببرن مثلا به احتمال زیاد اگر یه نرم افزار داره نرم افزارهای exe دیگه رو تغییر می ده (مثلا اول و یا آخر فایل اونها می نویسه) ویروس هست.

یه مورد دیگه هم اینه که برنامه ها رو بعضا توی Sand-box می زارن و رفتار اونها رو بررسی می کنن. snad box معمولا می تونه یه ماشین مجازی باشه. اما این روش برای محیط عملیاتی به درد نمی خوره. و فقط برای بررسی یک برنامه که خودتون انتخاب کردین)

----------


## negative60

> جناب *pswin.pooya*
> یه پیشنهاد ساده اینقدر عکس العمل داره؟
> غرور فقط آدم رو احمق میکنه.
> اینهمه ذکر مصیبت برای نشان دادن خودتون لازم نیست، از روی نوشته های قبلی هم می شد پی به شخصیت شما برد.
> 
> آدمی که همه رو احمق فرض کنه و خودش رو عقل کل نیاز به توضیح نداره.
> کلآ آدمی از نوع "بدون شرح" هستید. لازم نیست این داستان ها رو به خودتون سنجاق کنید.نیازی هم به توضیح به دیگران نیست خودتون رو خسته نکنید.
> دنبال ایراد در اخلاق و تفکرات خودتون باشید و اصلاح کنید.
> 
> ...


خود شروع کننده تاپيک با صحبت های pswin.pooya مشکلی نداشته و پستی هم نداده شکايتی هم نداشته، حالا يک سری اين وسط کاسه داغ تر از آش شدن که چرا با "گلم" و "قشنگم" و "عزيزم" جواب نداديدهر کسی اگر بحث فنی داره ميتونه تو تاپيک شرکت کنه اما نميتونه نقش وکيل ديگران رو بازی کنه اين نه به من و نه به شما مربوطه

----------


## hoax3r

> برام جای سوال هست که من کجا همچین چیزی رو رد کردم. می تونن نقل قول کنید تا منم بدونم کجا وجود دستورهای اتمیک رو رد کردم.


من  این مطلب رو که پایین نوشتم اشاره کردم




> ولی خوب شما چون روی یک هسته کار میکنین این فعلا خیلی مساله ای ایجاد نمی کنه


بعد شما گفتین




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


خوب مشخصه شما با هدف اینکه روی چند هسته هم کار کنه اون کد رو نوشتین، درست میگم؟ اگه اشتباه برداشت کردم که شرمنده، ولی اینطوری به نظر میاد




> هرچند حدس می زنم که شما دارین پیش دستور lock‌ رو می گین.


من مشخصا اشاره کردم قبلا که در مورد پیشوند صحبت میکنم. نیازی به حدس زدن نبود 




> اما این دستور فقط یه قسمت از حافظه رو برای یک عملیات قفل می کنه که می تونه برای مواردی مثل spinlock استفاده بشه. اما در اکثر موارد شما نیاز دارید که یک ساختار رو قفل کنید که شامل یه قسمت از حافظه است (مجموعه ای از آدرس) و بعضی از دستورها خودشون این خاصیت رو دارن مثل دستور cmpxchg  که توی spinlock استفاده کردم نیازی به lock کردن نداره و از طرف دیگه lock کردن می تونه باعث قفل شدن کل پردازنده ها و در پردازندههای جدید باعث قفل شدن کش بشه به اندازه یک دستور بشه. که زیاد خوشایند نیست (یه جورایی شبیه busy and wait). از طرف دیگه این دستور portable نیست پس نمی شه ازش همه جا استفاده کرد. (معماری های مختلف ندارن و حتی فکر کنم مدلهای اولیه معماری x86 هم نداشت.) برای همین موضوع portability بود که من متغییرهای اتمیک رو داخل پوشه arch گذاشتم که بشه از روشهای مختلف یک متغییر رو اتمیک کرد). یه مورد دیگه هم اینه که حتی دستور lock هم محدود به دستورهای خاصی هست.


درسته spinlock یک متقییر رو تغییر میدیم. همه این مکانیزها مثل mutex و semaphore در حد همین تغییر یک یا دو تا متغییرن!!، مثلا mutex یک ترید بخواد وارد ناحیه بحرانی (critical section) بشه یک متغییر رو چک میکنه اگه صفر هست به یک تغییرش میده بعد همون صفر رو بر می گردونه و اگه یک ترید دیگه بخواد وارد ناحیه بحرانی بشه چون قبلا متغییر یک شده(قفل گرفته شده) متغییر رو تغییر نمیده و ایجا یا میشه تو حلقه فرستادش که سی پی یو الکی مصرف میکنه یا میشه switch کرد رو یک ترید دیگه. و این کار رو مثلا می تونیم با cmpxchg انجام بدیم.  و برعکس چیزی که گفتین cmpxchg همیجوری اتومیک نیست و باید پیشوند lock داشته باشه. برعکس xchg که پیشفرض اتومیک هست

Intel 64 and IA-32 Architectures Software Developer's Manual


> [COLOR=rgb(3.137300%, 37.647000%, 65.882000%)]CMPXCHG—Compare and Exchange 
> 
> [/COLOR]
> 
> 
> 
> Compares the value in the AL, AX, EAX, or RAX register with the first operand (destination operand). If the twovalues are equal, the second operand (source operand) is loaded into the destination operand. Otherwise, thedestination operand is loaded into the AL, AX, EAX or RAX register. RAX register is available only in 64-bit mode.
> *This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically*.


و به این نکته اشاره کنم که ما یک متغییر رو تغییر میدیم با استفاده از دستوری که به صورت اتومیک در آمده ولی با این کار مانع از ورود ترید های دیگه به این ناحیه که ناحیه بحرانی میگن میشیم در نتیجه هدف فقط اتومیک کردن یک دستور نیست کل دستوراتی هست که تو این ناحیه تا آزاد کردن قفل قرار گرفتن میشیم.

و lock در واقع bus رو لاک میکنه و منطقی هم هست تو سیتسمهایی که چند هسته یا چند پراسسور میتونن به یک ناحیه مشترک از حافظه دسترسی داشته باشند (که اینجا منظور مثلا متغییری هست که برای mutex یا semaphore استفاده کردیم) باید دستوری که این ناحیه حافظه رو تغییر میده پیشوند lock داشته باشه اگه نه این مکانیزها درست کار نمی کنن. *اگه این قضیه روش نیست به رفرنس های محتلفی می تونم ارجاع بدم.
*
در مورد portable نبودن خوب خیلی بخش ها تو یک سیستم عامل وابسته به سخت افزاری هستن که روش اجرا میشن. شنیدن این حرف یکم عجیب برام. مثلا مدیریت حافظه، مدیریت وقفه ها، مساله task ها که وضعیت هر کدوم رو باید نگه داشت و خیلی چیزای دیگه. طبیعی هست این بخش برای هر معماری جدا نوشته بشه. سیستم عامل هایی که برای معماری های مختلف وجود دارن (حداقل اونایی که من سورسشون رو خوندم) از یه ساختار پوشه ای مثلا قرار دادن تو پوشه arch استفاده میکنن.

در مورد نبودن دستور lock تو معماری های اولیه. من میدونم سی پی یو 8086 هم این دستور رو داره (اون موقع مساله multiprocessor وجود داشته). و مستنداتش از خود اینتل هست بگردید pdf اش هست. نبود بگین یه جا آپلود میکنم.




> *در مورد چند پردازندگی (فکر کنم تا حالا ۱۰۰ بار این موضوع رو داخل تالار تذکر دادم):
> *با توجه به اینکه به چند هستگی اشاره کردین باید بگم که چند هستگی با چند پردازندگی با چند نخی و حتی نخ هر هسته موضوع های شبیه هم ولی کاملا متفاوت هستند.


حرف شما درسته من دقیقا به این موضوع اشاره نکردم و کلا گفتم چند هسته ای، 




> باید سیستم ها و معماری های دیگه رو تجربه کنید. من بالاتر هم توضیح دادم که بین اون چیزی که از مپ شدن شما تعریف می کنید با تعریف من فرق خیلی زیادی هست. به عنوان مثال می تونید در مورد پورتهای مپ شده روی حافظه و معماری اونها تحقیق کنید و یا اینکه در مورد معماری Standford تحقیق کنید ( و فرقش با ون نیومن که توی x86 استفاده شده) همینطور می تونید مواردی مثل پردازنده های ARM (یا حتی میکروهای اون رو تجربه کنید) تا ببینید حافظه کد مپ شده چه شکلی کار می کنه.


من Port Map  نمیدونم چیه اصلا تو معماری x86 همچین چیزی نداریم ولی در مورد Memory IO Map می دونم (و احتمالا منظورتون همینه). حداقل روی معماری های بر پایه باس PCI که هر دیوایسی یه ناحیه به نام BAR داره مشخص میکنه با چه آدرسی میشه باهاش در ارتباط بود که به جای پورت ازش استفاده میکنن. که دسترسی به این دیوایس ها رو چیپ پل شمالی (که الان تو معماری های جدید داخل CPU اومده) مپ میکنه به دیوایس. اگه منظور شما چیز دیگه ای هست خوشحال میشم یه لینک بدین 

و در مورد مپ کد من دقیقا در مورد مپ کد حرف میزنم. باید توضیح بدم در این مورد چون هر بار شما باز اشتباه برداشت میکنید. وقتی سیستم بوت میشه اصلا حافظه اصلی RAM قابل دسترسی نیست (دسترسی نوشتن نداره) و یکی از کارای BIOS اینه که این حافظه  باید initialize کنه تا قابل دسترسی باشه و همونطور که گفتم این کار همون ابتدا داخل فلش BIOS اتفاق می افته و BIOS روی حافظه اصلی نیست. از اونجایی که Initialize کردن حافظه اصلی کار پیچیده ای هست و نیاز  به یک خافظه ی کمکی هست (مثلا به عنوان stack) اینا از یک روشی به نام CAR استفاده میکنن تا در نهایت کدهای BIOS کپی میشه روی حافظه اصلی و ادامه ماجرا. یکسری BIOS های متن باز وجود داره مثل coreboot برای اطلاعات بیشتر اگه علاقه دارین به اضافه داکومنت BIOS and Kernel Developer’s Guide (BKDG) for AMD Family 16h Models 30h-3Fh Processors که توضیح داده چطوری میشه از کش L2 برای این کار استفاده کرد




> من واقعا نگرفتم. بین hyper-visor که یه نوع ماشین مجازی هست با تشخیص بد افزار خیلی تفاوت هست. برای تشخیص ویروس چند تا متد مختلف داریم که شامل موارد زیر می شه (می تونه بیشتر هم باشه)
> ۱. تشخیص امضاء:‌با بررسی محتویات فایل و جستجو از روی کدهای مخصوص (خودش می تونه چند نوع باشه) 
> ۲. رفتار شناسی: بررسی رفتار یک ویروس. مثلا شما از روی رفتار یک فرد در مورد صحت کارهایی که انجام می ده مشکوک می شین. ویروس کشها هم دقیقا با تعریف یک hook روی API و بررسی کارهایی که ویروسها انجام می دن می تونن بهشون پی ببرن مثلا به احتمال زیاد اگر یه نرم افزار داره نرم افزارهای exe دیگه رو تغییر می ده (مثلا اول و یا آخر فایل اونها می نویسه) ویروس هست.
> 
> یه مورد دیگه هم اینه که برنامه ها رو بعضا توی Sand-box می زارن و رفتار اونها رو بررسی می کنن. snad box معمولا می تونه یه ماشین مجازی باشه. اما این روش برای محیط عملیاتی به درد نمی خوره. و فقط برای بررسی یک برنامه که خودتون انتخاب کردین)


البته من در مورد تحلیل بدافزار گفتم نه تشخیص. اینقدر هم بی ربط نیست. از اونجایی که در مورد Sandbox و API Hook و ... صحبت کردین فرض می گیرم تا حدودی با ادبیات این حوزه آشنایین دارین برای همین صاف در مورد hypervisor میگم چرا میتونه مفید باشه.

hyoervisor مفیده به این دلایل

۱- یک سطح پایین تر از سیستم عامل اجرا میشه، سیستم عالم Ring 0 هست ولی تو این سیستم اصطلاحا میگن Ring -1 اجرا میشه، در نتیجه می تونه کل سیستم عامل رو کنترل کنه بدون اینکه سیستم عامل بدونه داخل یه محیط مجازی قرار گرفته، حتی آنتی ویروس ها می تونن از این تکتولوژی استفاده کنن برای در امان ماندن در مقابل Rootkit ها که قالبا درایور دارن و هم سطح آنتی ویروس اجرا میشن که در این حالت اصلا امنیت بی معنی هست چون بدافزار راحت می تونه درایور آنتی ویروس رو از کار بیاندازه. در این زمینه من میدونم آنتی ویروس مک آفی  بعد اینکه اینتل خریدش تو این زمنیه یک فعالیت هایی انجام داده میتونید در مورد DeepSAFE یک جستجویی بکنید اگه علاقه دارین.

۲- تو این محیط همه چی رو میشه کنترل کرد. اینطوری میشه به قضیه نگاه کرد که سیستم عامل هر کاری بخواهد انجام بده باید از ویژگی های CPU استفاده کنه. باید از دستورات اون CPU استفاده کنه. حالا در hypervisor ما نقش CPU رو داریم در نتیجه همه چی رو عملا می بینیم هم وقفه یا سوییچ هر چی.

بحث مفصلی هست الان ساعت ۳:۴۰ صبح دیگه حال ندارم تایپ کنم. بعد کسی خواست بیشتر توضیح میدم.

----------


## pswin.pooya

> خوب مشخصه شما با هدف اینکه روی چند هسته هم کار کنه اون کد رو نوشتین،  درست میگم؟ اگه اشتباه برداشت کردم که شرمنده، ولی اینطوری به نظر میاد


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




> همه این مکانیزها مثل mutex و semaphore در حد همین تغییر یک یا دو تا  متغییرن!!، مثلا mutex یک ترید بخواد وارد ناحیه بحرانی (critical section)  بشه یک متغییر رو چک میکنه اگه صفر هست به یک تغییرش میده بعد همون صفر رو  بر می گردونه و اگه یک ترید دیگه بخواد وارد ناحیه بحرانی بشه چون قبلا  متغییر یک شده(قفل گرفته شده) متغییر رو تغییر نمیده و ایجا یا میشه تو  حلقه فرستادش که سی پی یو الکی مصرف میکنه یا میشه switch کرد رو یک ترید  دیگه. و این کار رو مثلا می تونیم با cmpxchg انجام بدیم.  و برعکس چیزی که  گفتین cmpxchg همیجوری اتومیک نیست و باید پیشوند lock داشته باشه. برعکس  xchg که پیشفرض اتومیک هست


توی قفل های مثل mutex که از سمافورها نشات می گیرین شما علاوه بر خود قفل یک صف هم دارین که باید ورود خروج از اون هم اتمیک باشه. (صف پروسس های منتظر) در کنارش یه شمارنده هم دارین.

در مورد cmpxchg حق با شماست من الان manual رو چک کردم نوشته بود برای محیطهای چندپردازنده ای اتمیک نیست اما خارج از این حالت اتمیک هستش.




> من Port Map  نمیدونم چیه اصلا


گفتم مطالعه کنید. متوجه می شید من چی می گم.




> در مورد Memory IO Map می دونم (و احتمالا منظورتون همینه)


نه نیست.




> و یکی از کارای BIOS اینه که این حافظه  باید initialize کنه تا قابل  دسترسی باشه و همونطور که گفتم این کار همون ابتدا داخل فلش BIOS اتفاق می  افته و BIOS روی حافظه اصلی نیست.


یه بار هم قبلا گفتم *کپی می کنه نه مپ*. بین کپی و مپ خیلی خیلی خیلی تفاوت هست. شما مثلا داخل ARM اگر به آدرس x اشاره می کنید و اون آدرس مپ شده حافظه کد باشه. بدون هیچگونه کپی کردنی اطلاعات اونجا در اختیار شما قرار می گیره. یعنی بصورت سخت افزاری این جریان تعبیه شده. سخت افزاری وجود داره تا آدرس خاصی رو می بینه فورا دیتا رو می گیره و انتقال می ده بدون اینکه بره روی RAM. همین برای پورت هم صادق هست و ...

برای لینک هم اینا خیلی جنرال هستن و یه سرچ ساده گوگل می تونه حلش کنه.

----------


## hoax3r

> یه سوال اساسی. چه شکلی از این جمله من برداشت کردی که من گفتم دستورهای اتمیک نیست.


بالاتر عرض کردم که چطور برداشت کردم. دوباره پستهایی که دادم رو ببینید.




> یه بار هم قبلا گفتم کپی میکنه نه مپ  بین کپی و مپ خیلی خیلی خیلی تفاوت هست. شما مثلا داخل ARM اگر به آدرس x اشاره می کنید و اون آدرس مپ شده حافظه کد باشه. بدون هیچگونه کپی کردنی اطلاعات اونجا در اختیار شما قرار می گیره. یعنی بصورت سخت افزاری این جریان تعبیه شده. سخت افزاری وجود داره تا آدرس خاصی رو می بینه فورا دیتا رو می گیره و انتقال می ده بدون اینکه بره روی RAM. همین برای پورت هم صادق هست و ...


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


*Minimal Boot Loader for Intel® Architecture* 




> Power-Up (Reset Vector) Handling
> When an IA bootstrap processor (BSP) powers on, the first address that isfetched and executed is at physical address 0xFFFFFFF0, also known as thereset vector. *This accesses the ROM / Flash device at the top of the ROM* *–**0x10.* The boot loader must always contain a jump to the initialization codein these top 16 bytes.





> When the processor is first powered-on, it will be in a special mode similar toReal Mode, but with the top 12 address lines being asserted high, *allowingboot code to be accessed directly from NVRAM (physical address0xFFFxxxxx).* Upon execution of the first long jump, these 12 address lineswill be driven according to instructions by firmware.





> Preparation for Memory Initialization
> 
> The following code is executed from the ROM / Flash *since* memory is notavailable yet. The least amount of code in this section the better, sinceexecuting from ROM is slow.

----------

