PDA

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



salpc
07-05-17, 22:51
درود
دوستان لطفا یک منبع واسه نوشتن برنامه در سطح سیستم و بایوس بهم بگید.
مثلا
توی borland C ++ یه برنامه واسه دسرسی به مثلا کیبورد داشته باشیم یا از این موارد
که از توابع dos استفاده میشه

همین دسترسی به ستاپ چطور نوشته شده؟
اگه pdf یا سایتی هست لطفا معرفی بفرمایید .
باتشکر.:11():

SajjadKhati
07-05-17, 23:07
سلام
کار آسونی فکر نکنم باشه دسترسی به بایوس
شاید جزء سخت ترین کارها باشه (بازم نمیدونم)
فکر کنم از سطح ++C هم بیشتر بخواد یعنی احتمالا زبونی در حد اسمبلی شاید لازم باشه که بدونن
استاد امید اسمبلی کار کرد
حالا ببینیم نظر اساتیدهایی مثل استاد امید و استاد آرمین و ... چیه؟ (من فقط گمانه زنی در این حد کردم:Love-ssa~! (1):)

ravegoat
08-05-17, 07:42
درود
دوستان لطفا یک منبع واسه نوشتن برنامه در سطح سیستم و بایوس بهم بگید.
مثلا
توی borland C ++ یه برنامه واسه دسرسی به مثلا کیبورد داشته باشیم یا از این موارد
که از توابع dos استفاده میشه

همین دسترسی به ستاپ چطور نوشته شده؟
اگه pdf یا سایتی هست لطفا معرفی بفرمایید .
باتشکر.:11():
با سلام،

برنامه نویسی هر بایوس به ساختار اون مادربورد وابسته است. در نتیجه ما نمی تونیم با یک روش بایوس هر مادربوردی رو به شکل دلخواه برنامه ریزی کنیم. ولی اگر تمایل دارید با ساختار برنامه ی بایوس آشنا بشید، پیوند زیر رو مطالعه بفرمایید:
Only the registered members can see the link
البته پروژه ای به نام coreboot (Only the registered members can see the link) هم وجود داره که با مهندسی معکوس به بایوس چندین مدل از مادربورد ها دست پیدا کرده که بررسی اون خالی از لطف نیست. زبان متداول برای نوشتن بایوس ها سی هستش. البته بعضی از قسمت های اون نظیر فرخوانی Boot Loader شاید با اسمبلی نوشته بشه.

اون موردی که شما در مورد Keyboard یا توابع DOS می فرمایید غالبا از طریق وقفه های بایوس (Only the registered members can see the link) صورت می گیره. شما می تونید از طریق یک کد اسمبلی به واسطه ی پردازنده یک وقفه رو صدا بزنید و در رجیستر پردازنده منتظر جواب اون بمونید (در C++ هم این کار توسط کلمه ی کلیدی asm (Only the registered members can see the link)امکان پذیره). برای اطلاعات بیش تر:
BIOS and DOS Interrupts (Only the registered members can see the link)
Only the registered members can see the link

دسترسی به تنظیمات بایوس پیچیده است. پردازنده از طریق درگاه های IO (Only the registered members can see the link)خودش مانند 70H با حافظه ی بایوس می تونه در ارتباط باشه. نکته اینجاست که در ویندوز شما از سطح یک Application نمی تونید به این درگاه ها دسترسی داشته باشید. در نتیجه باید یک درایور در سطح هسته (Only the registered members can see the link(v=vs.85).aspx) طراحی کنید که این کار رو براتون انجام بده (البته لینوکس در این مورد آزادی عمل بیش تری به شما میده). پس از دسترسی به حافظه شما باید آدرس های حافظه رو تفسیر کنید تا درک کنید که هر آدرس حافظه شامل چه تنظیماتی از مادربورد هستش. متاسفانه این آدرس دهی ها استاندارد جامعی نداره و حتی این استاندارد بر روی دو مدل مادربورد از شرکت یکسان ممکنه متفاوت باشه. مضافا این که تقریبا هیچ شرکتی اطلاعات مربوط به آدرس دهی های خودش رو منتشر نمی کنه.

AtrafNET
08-05-17, 08:32
سلام
با اجازه استارتر منم خیلی دوست دارم بدونم برنامه های تحت بوت رو چطوری میسازن.
منظورم مثل استارتر ارتباط با مادربورد و بایوس نیست بلکه منظورم نرم افزار های کاربری هستش که به صورت Bootable میسازن و قبل از شروع سیستم عامل اجرا میشن و عملاً به هر چیزی دسترسی دارن.
اگر منم بخوام یه برنامه ام رو قابل اجرا در محیط Boot کنم چطور و با چه زبان برنامه نویسی ممکنه؟ بیشتر منظورم برنامه های Bootable مستقل هستش نه اونایی که از یه توزیع لینوکس شخصی سازی شده استفاده میکنن.

یا حتی می دونم خنده داره سوالم ولی سیستم عامل هم خودش یه برنامه قابل اجرا در Boot حساب میشه نه؟ یعنی اگه روش ساختن برنامه قابل اجرا در Boot رو یاد بگیریم می تونیم یه سیستم عامل کوچک و شخصی در حد 4 تا امکان ساده هم شده اگه تلاش کنیم بسازیم؟

AMD>INTEL
08-05-17, 11:33
بایوس ها الان به صورت ماجول های آماده شده توسط شرکتهای اصلی مثل AMI و ... عرضه میشه . شرکت های سازنده برد فقط از نظر ظاهری و یکسری موارد را به بایوس خام این شرکت ها اضافه میکنند . مخصوصا UEFI ها به دلیل گرافیکی بودن و بالا بودن حجم و ... زمان زیادی خواهد برای نوشتن .
شرکتهایی مثل AMI بیس را معرفی میکنند و شرکت های تولید کننده بردها برای محصولاتشون شخصی سازی میکنند .
حتما سایت AMI را چک کنید .

ravegoat
08-05-17, 16:49
سلام
با اجازه استارتر منم خیلی دوست دارم بدونم برنامه های تحت بوت رو چطوری میسازن.
منظورم مثل استارتر ارتباط با مادربورد و بایوس نیست بلکه منظورم نرم افزار های کاربری هستش که به صورت Bootable میسازن و قبل از شروع سیستم عامل اجرا میشن و عملاً به هر چیزی دسترسی دارن.
اگر منم بخوام یه برنامه ام رو قابل اجرا در محیط Boot کنم چطور و با چه زبان برنامه نویسی ممکنه؟ بیشتر منظورم برنامه های Bootable مستقل هستش نه اونایی که از یه توزیع لینوکس شخصی سازی شده استفاده میکنن.

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

هر برنامه ای برای بوت شدن نیاز به یک Bootloader (Only the registered members can see the link)داره. بوت لودر متداول یه برنامه ی 512 بایتی هستش که به زبان اسمبلی نوشته میشه و هسته ی سیستم عامل یا برنامه ی شما رو روی سیستم بارگذاری می کنه. برای طراحی بوت لودر می تونید پیوند های زیر رو مطالعه بفرمایید:
Only the registered members can see the link_Toc231383167
Only the registered members can see the link
Only the registered members can see the link
Only the registered members can see the link

جواب سوال بعدی تون مثبته. برای طراحی یک سیستم عامل ساده پیوند های زیر می تونه مفید باشه:
Only the registered members can see the link
Only the registered members can see the link
Only the registered members can see the link
Only the registered members can see the link

فقط برای تست این سیستم عامل ها از VM استفاده کنید.

salpc
11-05-17, 14:19
سلام
این کد رو ببینید درسته
میخوام دسترسی به کیبورد با استفاده از توابع بایوس داشته باشم یعنی وقتی کلیدی از کیبورد بزنیم تو خروجی بنویسه و مثلا کلید capslock رو هم بزنه روشنه یا خاموش .

:

KEYBOARD BIOS CALLS

INT 16H This interrupt in the ROM BIOS provides for minimal character transfer from the keyboard. It is entered by first specifying the desired task to perform in the AH register. AH = 0 Get Key
Returns with AH = scan code
AL = ascii char, 0 = non-ascii, ie Func key
AH = 1 Get status
Returns with zflag = 0, valid key in queue
= 1, no key in queue
AH = scan code
AL = ascii char, 0 = non-ascii, ie, Func key
AH = 2 Get shift status
Returns with AL = 7 Right shift 1 = pressed
6 Left shift
5 Ctrl
4 Alt
3 Scroll Lock 1 = on
2 Num Lock
1 Caps Lock
0 Ins

Lets develop routines similar to those found in some libraries. #include <dos.h>

int bioskey( cmd )
int cmd;
{
union REGS regs;
regs.h.ah = cmd;
int86( 0x14, &regs, &regs );
return( regs.x.ax );
}

int kbhit()
{
union REGS regs;
regs.h.ah = 1;
int86( 0x16, &regs, &regs );
return( regs.x.cflags & 0x0040 ); /* return Z flag only */
}

این رو از یه سایتی پیدا کردم ولی :
من نوشتم ولی کار نکرد!! وقفه 16h رو کجا باید فراخوانی بکنم؟
البته روی سیستم عامل ویندوز xp به صورت مجازی (با نرم افزار VMware Workstation Pro )نوشتم ولی اصلا اجرا نشد و همش رو ارور میداد !! نکنه به خاطر همین مجازی بود!! نمیدونم !
اشتباه کجا هست؟
لطفا کمک کنید.
ممنون :11()::11():

salpc
12-05-17, 12:11
کسی با وقفه ها اصلا کار نکرده؟؟

AMD>INTEL
12-05-17, 12:20
کسی با وقفه ها اصلا کار نکرده؟؟

صبر کنی خود مهندس آرمین میان جواب میدند .

ravegoat
13-05-17, 19:17
سلام
این کد رو ببینید درسته
میخوام دسترسی به کیبورد با استفاده از توابع بایوس داشته باشم یعنی وقتی کلیدی از کیبورد بزنیم تو خروجی بنویسه و مثلا کلید capslock رو هم بزنه روشنه یا خاموش .

:

KEYBOARD BIOS CALLS

INT 16H This interrupt in the ROM BIOS provides for minimal character transfer from the keyboard. It is entered by first specifying the desired task to perform in the AH register. AH = 0 Get Key
Returns with AH = scan code
AL = ascii char, 0 = non-ascii, ie Func key
AH = 1 Get status
Returns with zflag = 0, valid key in queue
= 1, no key in queue
AH = scan code
AL = ascii char, 0 = non-ascii, ie, Func key
AH = 2 Get shift status
Returns with AL = 7 Right shift 1 = pressed
6 Left shift
5 Ctrl
4 Alt
3 Scroll Lock 1 = on
2 Num Lock
1 Caps Lock
0 Ins

Lets develop routines similar to those found in some libraries. #include <dos.h>

int bioskey( cmd )
int cmd;
{
union REGS regs;
regs.h.ah = cmd;
int86( 0x14, &regs, &regs );
return( regs.x.ax );
}

int kbhit()
{
union REGS regs;
regs.h.ah = 1;
int86( 0x16, &regs, &regs );
return( regs.x.cflags & 0x0040 ); /* return Z flag only */
}

این رو از یه سایتی پیدا کردم ولی :
من نوشتم ولی کار نکرد!! وقفه 16h رو کجا باید فراخوانی بکنم؟
البته روی سیستم عامل ویندوز xp به صورت مجازی (با نرم افزار VMware Workstation Pro )نوشتم ولی اصلا اجرا نشد و همش رو ارور میداد !! نکنه به خاطر همین مجازی بود!! نمیدونم !
اشتباه کجا هست؟
لطفا کمک کنید.
ممنون :11()::11():

با سلام،

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

این برنامه به زبان سی هستش و به علاوه باید با کامپایلر 16 بیتی کامپایل بشه.
برنامه های 16 بیتی اگر اشتباه نکنم تا ویندوز 95 پشتیبانی می شده و در ویندوز XP باید در حالت Compability به اجرا در بیاد.
قبلا هم اشاره شد که ویندوز پیش از بارگذاری هسته به شکل Real (Only the registered members can see the link) اجرا میشه و پس از اون به حالت Protected (Only the registered members can see the link) در می آید. در این حالت دسترسی شما به وقفه ها سلب میشه (البته در نسخه ی قدیمی ویندوز مطمئن نیستم).


وقفه 16H توسط پاس دادن مقدار 0x16 به تابع int86 فراخوانی شده.

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

با آرزوی موفقیت
آرمین:give_rose:

salpc
13-05-17, 22:21
با سپاس از دوستان عزیز
برنامه رو در ویندوز xp روی یه سیستم دیگه نوشتم و این جواب داد.
یکم ویرایش کردم ،اما مثلا کلید capslock و numlock و scrollock وقتی باهم روشن باشن مشکل پیدا میکنه و همه رو میزنه خاموش هستن، باید تک به تک روشن یا خاموش باشن تا برنامه عمل بکنه .
باز هم خوبه یه چیز هایی در سطح DOS متوجه شدم .
از همه دوستان در راهنمایی این موضوع سپاس گزارم.:11()::11()::give_rose:
با آرزوی موفقیت برای همه دوستان.:Love-ssa~! (1):