PDA

View Full Version : سوال: درخواست توضیح درباره ی دسترسی به Ram



sinashahab
پنج شنبه 06 فروردین 1388, 16:14 عصر
:تشویق::تشویق:

jalalx
پنج شنبه 06 فروردین 1388, 20:01 عصر
فقط همين قدر ميدونم كه بايد از اشاره گر ها استفاده كني!
همچنين در propertiese پروژه تيك Allow unsafe Code رو در زبانه ي Build بزار. راستي كدي كه داراي اشاره گر باشه بايد در بلاك unsafe قرار بگيره! فقط همين قدر مي دونم! زياد كار نكردم!!!

unsafe
{
}

ahmadr
پنج شنبه 06 فروردین 1388, 23:11 عصر
دسترسی به چی RAM ؟
می خواهی به محتویات RAM دسترسی داشته باشی ؟ (مانند برنامه هایی که رم رو بهینه می کنند.)

sinashahab
جمعه 07 فروردین 1388, 00:09 صبح
دسترسی به چی RAM ؟
می خواهی به محتویات RAM دسترسی داشته باشی ؟ (مانند برنامه هایی که رم رو بهینه می کنند.)
سلام
بله درست حدس زدی !!!
من همینو می خواهم .

sinashahab
جمعه 07 فروردین 1388, 19:28 عصر
کسی در این مورد چیزی نمیدونه ؟
من شنیده بودم که فرق vb و c# تو دسترسی به رم هست .
به همین دلیل می خواهم بدونم کسی چیزی می دونه ؟

GISMan
شنبه 08 فروردین 1388, 10:49 صبح
سلام دوستان
خوب همونجوري كه گفته شد با يد از مود Unsafe استفاده كني. تو مود Unsafe مي توني از اشاره گرها كه امكان دسترسي مستقيم به حافظه رو مي دن مثل ++C/C استفاده كني. براي اين منظور بايد ابتدا يه متغير از نوع اشاره گر بسازي بعد از اون براي دسترسي به خونه هاي حافظه استفاده كني. مثلا برنامه زير با استفاده از اشاره گرها يه بلوك از حافظه رو كه بصورت آرايه اي از بايته تو مقصد كپي مي كنه.

static void Main(string[] args)
{
byte[] b1 ={ 1, 2, 3 };
byte[] b2=new byte[3];

CopyBuffer(b1, b2);

foreach (byte b in b2)
Console.WriteLine("{0}", b);

Console.ReadLine();
}

private static void CopyBuffer(byte[] srcBytes, byte[] destBytes)
{
unsafe
{
fixed (byte* sb = srcBytes, db = destBytes)
{
byte* sb1 = sb, db1 = db;
for (int i = 0; i < srcBytes.Length; i++)
{
*db1 = *sb1;
sb1++;
db1++;
}
}
}
}

sinashahab
شنبه 08 فروردین 1388, 11:53 صبح
سلام
ببخشید Console.ReadLine(); کارش چیه ؟ (خارج از موضوع)

mithridates
شنبه 08 فروردین 1388, 13:15 عصر
کارش گرفتن اطلاعات از کاربر هست ولی اینجا برای این گذاشته شده چون برنامه های console اگه ReadLine ننویسی سریع بسته میشه کار برنامه رو نمیبینی

GISMan
شنبه 08 فروردین 1388, 13:16 عصر
متد ReadLine كنسولو تو حالت Stand By نگه ميداره و تا زماني كه كليد Enter زده نشه كنسولو نمي بنده. اگه از اين دستور اسنفاده نكني و برنامه رو اجرا كني صفحه خروجي باز ميشه و بعد از چاپ نتايج بلافاصله بسته ميشه.

mirage041
شنبه 08 فروردین 1388, 17:55 عصر
سلام دوستان
می شه خونه های رم برنامه هایی که تو تسک منیجر ویندوز هستن رو پیدا کرد. یعنی برنامه ها یا سرویس هایی که تو تسک منیجر هستن رو با نوشتن برنامه ای شماره ادرس هارد و رمشون رو بدست بیاریم

vcldeveloper
شنبه 15 فروردین 1388, 14:16 عصر
توی ویندوز تا زمانی که در User Mode هستید، دسترسی به حافظه فیزیکی سیستم ندارید! آن چیزی که برنامه شما بهش دسترسی داره، یک فضای آدرس مجازی هست که ویندوز در اختیارش قرار داده. آدرس های این فضای مجازی توسط مدیرحافظه ویندوز به خانه های حافظه فیزیکی Map میشند. برنامه شما دسترسی مستقیمی به خانه های RAM نخواهد داشت، چه در دات نت برنامه را نوشته باشید، چه بصورت Native Code. تنها زمانی می تونید به حافظه فیزیکی دسترسی مستقیم داشته باشید که کد Kernel Mode بنویسید.
مثالی هم که دوستان برای شما قرار دادند، فقط محتویات حافظه مجازی در اختیار برنامه شما را میخونه، و ربطی به RAM سیستم نداره. اگر بطور همزمان محتویات حافظه را بوسیله این کد، توسط دو برنامه مختلف بخوانید، می بینید که دو برنامه محتویات متفاوتی را نمایش می دهند، چون هر کدام حافظه مجازی اختصاص داده به خودشان را نمایش می دهند، نه محتویات RAM سیستم را.

jalalx
شنبه 15 فروردین 1388, 14:58 عصر
ببخشيد، ميشه نمونه كدي بگذاري كه آدرس مستقيم حافظه رو بگيره و مقدار اون رو نمايش بده؟ مثلا مقدار آدرس 0x0001 برابر 2 است.

vcldeveloper
شنبه 15 فروردین 1388, 17:17 عصر
ميشه نمونه كدي بگذاري كه آدرس مستقيم حافظه رو بگيره و مقدار اون رو نمايش بده؟ مثلا مقدار آدرس 0x0001 برابر 2 است. در پست قبل توضیح دادم که این کار در User Mode امکان پذیر نیست، و کد باید در Kernel Mode اجرا بشه. #C هم فقط کدهای User Mode تولید میکنه، حتی اگر از unmanaged code در #C هم استفاده کنید، همچنان در User Mode هستید.
برای برنامه نویسی در Kernel Mode باید از کامپایلری استفاده کنید که این حالت را پشتیبانی کنه، مثلا ++VC یا C++ Builder. البته برنامه نویسی برای Kernel Mode و مفاهیم مربوط به آن با برنامه نویسی برای User Mode فرق های زیادی میکنه. برای آشنایی با آن و چگونگی نوشتن درایورهای Kernel Modeف باید اشراف زیادی بر چگونگی کارکرد ویندوز داشته باشید، همچنین باید Microsoft DDK را هم نصب و مطالعه کنید.