અનુકરણ લિનસ ટોરવાલ્ડ્સ: 0 થી તમારી પોતાની yourપરેટિંગ સિસ્ટમ બનાવો (વી)

આ પાંચમા હપ્તામાં આપણે જી.ડી.ટી. સાથે સિદ્ધાંત અને ઉપયોગ બંનેમાં એકદમ સમાન ટેબલ જોશું, અમે આઈ.ડી.ટી. નો સંદર્ભ લો. આઈડીટી એટલે વિક્ષેપો વર્ણન કોષ્ટક y એ એક ટેબલ છે જેનો ઉપયોગ થાય છે તે વિક્ષેપોને હેન્ડલ કરવા માટે થાય છે. ઉદાહરણ તરીકે, કોઈ 0 દ્વારા ભાગ બનાવે છે, પ્રક્રિયાના ઇન્ચાર્જ ફંક્શનને કહેવામાં આવે છે. આ કાર્યો આઇએસઆર છે (વિક્ષેપિત સેવા દિનચર્યાઓ). તો ચાલો IDT બનાવીએ અને થોડો ISR ઉમેરીએ.

પહેલા આપણે IDT ને અનુરૂપ સ્ટ્રક્ચર્સ જાહેર કરવા જઈ રહ્યા છીએ.

struct Entry{
uint16_t base_low;
uint16_t sel;
uint8_t always0;
uint8_t flags;
uint16_t base_high;
} __attribute__((packed));
struct Ptr{
uint16_t limit;
uint32_t base;
} __attribute__((packed));

જો તમે જીડીટી સાથે તેની તુલના કરો તો તે જોઈ શકાય છે, પીટીઆર સ્ટ્રક્ચર સમાન છે અને એન્ટ્રી એકદમ સરખી છે. તેથી એન્ટ્રી (સેટગેટ) મૂકવા અને ઇન્સ્ટોલ (ઇન્સ્ટોલ) કરવાના કાર્યો ખૂબ સમાન છે.

void ND::IDT::SetGate(uint8_t num,uint32_t base,uint16_t sel, uint8_t flags)
{
idt[num].base_low=(base & 0xFFFF);
idt[num].base_high=(base >> 16) & 0xFFFF;
idt[num].sel=sel;
idt[num].always0=0;
idt[num].flags=flags;
}

ઇન્સ્ટોલ કરો:

idtptr.limit=(sizeof(struct ND::IDT::Entry)*256)-1;
idtptr.base=(uint32_t)&idt;
ND::Memory::Set(&idt,0,sizeof(struct ND::IDT::Entry)*256);
ND::IDT::Flush();

જો આપણે જોઈએ તો આપણે જોશું કે ઇન્સ્ટોલ ફંક્શન ND :: મેમરી :: સેટ ફંક્શનનો ઉપયોગ કરે છે જે અમે બીજી પોસ્ટમાં જાહેર કર્યું હતું. અમે એ પણ જોઈ શકીએ છીએ કે આપણે હજી સુધી સેટગેટ પર કોઈ ક callsલ નથી કરતા અને અમે એનડી :: આઈડીટી :: ફ્લશને ક callલ કરીએ છીએ, આ ફંક્શન માટે આપણે ફરીથી એએસએમ વોલેટાઇલ સ્ટેટમેન્ટનો ઉપયોગ કરીએ છીએ:

asm volatile("lidtl (idtptr)");

જો બધું બરાબર થાય અને આપણે સૌંદર્યલક્ષી વ્યવસ્થા કરીએ તો તે આના જેવું દેખાવું જોઈએ:

NextDivel-RTD

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

અમે આને IDT ના ઇન્સ્ટોલ ફંક્શનની મેમરી સેટિંગ અને ફ્લશ વચ્ચે ઉમેરીએ છીએ:

ND::IDT::SetGate(0,(unsigned)ND::ISR::ISR1,0x08,0x8E);

ક callલબેક ફંક્શન એનડી :: આઇએસઆર :: આઈએસઆર 1 બનવા જઈ રહ્યું છે જે એકદમ સરળ છે છતાં આપણે ASM નો ઉપયોગ કરવો જ જોઇએ:

void ND::ISR::ISR1()
{
asm volatile(
"cli \n"
"pushl 0 \n"
"pushl 0 \n"
"jmp ND_ISR_Common \n"
);
}

એનડી_આઈએસઆર_કોમન અમે તેને સી ભાષામાં ફંકશન તરીકે વ્યાખ્યાયિત કરીશું. ફાઇલોને બચાવવા અને વાંચવા માટે સુધારણા માટે આપણે બાહ્ય «C» {} નો ઉપયોગ કરી શકીએ:

extern "C"
void ND_ISR_Common()
{
asm volatile(
"pusha \n"
"push %ds \n"
"push %es \n"
"push %fs \n"
"push %gs \n"
"movw $0x10, %ax \n"
"movw %ax, %ds \n"
"movw %ax, %es \n"
"movw %ax, %fs \n"
"movw %ax, %gs \n"
"movl %esp, %eax \n"
"push %eax \n"
"movl $ND_ISR_Handler, %eax \n"
"call *%eax \n"
"popl %eax \n"
"popl %ds \n"
"popl %es \n"
"popl %fs \n"
"popl %gs \n"
"popa \n"
"addl 8, %esp \n"
"iret \n"
);
}

એએસએમમાંનો આ કોડ સમજવામાં થોડો મુશ્કેલ હોઈ શકે છે પરંતુ આ એટલા માટે છે કે આપણે ઇન્ટરપટ દ્વારા જનરેટ થયેલ ડેટાને toક્સેસ કરવા માટે સીમાં સ્ટ્રક્ચરની ઘોષણા કરીશું. દેખીતી રીતે, જો તમને તે ન જોઈએ, તો તમે ફક્ત એનડી :: આઇએસઆર :: આઈએસઆર 1 અથવા કંઈક એવું કર્નલ પેનિકને ક callલ કરી શકો છો. સ્ટ્રક્ચરનો આકાર એવો છે કે:

struct regs{
uint32_t ds;
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax;
uint32_t int_no, err_code;
uint32_t eip, cs, eflags, useresp, ss;
};

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

extern "C"
void ND_ISR_Handler(struct regs *r)
{
if(r->int_no < 32) { ND::Panic::Show(exception_messages[r->int_no]);
for(;;);
}
}

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

int sum=10/0;

જો આપણે કમ્પાઇલ કરીએ તો તે આપણને ચેતવણી આપશે અને જો આપણે તેને ચલાવવાનો પ્રયત્ન કરીએ તો આપણને એક સરસ સ્ક્રીન મળશે:

નેક્સ્ટડિવલ-આઇએસઆર


અને આ પોસ્ટની સમાપ્તિ સાથે, મને લાગે છે કે તે એક સૌથી વ્યાપક પરંતુ તદ્દન વિધેયાત્મક છે.


5 ટિપ્પણીઓ, તમારી છોડી દો

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

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

*

*

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

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

    મેં એલએફએસ પર સ્વિચ કર્યું, તે વધુ સતત છે.

  2.   ઇલિયોટાઇમ 3000 જણાવ્યું હતું કે

    પવિત્ર ... કોઈપણ રીતે, ટ્યુટોરિયલ્સ સારા છે.

  3.   sc જણાવ્યું હતું કે

    ખૂબ સારું, હું તેને શરૂઆતથી અનુસરું છું. શું તમે દરેક ટ્રેલરમાં કોડ જોડી શકશો?

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

      તમારી પાસે ગિટહબ પર બધા સ્રોત કોડ ઉપલબ્ધ છે: http://github.com/AdrianArroyoCalle/next-divel ત્યાંથી તમે કોઈ ઝીપ, એક TAR.GZ ડાઉનલોડ કરી શકો છો અથવા ફક્ત ગિટનો ઉપયોગ કરી શકો છો.

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

    હાહાહા બહુ સારું! મંજૂર! 🙂