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

"એમ્યુલેટિંગ લિનસ ટોરવાલ્ડ્સ" શીર્ષકવાળી પોસ્ટ્સની આ શ્રેણીમાં પાછા આવો આપનું સ્વાગત છે. આજે આપણે જી.ડી.ટી. પહેલા આપણે એ જોવું પડશે કે જીડીટી શું છે. વિકિપિડિયા અનુસાર:

વૈશ્વિક વર્ણનકર્તા કોષ્ટક or જીડીટી એક ડેટા સ્ટ્રક્ચર છે જેનો ઉપયોગ થાય છે ઇન્ટેલ x86-ફેમિલી પ્રોસેસર 80286 પ્રોગ્રામ એક્ઝેક્યુશન દરમિયાન ઉપયોગમાં લેવાતા વિવિધ મેમરી ક્ષેત્રોની લાક્ષણિકતાઓને નિર્ધારિત કરવા માટે, જેમાં સરનામું, કદ અને એક્ઝિક્યુટિએબિલીટી અને લેખનક્ષમતા જેવા સગવડ

જેનું ભાષાંતર થયું તે ગ્લોબલ ડિસ્ક્રીપ્ટર ટેબલ હશે, જે ડેટા એક્સ્ટ્રક્ચર છે જેનો ઉપયોગ ઇન્ટેલ x86 પ્રોસેસરમાં 80286 થી પ્રોગ્રામ એક્ઝેક્યુશન દરમિયાન ઉપયોગમાં લેવાતા વિવિધ મેમરી ક્ષેત્રોની લાક્ષણિકતાઓને વ્યાખ્યાયિત કરવા માટે થાય છે.

સારાંશમાં, જો આપણે ઇન્ટેલ x86 પ્રોસેસરનો ઉપયોગ કરી રહ્યા છીએ, તો આપણે મેમરીના યોગ્ય ઉપયોગ માટે જીડીટી વ્યાખ્યાયિત કરવી આવશ્યક છે. અમે વધુ ગૂંચવણ કરીશું નહીં અને અમે કોષ્ટકમાં 3 પ્રવેશો વ્યાખ્યાયિત કરીશું:

  • બધા કોષ્ટકો માટે જરૂરી નલ પ્રવેશ.
  • વિભાગ માટે ટિકિટ માહિતી, અમે મહત્તમ ઉપયોગ કરીશું, જે 32 બિટ્સમાં 4 જીબી છે.
  • વિભાગ માટે ટિકિટ કોડ, અમે મહત્તમ ઉપયોગ કરીશું, જે 32 બિટ્સમાં 4 જીબી છે.

જેમ તમે જોઈ શકો છો, ડેટા અને કોડ સમાન જગ્યાનો ઉપયોગ કરશે. ઠીક છે, હવે અમે તેનો અમલ કરવા જઈ રહ્યા છીએ. આ માટે અમે બે સ્ટ્રક્ચર્સનો ઉપયોગ કરીશું, પ્રથમ આપણા જીડીટીના વાસ્તવિક ડેટા માટે પોઇંટર રાખવાનો હવાલો હશે. અને બીજો જીડીટી પ્રવેશો સાથેનો એરે હશે. ચાલો પ્રથમ તેમને વ્યાખ્યાયિત કરીએ

struct Entry{
uint16_t limit_low;
uint16_t base_low;
uint8_t base_middle;
uint8_t access;
uint8_t granularity;
uint8_t base_high;
} __attribute__((packed));
struct Ptr{
uint16_t limit;
uint32_t base;
} __attribute__((packed));

તમે સ્ટ્રક્ચર્સના અંતમાં એક વિચિત્ર __attribute __ ((પેક્ડ)) જોયું હશે. આ જીસીસીને સ્ટ્રક્ચર્સને .પ્ટિમાઇઝ ન કરવા કહે છે કારણ કે આપણે જે જોઈએ છે તે પ્રોસેસરની જેમ ડેટા પાસ કરવાનું છે. હવે અમે જીડીટી સ્થાપિત કરવા માટે એક કાર્ય કરવા જઈ રહ્યા છીએ. આપણે સ્ટ્રક્ચર્સને ઘોષિત કરી દીધાં હોત, હવે આપણે તે પ્રારંભ કરીશું.

struct ND::GDT::Entry gdt[3];
struct ND::GDT::Ptr gp;
void ND::GDT::Install()
{
gp.limit=(sizeof(struct ND::GDT::Entry)*3)-1;
gp.base=(uint32_t)&gdt;
}

તેથી અમે અમારા 3-ઇનપુટ ટેબલ પર જાય છે તે નિર્દેશક બનાવવાનું છે.

જો તમે 64 બિટ્સનો ઉપયોગ કરીને કમ્પાઇલ કરો છો તો તે સંભવિત અહીં નિષ્ફળ જશે. આ એટલા માટે છે કારણ કે 64 64-બીટ સિસ્ટમ્સ પરના નિર્દેશકો સ્પષ્ટપણે-32-બીટ હોય છે અને અમે અહીં -૨-બીટ પ્રકારના ઉપયોગ કરી રહ્યા છીએ. -M32 વિકલ્પનો ઉપયોગ કરવો હવે માટે મદદ કરી શકે છે
હવે આપણે ઇનપુટ્સમાં ડેટા મૂકવા માટે એક સામાન્ય ફંકશન વ્યાખ્યાયિત કરીએ છીએ

void ND::GDT::SetGate(int num, uint32_t base, uint32_t limit, uint8_t access,uint8_t gran)
{
gdt[num].base_low=(base & 0xFFFF);
gdt[num].base_middle=(base >> 16) & 0xFF;
gdt[num].base_high=(base >> 24) & 0xFF;
gdt[num].limit_low=(limit & 0xFFFF);
gdt[num].granularity=(limit >> 16) & 0x0F;
gdt[num].granularity |= (gran & 0xF0);
gdt[num].access=access;
}

અને આપણે તેને ઇન્સ્ટોલ ફંક્શનથી 3 વાર કહીએ છીએ

ND::GDT::SetGate(0,0,0,0,0); /* NULL segmente entry */
ND::GDT::SetGate(1,0,0xFFFFFFFF,0x9A,0xCF); /* 4 GiB for Code Segment */
ND::GDT::SetGate(2,0,0xFFFFFFFF,0x92,0xCF); /* 4 GiB for Data segment */

અંતે, આપણે પ્રોસેસરને કહેવું જ જોઇએ કે અમારી પાસે જીડીટી છે, જેથી તે તેને લોડ કરી શકે, અને અમારા કિસ્સામાં જ્યારે GRUB સાથે કર્નલ લોડ કરવામાં આવે ત્યારે, GRUB GDT ફરીથી લખી શકાય. જી.ડી.ટી.ટી. ને લોડ કરવા માટે એ.જી.જી.ડી.ટી. (અથવા વાક્યરચનાના આધારે એલ.જી.ડી.ડી.ટી.) નામની એક સૂચના છે, અમે તેનો ઉપયોગ કરીશું.

asm volatile("lgdtl (gp)");
asm volatile(
"movw $0x10, %ax \n"
"movw %ax, %ds \n"
"movw %ax, %es \n"
"movw %ax, %fs \n"
"movw %ax, %gs \n"
"movw %ax, %ss \n"
"ljmp $0x08, $next \n"
"next: \n"
);

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

નેક્સ્ટડિવલ-જીડીટી


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

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

*

*

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

  1.   સેરોન જણાવ્યું હતું કે

    કદાચ આ સમયે 64-બીટ સ્ટ્રક્ચર વધુ યોગ્ય છે, 8086 નો ઉપયોગ ચાલુ રાખવાનો એ બેકલોગ છે.

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

      હું x86_64 માં GDT પરની માહિતી શોધી રહ્યો છું અને મને લાગે છે કે તે વિશેષ ધ્વજ સાથે જૂના મોડેલને અનુસરે છે. 32-બીટ સરનામું હજી પણ ઉપયોગમાં લેવાય છે. હવે મને બરાબર ખબર નથી કે કેવી રીતે તેને યોગ્ય રીતે કરવું. કેટલીક લિંક્સ:
      http://wiki.osdev.org/Entering_Long_Mode_Directly
      http://f.osdev.org/viewtopic.php?f=1&t=16275

  2.   જેરોનિમો જણાવ્યું હતું કે

    પ્રથમ ખૂબ સરસ તમારા યોગદાન, પરંતુ મને લાગે છે કે શીર્ષક હોવું જોઈએ
    "રિચાર્ડ સ્ટોલમેનનું અનુકરણ કરવું" અથવા ઓછામાં ઓછું મને આવું લાગે છે ,,,
    સાદર

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

      લિનુસે લિનક્સ કર્નલ બનાવ્યું, સ્ટોલમેને જીએનયુ બનાવ્યું જે યુનિક્સ ટૂલ્સ અને આદેશો છે.

      શીર્ષક યોગ્ય છે કારણ કે તમે મધ્યવર્તી કેન્દ્ર બનાવી રહ્યા છો.

      શુભેચ્છાઓ!

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

    મારા બધા પ્રશ્નોના જવાબો આપવા અને ધૈર્ય રાખવા બદલ ખૂબ ખૂબ આભાર, હું ફક્ત એસેમ્બલર તરીકેની મૂળભૂત બાબતો જાણું છું અને મને સી વિશે લગભગ કંઈ જ ખબર નથી, પરંતુ મને ખરેખર તે ગમ્યું, હવે હું જીડીટી સાથે થોડો મૂંઝવણમાં છું, ચાલો જોઈએ કે હું જો સમજવું.

    જી.ડી.ટી. પાસે ગ્લોબલ 'ડિસ્ક્રીપ્ટર્સ' હશે જે કોઈ પણ પ્રોગ્રામ દ્વારા હંમેશા એક્સેસ કરી શકાય છે, અને આ ડિસ્ક્રિપ્ટર્સ એવા ભાગો તરફ નિર્દેશ કરે છે જ્યાં (પ્રોગ્રામ) ચલાવવામાં આવશે? અથવા તે અન્યથા છે.