અનુકરણ લિનસ ટોરવાલ્ડ્સ: શરૂઆતથી તમારી પોતાની operatingપરેટિંગ સિસ્ટમ બનાવો (III)

આપણી ourપરેટિંગ સિસ્ટમ કેવી રીતે બનાવવી તેના પર અમે પોસ્ટ્સની આ શ્રેણી ચાલુ રાખીએ છીએ. આજે આપણે એક વિષય પર ધ્યાન કેન્દ્રિત કરવાના નથી પરંતુ આપણે હવેથી કેટલાક ઉપયોગી કાર્યોની વ્યાખ્યા આપી રહ્યા છીએ. પ્રથમ આપણે 3 કાર્યોને વ્યાખ્યાયિત કરવા જઈ રહ્યા છીએ જેનું કાર્ય પૂર્ણ કરે છે મેમ્પી, મેમસેટ y memcmp:

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;
}

તે બધા સ્વ-અમલીકરણ છે. આ વિધેયો મેં નાના સી લાઇબ્રેરીમાંથી લીધા છે, અમલીકરણ સામાન્ય રીતે બધી operatingપરેટિંગ સિસ્ટમ્સમાં સમાન હોય છે. હવે આપણે 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 બહાર. સી થી ASM ને સરળતાથી ક callલ કરવા માટે, સૂચનાનો ઉપયોગ કરો એએસએમ, તે જોખમમાં છે કે તે દબાણ કરે છે કે તે પોર્ટેબલ નથી. આ વાક્યમાં આપણે ઉમેરીએ છીએ વોલેટાઇલ જેથી જીસીસી તે લખાણને izeપ્ટિમાઇઝ કરવાનો પ્રયાસ ન કરે. બીજી બાજુ, એએસએમ સૂચનામાં પરિમાણોને સ્વીકારવાની એક વિચિત્ર રીત છે, પરંતુ મને લાગે છે કે ઉદાહરણો જોતાં તે વધુ સારી રીતે સમજાય છે.

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-બીટ વપરાશકર્તાઓને સૂચના આપો કે હું a ને સુધારવા પર કામ કરી રહ્યો છું ભૂલ જે 64 બિટ્સમાં યોગ્ય રીતે કમ્પાઇલ કરવાનું રોકે છે. આગળની પોસ્ટમાં આપણે x86 આર્કિટેક્ચરનો એક મહત્વપૂર્ણ ઘટક જોશું, જી.ડી.ટી.


તમારી ટિપ્પણી મૂકો

તમારું ઇમેઇલ સરનામું પ્રકાશિત કરવામાં આવશે નહીં. આવશ્યક ક્ષેત્રો સાથે ચિહ્નિત થયેલ છે *

*

*

  1. ડેટા માટે જવાબદાર: મિગ્યુએલ gelંજેલ ગેટóન
  2. ડેટાનો હેતુ: નિયંત્રણ સ્પામ, ટિપ્પણી સંચાલન.
  3. કાયદો: તમારી સંમતિ
  4. ડેટાની વાતચીત: કાયદાકીય જવાબદારી સિવાય ડેટા તૃતીય પક્ષને આપવામાં આવશે નહીં.
  5. ડેટા સ્ટોરેજ: cસેન્ટસ નેટવર્ક્સ (ઇયુ) દ્વારા હોસ્ટ કરેલો ડેટાબેઝ
  6. અધિકાર: કોઈપણ સમયે તમે તમારી માહિતીને મર્યાદિત, પુન recoverપ્રાપ્ત અને કા deleteી શકો છો.

  1.   નામ જણાવ્યું હતું કે

    ચાલો જોઈએ કે તમે ભૂલને કેવી રીતે હલ કરવી તે અંગે ટિપ્પણી કરો છો, કારણ કે હું પહેલા ભાગથી આગળ નથી ગયો.

    1.    O_Pixote_O જણાવ્યું હતું કે

      મને લાગે છે કે તેઓએ પોસ્ટ 2 ની ટિપ્પણીઓમાંની ભૂલ પર ટિપ્પણી કરી. તેઓએ વિચાર્યું કે જો મને બરાબર યાદ આવે તો તે ગ્રબમાંથી કંઈક છે

  2.   બ્લુસ્કુલ જણાવ્યું હતું કે

    બાય બાય ક Copyપિ કરો?

    1.    બ્લુસ્કુલ જણાવ્યું હતું કે

      બાઈટ બાઈટ સ્પષ્ટ રીતે ..., સતત 2 નિષ્ફળતા સફળ થતી નથી, પુષ્ટિ મળી.

  3.   રૂબીએક્સએનયુએમએક્સ જણાવ્યું હતું કે

    ખૂબ સારી પોસ્ટ માટે ખૂબ ખૂબ આભાર અને હું તેનું પાલન કરી રહ્યો છું, મને કેટલાક પ્રશ્નો છે:
    1. જ્યારે તમે કહો છો કે 'સી થી એએસએમને સરળ રીતે બોલાવવા માટે, ત્યારે એ.એસ.એમ. સૂચનાનો ઉપયોગ કરવામાં આવે છે, તે જોખમ સાથે કે તે લગાવે છે કે તે પોર્ટેબલ નથી', જ્યારે તમે કહો છો ત્યારે તેનો અર્થ શું છે 'તે જોખમમાં છે કે જેમાં તે શામેલ છે તે પોર્ટેબલ નથી '?

    2. જો 'પ્રોફેશનલ' operatingપરેટિંગ સિસ્ટમ બનાવવાની હોય (તેથી બોલવા માટે) હાર્ડવેરને accessક્સેસ કરવાનો આ ભાગ એસેમ્બલરમાં કરવામાં આવશે.

    3. તે એસેમ્બલરમાં કેવી રીતે કરવામાં આવશે?

    1.    એડ્રિયનઆરોયોસ્ટ્રીટ જણાવ્યું હતું કે

      તેનું પાલન કરવા બદલ આભાર, હું એક પછી એક પ્રશ્નોના જવાબ આપીશ:
      1- સારું, asm સૂચના સાથે સમસ્યા એ છે કે તે કોઈપણ સી ધોરણમાં અસ્તિત્વમાં નથી, તેથી દરેક કમ્પાઇલર તેને તેની રીતે લાગુ કરે છે (જો તે તેને લાગુ કરે છે). આ કિસ્સામાં તે જીસીસી અને ક્લેંગ સાથે સંકલિત કરી શકાય છે (તે આના સંદર્ભમાં જીસીસી જેવું લાગે છે) પરંતુ તમે ઇન્ટેલ સી જેવા અન્ય કમ્પાઇલરોમાં આ કરી શકશો નહીં (આ એએસએમમાં ​​ઇન્ટેલ સિન્ટેક્સનો ઉપયોગ કરે છે).
      2- વ્યવસાયિક રૂપે, એક ભાગ અને બીજો સ્પષ્ટ રીતે આર્કિટેક્ચર્સ અને બીજો સામાન્ય ભાગ દ્વારા અલગ પાડવો જોઈએ. એસેમ્બલરમાં કરવું જરૂરી નથી (લિનક્સમાં તે સીની અંદર છે)
      3- એસેમ્બલરમાં તે ખૂબ સરળ છે, પરંતુ તમારી પાસે એક અલગ ફાઇલમાં છે. બીજી બાજુ, દલીલો રાખીને આપણે પહેલા તેને રજિસ્ટરમાં પસાર કરવું આવશ્યક છે અને તે થોડી વધુ ગડબડ કરી શકે છે, પછી આઉટબ અથવા ઇનબને બોલાવવામાં આવે છે અને ફંક્શન વૈશ્વિકરૂપે દૃશ્યમાન જાહેર કરવામાં આવે છે. પછી સીથી તમારે હેડર બનાવવું આવશ્યક છે જે "બાહ્ય" ફંક્શન જાહેર કરે. એનએએસએમ (ઇન્ટેલ સિન્ટેક્સ) માં તે આના જેવું કંઈક હશે:
      આઉટબ :ક:
      દબાણ ebp
      મોવ ઇબીપી, ઇએસપી

      મોવેક્સ, [ઇબીપી +12]
      મોવ એડીએક્સ, [ઇબીપી + 8]

      આઉટ ડીએક્સ, અલ

      મોવ ઇએસપી, ઇબીપી
      પ popપ ebp
      નિ

  4.   મેક્સ જણાવ્યું હતું કે

    પ્રશ્ન, તમે કયા વાક્યરચનાનો ઉપયોગ કરો છો? હું સમજી શકતો નથી કે આટલા જુદા જુદા asm xD MASM, FASM, NASM, AT & T ...
    અને જો તમારી પાસે સમય હોય, તો તમે આ વાક્યને સમજાવી શકશો:
    asm વોલેટાઇલ ("આઉટબ% 1,% 0" :: "ડી.એન." (પોર્ટ), "એ" (મૂલ્ય));

    "Asm volatile" સુધી હું xD ​​સમજી શક્યો "1,0 દ્વારા?"
    અથવા તે 1 -> »dN» (પોર્ટ), 0 -> «એ» (મૂલ્ય) છે?
    જો તે પછીનું છે, તો હું સમજતો નથી કે "ડીએન" શું છે અને "એ" શું છે ...

    તમારા યોગદાન બદલ ખૂબ ખૂબ આભાર! અતુલ્ય !!

    1.    એડ્રિયનઆરોયોસ્ટ્રીટ જણાવ્યું હતું કે

      હું જે વાક્યરચનાનો ઉપયોગ કરું છું તે એટીએન્ડટી છે જે જીસીસી આંતરિકરૂપે વાપરે છે જો કે તે એનએએસએમ (સિંટેક્સને અનુરૂપ) માં સમસ્યા વિના કરી શકાય છે. એએસએમ અસ્થિરના તે જટિલ નિવેદન વિશે, હું તમને ફક્ત એટલું જ કહી શકું છું કે તે જીસીસીને કારણે છે કારણ કે તે ડેટાને કેવી રીતે પસાર થવો જોઈએ તે જાણવા માટે કેટલાક પરિમાણોનો ઉપયોગ કરે છે. ઉદાહરણ તરીકે "એ" એ રજિસ્ટરનું પ્રતિનિધિત્વ કરવા માટે વપરાય છે તે એક ખાસ x86 XNUMXપરેન્ડ છે. સંપૂર્ણ સૂચિ અહીં છે: http://gcc.gnu.org/onlinedocs/gcc/Constraints.html#Constraints

  5.   charizardfire52 જણાવ્યું હતું કે

    ઠીક છે, મને ખરેખર સહાયની જરૂર છે, હું આ માટે નવું છું અને ટર્મિનલમાં જે લખ્યું છે તેનાથી શું કરવું તે મને સહેજ વિચાર નથી, કોઈ મારી મદદ કરી શકે?