د لینوس تورالډز تقلید کول: له چارت څخه خپل عملیاتي سیسټم رامینځته کړئ (III)

موږ د پوسټونو دې لړۍ ته دوام ورکوو چې څنګه زموږ عملیاتي سیسټم رامینځته کړو. نن ورځ موږ په یوې موضوع تمرکز نه کوو مګر موږ له نن څخه ځینې ګټورې دندې تعریف کوو. لومړی موږ د 3 دندو تعریف کوو چې دندې ترسره کوي حافظی, یادول y حافظه:

void* ND::Memory::Set(void* buf, int c, size_t len)
{
unsigned char* tmp=(unsigned char*)buf;
while(len--)
{
*tmp++=c;
}
return buf;
}
void* ND::Memory::Copy(void* dest,const void* src, size_t len)
{
const unsigned char* sp=(const unsigned char*)src;
unsigned char* dp=(unsigned char*)dest;
for(;len!=0;len--) *dp++=*sp++;
return dest;
}
int ND::Memory::Compare(const void* p1, const void* p2, size_t len)
{
const char* a=(const char*)p1;
const char* b=(const char*)p2;
size_t i=0;
for(;i<len;i++)
{
if(a[i] < b[i]) return -1; else if(a[i] > b[i])
return 1;
}
return 0;
}

دا ټول پخپله پلي کونکي دي. دا دندې ما د کوچني C کتابتون څخه اخیستې ، پلي کول یې معمولا په ټولو عملیاتي سیسټمونو کې ورته وي. اوس موږ 3 سمولي وظیفه ترسره کوو مګر د تارونو مینځلو لپاره. دوی به د strcpy, strcat y strcmp.

size_t ND::String::Length(const char* src)
{
size_t i=0;
while(*src--)
i++;
return i;
}
int ND::String::Copy(char* dest, const char* src)
{
int n = 0;
while (*src)
{
*dest++ = *src++;
n++;
}
*dest = '';
return n;
}
int ND::String::Compare(const char *p1, const char *p2)
{
int i = 0;
int failed = 0;
while(p1[i] != '' && p2[i] != '')
{
if(p1[i] != p2[i])
{
failed = 1;
break;
}
i++;
}
if( (p1[i] == '' && p2[i] != '') || (p1[i] != '' && p2[i] == '') )
failed = 1;
return failed;
}
char *ND::String::Concatenate(char *dest, const char *src)
{
int di = ND::String::Length(dest);
int si = 0;
while (src[si])
dest[di++] = src[si++];
dest[di] = '';
return dest;
}

موږ اوس د یو څه په زړه پوري دندو سره. د دې دندو سره موږ کولی شو د هارډویر بندرونو لوستلو او ولولو. دا په نورمال ډول د ASM سره ترسره کیږي او لارښوونو ته په (x86) کې مطابقت لري in y څخه. د C څخه ASM ته په اسانۍ سره زنګ وهلو لپاره ، لارښوونې وکاروئ asm، د خطر سره چې دا تقویت کوي چې دا د پورټ وړ ندی. دې جملې ته موږ اضافه کوو واټوټیل نو د دې لپاره چې GCC هڅه نه کوي چې دا متن اصلاح کړي. له بلې خوا ، د ASM لارښوونې د پیرامیټونو منلو ګټو طریقه لري ، مګر زه فکر کوم چې د مثالونو په لیدو سره ښه پوهیږي.

void ND::Ports::OutputB(uint16_t port, uint8_t value)
{
asm volatile("outb %1, %0" : : "dN"(port), "a"(value));
}
uint8_t ND::Ports::InputB(uint16_t _port)
{
unsigned char rv;
asm volatile("inb %1, %0" : "=a"(rv) : "dN"(_port));
return rv;
}

او تر دې دمه د 3 پوسټ وروسته ، نن موږ هیڅ څرګندونکی نه دی کړی مګر موږ ورته دندې تعریف کړې چې د راتلونکي لپاره به په کار راشي. 64-bit کاروونکو ته خبرداری ورکړئ چې زه د a په فکس کولو کار کوم کړاو کوم چې په 64 ټوټو کې د سمباليدو مخه نیسي. په راتلونکي پوسټ کې به موږ د x86 معمارۍ مهمه برخه وګورو ، GDT.


د مقالې مینځپانګه زموږ د اصولو سره سمون لري ایډیټیک اخلاق. د غلطۍ راپور ورکولو لپاره کلیک وکړئ دلته.

9 نظرونه ، خپل پریږدئ

خپله نظر پرېږدئ

ستاسو د بریښنا لیک پته به خپره نه شي.

*

*

  1. د معلوماتو لپاره مسؤل: میګیوانجل ګاتین
  2. د معلوماتو هدف: د سپیم کنټرول ، د نظر مدیریت.
  3. قانونیت: ستاسو رضایت
  4. د معلوماتو راټولول: معلومات به د قانوني مکلفیت پرته دریمې ډلې ته نه لیږدول کیږي.
  5. د معلوماتو ذخیره: ډیټابیس د Occentus شبکې (EU) لخوا کوربه شوی
  6. حقونه: په هر وخت کې تاسو کولی شئ خپل معلومات محدود ، له سره تنظیم او حذف کړئ.

  1.   نوم dijo

    راځئ چې وګورو که تاسو د بګ حلولو څرنګوالي په اړه نظر ورکړئ ، ځکه چې زه له لومړۍ برخې څخه مخکې نه و.

    1.    O_Pixote_O dijo

      زه فکر کوم چې دوی د پوسټ 2 په نظرونو کې غلطي باندې تبصره کړې. دوی فکر کاوه چې دا د grub څخه یو څه و که زه سم یادونه وکړم

  2.   نیلي سکل dijo

    د خدای په امان کاپي؟

    1.    نیلي سکل dijo

      د بایټ له لارې په ښکاره ډول ... ، 2 پرله پسې ناکامۍ بریالیتوب نه کوي ، تایید شوی.

  3.   روبی ایکس اینوم ایکس dijo

    د خورا ښه پوسټ لپاره ډیره مننه او زه یې تعقیبوم ، زه ځینې پوښتنې لرم:
    1. کله چې تاسو ووایاست چې په اسانۍ سره د C څخه ASM ته زنګ ووهئ ، د ASM لارښوونې کارول کیږي ، د دې خطر سره چې دا اړین دی چې دا د پورټ وړ ندی '، نو ستاسو څه معنی ده کله چې تاسو ووایاست' د خطر سره چې دا اړین دی چې دا د پورت وړ ندي '؟

    2. که چیرې یو 'مسلکي' عملیاتي سیسټم رامینځته شوی وي (نو د خبرو لپاره) د هارډویر لاسرسي برخه به په اسمبلر کې ترسره شي.

    .3 دا به په اسمبلر کې څنګه ترسره شي؟

    1.    اډریان اریو سټریټ dijo

      د دې تعقیب لپاره ستاسو څخه مننه ، زه به پوښتنو ته ځواب ووایم.
      1- ښه ، د asm لارښوونې سره ستونزه دا ده چې دا په کوم C معیار کې شتون نلري ، نو هر یو تالیف کونکی دا پخپله پلي کوي (که چیرې دا پلي کړي). پدې حالت کې دا د GCC او کلانګ سره ترکیب کیدی شي (دا په دې برخه کې د GCC په څیر ډیر ښکاري) مګر تاسو به نور وړونکي لکه Intel C کې دا وړتیا ونلرئ (دا په ASM کې د Intel Syntax کاروي).
      - په مسلکي توګه ، یوه برخه او بله باید د معمارۍ او بلې مشترک برخې لخوا په واضح ډول جلا شي. دا اړینه نده چې دا په ارسبلر کې ترسره کړئ (لینیکس دا په C کې لري)
      3- په ارسبلر کې دا هم خورا ساده دی ، مګر تاسو دا په جلا فایل کې لرئ. له بلې خوا ، د دلیلونو درلودو سره موږ باید لومړی دا راجسترونو ته واړوو او دا یو څه ډیر ګډوډ کولی شي ، بیا outb یا inb غوښتل کیږي او فنکشن د نړۍ په کچه څرګند لیدل کیږي. بیا د سي څخه تاسو باید سرلیک جوړ کړئ چې د "خارجي" فنکشن اعلان کړي. په NASM (Intel Syntax) کې به دا یو څه داسې وي:
      وتل:
      ایبپ فشار کړئ
      Mov ebp ، esp

      میو اکس ، [ebp + 12]
      Mov edx ، [ebp + 8]

      dx، al

      Mov esp ، ebp
      پاپ ebp
      وتنه

  4.   Max dijo

    پوښتنه ، تاسو کوم ترکیب کاروی؟ زه نه پوهیږم چې ولې دومره مختلف بیلابیل asm xD MASM، FASM، NASM، AT & T ...
    او که تاسو وخت لرئ ، کولی شئ دا کرښه تشریح کړئ:
    asm volatile ("outb٪ 1،٪ 0" :: "dN" (پورټ)، "a" (ارزښت))؛

    تر دې چې "asm volatile" تر دې دمه مې xD پوهېده "له مخې یې 1,0،XNUMX؟"
    یا ایا دا 1 -> »dN» (پورټ) ، 0 -> «a» (ارزښت) دی؟
    که دا وروستی وي ، زه نه پوهیږم چې "DN" څه شی دی او څه "a" دي ...

    ستاسو د همکاریو څخه ډیره مننه! د نه منلو وړ !!

    1.    اډریان اریو سټریټ dijo

      هغه ترکیب چې زه یې کاروم د AT&T دی چې هغه څه دي چې GCC په داخلي توګه کاروي که څه هم دا په NASM کې ستونزې پرته ترسره کیدی شي (د ترکیب تطابق). د asm خوځنده د دې پیچلي بیان په اړه زه یوازې تاسو ته ویلای شم چې دا د GCC له امله دی ځکه چې دا ځینې پیرامیټرې کاروي ترڅو پوه شي چې ډاټا څنګه باید تیره شي. د مثال په توګه "a" یو ځانګړی x86 عملیات دی چې د راجستر نماینده کولو لپاره کارول کیږي. بشپړ لیست دلته دی: http://gcc.gnu.org/onlinedocs/gcc/Constraints.html#Constraints

  5.   charizardfire52 dijo

    سمه ده ، زه واقعیا مرستې ته اړتیا لرم ، زه پدې کې نوی یم او زه یو څه لږ نظر نلرم چې د ترمینال په لیکلو سره څه وکړي ، ایا څوک زما سره مرسته کولی شي؟