PDA

View Full Version : سوال: GDT,Virtual Memory صفحه بندی حافظه



yassersajjadi
پنج شنبه 05 مرداد 1391, 01:58 صبح
مقدار دهی اولیه پردازنده (ساخت جدول GDT، برنامه ریزی PIC و PIT و ...)
پیاده سازی یک مدیر حافظه فیزیکی
پیاده سازی حافظه مجازی (فعلا فقط صفحه بندی)
در رابطه با این سه مورد کسی میتونه به من توضیح بده که مثلا چطوری میشه حافظه رو صفحه بندی کرد؟
ما چطوری میتونیم اندازه حافظه رو تشخیص بدیم تا صفحه بندیش کنیم ، اصلا چطوری داده ها رو به حافظه میتونیم تخصیص بدیم ؟من با سی شارپ کار میکنم پروژه tysos دانلود کردم ولی اصلا متوجه نمیشم چیکار کرده

pswin.pooya
پنج شنبه 05 مرداد 1391, 11:27 صبح
من با سی شارپ کار میکنم
به نظر من زياد هم زحمت نكش چون متوجه هم نخواهي شد.


پروژه tysos دانلود کردم ولی اصلا متوجه نمیشم چیکار کرده
جماعت به خاطر كندي سي شارپ سعي ميكنن تا جايي كه امكان داره باهاش برنامه نسازن و از زبانهاي ديگه مثل دلفي و C/C++ استفاده كنن. اون وقت چند نفر پا شدن مي خوان با سي شارپ سيستم عامل بسازن (فكر كن يه سيستم عامل كندتر از ويندوز - چه شود)‌ كه هيچ كدوم هم تا اينجا موفق نشدن يه OS بدن بيرون. به هر حال آرزو بر جوانان عيب نيست.

fjm11100
پنج شنبه 05 مرداد 1391, 13:04 عصر
به نظر من زياد هم زحمت نكش چون متوجه هم نخواهي شد.

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



جماعت به خاطر كندي سي شارپ سعي ميكنن تا جايي كه امكان داره باهاش برنامه نسازن و از زبانهاي ديگه مثل دلفي و C/C++‎ استفاده كنن. اون وقت چند نفر پا شدن مي خوان با سي شارپ سيستم عامل بسازن (فكر كن يه سيستم عامل كندتر از ويندوز - چه شود)‌ كه هيچ كدوم هم تا اينجا موفق نشدن يه OS بدن بيرون. به هر حال آرزو بر جوانان عيب نيست.

ظاهرا شما بجای اینکه ماه را ببینی داری انگشت را نگاه میکنی! اولا همه اینها ابزار کار هستند و یک مهندس حقیقی ابزار پرست نمیشه بلکه از هر ابزاری جای خودش استفاده میکنه. حرف شما مثل اینه که بگیم تا وقتی که پتک هست چرا از چکش استفاده کنیم!!
محض اطلاع باید خدمت شما عرض کنم که فرق زیادی بین مفهوم زبان برنامه نویسی، کتابخانه های آن و فریمورک برنامه نویسی وجود داره. C++ و C# بدون کتابخانه ها و فریمورک هیچی نیستند و از نظر ساختار زبان هم بسیار شبیه هم هستند(حلقه ها، شرط ها و...) فرق اساسی C++ اون هم از نوع Native و C# در این است که در C++ اکثر چیزایی که استفاده می کنیم همراه خود برنامه به زبان ماشین کامپایل می شوند اما C# تا حدی شبیه زبانهای اسکریپتی مثل پرل و پایتون است. درواقع C# و جاوا نوع سومی از زبانها هستند که نه به زبان ماشین کامپایل می شوند و نه اسکریپت هستند بلکه از یک ماشین مجازی یا jit استفاده می کنند(البته برنامه هایی هستند که با اسکریپتهای نوشته شده به زبان C# توسعه پیدا می کنند و کد بصورت کامپایل نشده در آنها استفاده می شود.)
حالا اگر ما بتوانیم در هنگام بوت ابتدا فریمورک را لود کنیم می توانیم کل سیستم عامل و نرم افزارهایش را حتی بصورت اسکریپت داشته باشیم! لازم به ذکر است که تمام سیستم عاملها یکسری پیشنیاز برای اجرای برنامه ها را موقع بالا آمدن لود می کنند. شما که فکر نمی کنی یک فایل exe مثل یک کد ماشین خالص مستقیما در حافظه واقعی می نشیند و دستوراتش اجرا می شود؟
اما راجع به کند بودن C# نسبت به C++ بهتر است سرچی بزنی و ببینی خیلی ها عملی امتحان کرده اند(فقط حرف از روی تعصب نزده اند) که در حالتی که کد C++ شما به بهینه ترین حالت ممکن نوشته شده باشد(بسیاری از برنامه نویس ها در برنامه های بزرگ واقعا توانایی بهینه کردن تمام کد را ندارند و از نظر صرف زمان هم مقرون بصرفه نیست) حداکثر می تواند تا 50% از کد معادلش در C# سریعتر اجرا شود و در مواردی(هرچند اندک) C# سریعتر هم هست!!! بهرحال شما باید ببینید سرعت در کجا مهمتر است تولید یا اجرا؟

fjm11100
پنج شنبه 05 مرداد 1391, 13:08 عصر
آقا یاسر این لینک را ببین ضمنا این سایت خیلی برای فهم مسایل مربوط به سیستم عامل مفیده.
http://forum.osdev.org/viewtopic.php?f=15&t=23982

yassersajjadi
پنج شنبه 05 مرداد 1391, 13:50 عصر
حالا دوست من چ فرقی میکنه به حال من , من فقط دارم در مورد virtual memory تحقیق میکنم ، فکر نمیکنم اونقدرا فرق داشته باشه که با چه زبانی کار کنم ، به هر حال ممنون از شما
من میدونم چطوری region واسه حافظه ایجاد کنم ولی میخوام بدونم ک چطوری این ناحیه حا رو میشه به حافظه اصلی اختصاص داد

فرض کنید کل حافظه رو 0xffffffffffffffff در نظر بگیریم ما قسمتی از این حافظه رو به سیستم عامل اختصاص میدیم و یه قسمت هم به Page Table اختصاص میدیم و بقیه هم بصورت آزاد مورد استفاده هستند ، بعد این قسمت ها رو صفحه بندی میکنیم فرض کنیم هر صفحه 0x40 بیت باشه بعد این صقحه ها رو تو یه چرخه میزاریم تا مرتب پردازش بشن و بعد تعیین میکنیم در چه رینگی حق فعالیت دارن ,خوب حالا این تقسیم بندی چطور به حافظه اختصاص پیدا میکنه ؟ یعنی چطور باید داده ها رو به سی پی یو بفرستیم تا پردازش بشن
نمیدونم تونستم منظورمو برسونم یا نه
شاید به کل اشتباه راجب به اساس کار فکر میکنم ، ممنون میشم با دانسته هاتونون راهنماییم کنین

yassersajjadi
پنج شنبه 05 مرداد 1391, 16:18 عصر
من خودم این ایده رو دارم که با ایجاد ناحیه در حافظه , ما فقط اندازه داده ها رو داشته باشیم و چک کنیم که این داده ها در حافظه جا میگیرن و در چه سطحی باید اجرا بشن
اگه حافظه به اندازه کافی جا داشت به دستوری که برای داده هاش اجازه استفاده از حافظه رو گرفته اجازه کار بدیم ، این منطقی تر از اون کار قبلیه و شدنی هم هست

pswin.pooya
پنج شنبه 05 مرداد 1391, 17:40 عصر
ببخشید ولی احساس نمیکنید ادبیات شما مناسب محیطی مثل اینجا که همه برای یادگیری آمده ایم نامناسب است؟ بلد بودن سی شارپ جذام به مخ آدم نمی اندازه که حالا کسی که با سی شارپ کار کرده دیگه نتونه درباره پایه سیستم عامل چیزی یاد نگیره.

منظور من سي شارپ هست. نه شخص



محض اطلاع باید خدمت شما عرض کنم که فرق زیادی بین مفهوم زبان برنامه نویسی، کتابخانه های آن و فریمورک برنامه نویسی وجود داره. C++‎ و C#‎ بدون کتابخانه ها و فریمورک هیچی نیستند و از نظر ساختار زبان هم بسیار شبیه هم هستند(حلقه ها، شرط ها و...) فرق اساسی C++‎ اون هم از نوع Native و C#‎ در این است که در C++‎ اکثر چیزایی که استفاده می کنیم همراه خود برنامه به زبان ماشین کامپایل می شوند اما C#‎ تا حدی شبیه زبانهای اسکریپتی مثل پرل و پایتون است. درواقع C#‎ و جاوا نوع سومی از زبانها هستند که نه به زبان ماشین کامپایل می شوند و نه اسکریپت هستند بلکه از یک ماشین مجازی یا jit استفاده می کنند(البته برنامه هایی هستند که با اسکریپتهای نوشته شده به زبان C#‎ توسعه پیدا می کنند و کد بصورت کامپایل نشده در آنها استفاده می شود.)

دوست من شما ظاهرا تا حالا كارهاي سيستمي نكرديد. بزرگترين فرق داخل سي شارپ و سي اشاره گرها و ساختار زبان هست و نه فريم ورك


بلکه از یک ماشین مجازی یا jit استفاده می کنند

JIT يك ماشين مجازي نيست و يه نوع كامپايلر هست .



حالا اگر ما بتوانیم در هنگام بوت ابتدا فریمورک را لود کنیم می توانیم کل سیستم عامل و نرم افزارهایش را حتی بصورت اسکریپت داشته باشیم!
خيلي دلم ميخواد بدونم كه فريم ورك رو با چه زبوني ميخواي بنويسي



شما که فکر نمی کنی یک فایل exe مثل یک کد ماشین خالص مستقیما در حافظه واقعی می نشیند. و دستوراتش اجرا می شود؟

خيلي هم فكر كن. ميشينه ،‌ خودم هم اينكار رو كردم. هسته سيستم عامل من با فرمت elf هست كه مستقيما ناحيه .text اون روي حافظه ميشينه و بوت لودر اجراش مي كنه.


حداکثر می تواند تا 50% از کد معادلش در C#‎ سریعتر اجرا شود

50% كمه. فكر كن. حتي اگر هم درست باشه سيستم 50% كاراييي خودش رو از دست ميده.


در مواردی(هرچند اندک) C#‎ سریعتر هم هست!!!

برام جالب شد. ميتوني اسم ببري؟


بهرحال شما باید ببینید سرعت در کجا مهمتر است تولید یا اجرا؟
توي 90 درصد موارد سرعت در اجرا مهمتر هست.

البته نقطه ضعف سي شارپ تنها در سرعتش نيست.

من اگر ناچار نباشم به هيچ عنوان سراغ سي شارپ نميرم.



فرض کنید کل حافظه رو 0xffffffffffffffff در نظر بگیریم ما قسمتی از این حافظه رو به سیستم عامل اختصاص میدیم و یه قسمت هم به Page Table اختصاص میدیم و بقیه هم بصورت آزاد مورد استفاده هستند ، بعد این قسمت ها رو صفحه بندی میکنیم فرض کنیم هر صفحه 0x40 بیت باشه بعد این صقحه ها رو تو یه چرخه میزاریم تا مرتب پردازش بشن و بعد تعیین میکنیم در چه رینگی حق فعالیت دارن ,خوب حالا این تقسیم بندی چطور به حافظه اختصاص پیدا میکنه ؟ یعنی چطور باید داده ها رو به سی پی یو بفرستیم تا پردازش بشن

اين ماجرا به شدت به معماري ربط داره . شما بايد اول دنبال محدوديت ها پلتفرم مقصد و قابليتهاي اون بريد. در اكثر پلتفرمها اندازه صفحه ها محدود هست. مثلا در x86 ، چهار كيلو بايت هست ( با الحاقي PE ، سي و دو مگابايت )

yassersajjadi
پنج شنبه 05 مرداد 1391, 18:21 عصر
ممنون از راهنماییت دوست عزیز

fjm11100
پنج شنبه 05 مرداد 1391, 18:52 عصر
دوست من شما ظاهرا تا حالا كارهاي سيستمي نكرديد. بزرگترين فرق داخل سي شارپ و سي اشاره گرها و ساختار زبان هست و نه فريم ورك

اشاره گرها در C# هم هستند.

خيلي دلم ميخواد بدونم كه فريم ورك رو با چه زبوني ميخواي بنويسي

خود بوت لودر را با چی مینویسن؟ یا اصلا خود C تهش که کامپایل میشه چی میشه؟ آیا میشه گفت باید بریم سراغ اسمبلی و حتی کد ماشین چون تهش C هم از اون میاد؟ در ضمن تعصبی روی C# ندارم و معتقدم که هر زبانی برای کاریه و مسلما هیچ زبانی جای C را در نوشتن os نمی گیره ولی نوشتن برنامه حسابداری، اتوماسیون اداری یا یک وب اپلیکیشن با C و C++ هم کار واقعا ...!!!(حتما CGI را یادتونه و میتونید مقایسه ای بین CGI و asp.net بکنید.)
دلم میخواد یک کار با wpf بکنید و بعد بخواهید با c++ بکنید ببینید زمان تولید چقدر وحشتناک بالا میره و چقدر سخته که سرعت برنامه شما همان اندازه باشد(البته اگر وقت فراوان و نیروی متخصص خیلی حرفه ای داشته باشین میشه این کار را کرد و برنامه هم سرعت بهتری خواهد داشت)

50% كمه. فكر كن. حتي اگر هم درست باشه سيستم 50% كاراييي خودش رو از دست ميده.
قبول اما شما میتونی یک برنامه ساده بنویسی که فایل بخونه و روی دیتابیس بنویسه و سرعت اجراش(سرعت تولید که شک نکن C# سریعتره) بیشتر باشه بی اینکه نشت حافظه داشته باشی و تمام خطاها را هم مدیریت کرده باشی؟(مطمئنم اگر فرد خبره ای در C++ باشید و کلی وقت برای بهینه کردن همه قسمتها بزارید و حواستون هم به تمام منابع باشه می تونید تازه اونم اگر lib های خارجی خوبی استفاده کرده باشید)

توي 90 درصد موارد سرعت در اجرا مهمتر هست.

فکر میکنید برای پیاده سازی یک ERP هم سرعت اجرا مهمه؟ یا سرعت تولید در کنار قابلیت اطمینان بالا؟(اینکه برنامه در اثر یک اشتباه در کار با همون پوینترها که خیلی دوست دارید نره تو باقالی ها)


خودم هم اينكار رو كردم. هسته سيستم عامل من با فرمت elf هست

گفتم یک exe منظورم فایل اجرایی در ویندوز بود.

JIT يك ماشين مجازي نيست و يه نوع كامپايلر هست .

من نگفتم ماشین مجازیه چون جاوا و C# را کنار هم آوردم اینطور نوشتم.


البته نقطه ضعف سي شارپ تنها در سرعتش نيست.


خب از بقیه نقاط ضعفش بگید لطفا!!!

برام جالب شد. ميتوني اسم ببري؟

نگاهی به این میکنی؟
http://www.codeproject.com/Articles/212856/Head-to-head-benchmark-Csharp-vs-NET

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

pswin.pooya
پنج شنبه 05 مرداد 1391, 20:45 عصر
خود بوت لودر را با چی مینویسن؟ یا اصلا خود C تهش که کامپایل میشه چی میشه؟ آیا میشه گفت باید بریم سراغ اسمبلی و حتی کد ماشین چون تهش C هم از اون میاد؟ در ضمن تعصبی روی C#‎‎‎ ندارم و معتقدم که هر زبانی برای کاریه و مسلما هیچ زبانی جای C را در نوشتن os نمی گیره ولی نوشتن برنامه حسابداری، اتوماسیون اداری یا یک وب اپلیکیشن با C و C++‎‎‎ هم کار واقعا ...!!!(حتما CGI را یادتونه و میتونید مقایسه ای بین CGI و asp.net بکنید.)بوت لودري كه من استفاده ميكنم هم با سي نوشته شده. اما تهش شده زبان ماشين (بازگست همه به سوي اوست. )


گفتم یک exe منظورم فایل اجرایی در ویندوز بود.من قبلا از همين فرمت استفاده مي كردم. (البته بهش ميگن PE)


نگاهی به این میکنی؟
http://www.codeproject.com/Articles/...-Csharp-vs-NET (http://www.codeproject.com/Articles/212856/Head-to-head-benchmark-Csharp-vs-NET)يه قسمت ساده اين مقاله تحت عنوان ""C#‎‎ vs C++‎‎: Simple Arithmetic هست. كه با تست من C++‎‎ نه اينكه كندتر نيست بلكه حداقل 4 برابر سريعتر هم هست. براي تست دوستان كدهايي رو كه نوشتم قرار دادم تا مابقي دوستان هم تست بگيرن و استفاده كنن. شما هم زياد به همچين مقاله هاي اطمينان نكنيد. اينها رو مامان بزرگها براي بچه هاشون نوشتن.


كد سي شارپ:

int t = Environment.TickCount;
float Iterations = 1000000000;
double total = 0;
for (int i = 0; i < Iterations; i++)
{
total = total - total / 4.0 + ((double)(i % 100000) * 3.0);
}
int t2 = Environment.TickCount - t;
MessageBox.Show(t2.ToString());

كد سي پلاس پلاس:


#include <Windows.h>
#include <iostream>

using namespace std;

void main()
{
int t = GetTickCount();
int Iterations = 1000000000 ;
double total = 0;
for (int i = 0; i < Iterations; i++)
{
total = total - total / 4.0 + ((double)( i % 100000) * 3.0);
}

int t2 = GetTickCount() - t;
cout << "totala is:" << total << endl;
cout << "result: " << t2 / 1000 << " sec"<< endl;
getchar();
}البته لازمه بگم فراموش نكنيد كه توي حالت Release كامپايل كنيد.

mohamad.zakery
سه شنبه 10 مرداد 1391, 06:53 صبح
آقا یه چیز عجیب غریب !!!

برنامه بالا اونی که با C# اجرا میشه سریعتر از نسخه C Plus اجرا میشه!!!!

جلل خالق!!!


حتی اومدم تو C plus متغیر ها Register کردم بازهم 1ثانیه کندتره!!!


این مثال خوبی نبود من الگوریتم QuickSort برای دو تاش نوشتم؛ C plus دو ثانیه طول میکشه، C# هشت ثانیه!!!

mohamad.zakery
سه شنبه 10 مرداد 1391, 06:58 صبح
ولی منم با حرف pswin.pooya (http://barnamenevis.org/member.php?34511-pswin.pooya) موافقم!!!!



قبول اما شما میتونی یک برنامه ساده بنویسی که فایل بخونه و روی دیتابیس بنویسه و سرعت اجراش(سرعت تولید که شک نکن C#‎ سریعتره) بیشتر باشه بی اینکه نشت حافظه داشته باشی و تمام خطاها را هم مدیریت کرده باشی؟(مطمئنم اگر فرد خبره ای در C++‎ باشید و کلی وقت برای بهینه کردن همه قسمتها بزارید و حواستون هم به تمام منابع باشه می تونید تازه اونم اگر lib های خارجی خوبی استفاده کرده باشید)


کی گفته C# سریعتره!!!

این برمی گرده که کی برنامه بنویسه دوست من!!!

زبان سی پلاس ریزه کاری داره که شما اونو تو C# نمی بینی چون فریمورک اینو انجام میده و کسانی که این فریمورک طراحی کردن به مسائل آشنا هستند. هرکس که از در اومد که برنامه نویس خوبی نیست!!!!

بازم ضرب المثل معروف !!!
C++ is not for children

mohamad.zakery
سه شنبه 10 مرداد 1391, 07:01 صبح
یک نکته!!!

من این برنامه بالا رو با دات نت 4 ساختم اما این مقاله مقایسه C++ با دات نت 2 هست!!!

pswin.pooya
سه شنبه 10 مرداد 1391, 14:00 عصر
برنامه بالا اونی که با C#‎ اجرا میشه سریعتر از نسخه C Plus اجرا میشه!!!!
شما یا برنامه C++ رو در حالت Debug اجرا کردید. یا optimzer سی شارپ رو فعال کردید ( که حلقه حذف میشه) و یا اینکه از دات نت 4.5 استفاده کردید که چند هسته ای کامپایل میکنه. در صورتی که از دات نت 4.5 استفاده کردید برای سنجش مقایسه OpenMP رو از گزینه های پروژه فعال کنید. این شکلی کد C++ هم چند هسته ای کار میکنه (توی این مورد فرق تو اینه که دیگه نیازی به یه فریم ورک جدید نیست و C++ به صورت ناتیو اگر اشتباه نکنم از سال 1999 پشتیبانی میکنه و محدودیت سیستم عامل و پلتفرم وجود نداره.)

در مورد چند پردازنده ای و چند هسته ای یکی از گزینه های جدید برای سی پلاس پلاس OpenACC و یا کنابخونه های OpenCL وCUDA و ... هست. اگر اینها هم نباشن می تونید از چند نخی استفاده کنید.




بازم ضرب المثل معروف !!!
C++‎ is not for children
کاملا موافقم

mohamad.zakery
چهارشنبه 11 مرداد 1391, 05:47 صبح
نه دوست من !!!
من هر دوتاشون Release کردم بعد تست کردم!!!
Visual studio من نسخه 2010 که اصلا دات نت 4.5 نداره!!!

آره با OpenCl و Cuda آشنا هستم، اینارو توی Game programming استفاده کردم هرچند که تخصص من Directx هستش و اونجا با DirectCompute کار می کنیم

ولی نه جناب pswin.pooya (http://barnamenevis.org/member.php?34511-pswin.pooya) تست من در شرایط برابر انجام شد.

البته ممکنه بعضی وقتها این اتفاق ها بیفته ولی باید تو نمونه های بزرگ تست بشن
قبلا که با Mdx هم کد میزدم تو بعضس جاها از Dx سریعتر بود ولی در خیلی از جاها کندتر!!!