Linus Torvalds-қа еліктеу: өзіңіздің амалдық жүйеңізді нөлден жасаңыз (VII)

Туралы тағы бір хабарламаға қош келдіңіз өзіміздің операциялық жүйемізді қалай құруға болады (Сериядағы алдыңғы мақалалар: 1, 2, 3, 4, 5 y 6). Соңғы жазбадан бері көп уақыт өтті, негізінен менде бар қателікке байланысты. Біз көреміз x86 архитектурасында сағатты қалай басқаруға болады.

Бұрын біз IRQ-ді жалпылама түрде іске қосқан едік, бірақ кішкене мәселе болды, өйткені біз оларды дұрыс іске қоспадық және қосымша мәліметтер жібердік. Біз оны ақырында жөндейміз карлосорта және мен әрі қарай қалай жалғастыру керектігі туралы пікір білдіре аламыз.

Сағат - IRQ, дәлірек айтсақ бірінші. Оны конфигурациялау үшін біз IRQ-ді ND_IRQ_InstallHandler-ді жалпы орнату үшін бұрын анықтаған функцияны қолданамыз.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int divisor = 1193180 / hz; ND :: Ports :: OutputB (0x43,0x36); ND :: Ports :: OutputB (0x40, divisor & 0xFF); ND :: Ports :: OutputB (0x40, бөлгіш >> 8); } void ND :: Timer :: Wait (int ticks) {қол қойылмаған ұзын этикалар; eticks = ND_TIMER_TICKS + кенелер; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString («\ nТаймерді орнату ...»); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString («дайын»); } extern «C» жарамсыздығы ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; егер (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString («\ nТағы бір секунд»); ЖАҢАРТУ ЭКРАНЫН ЖАСАУ КЕРЕК}}

Код келесідей жұмыс істейді: инициализация жүйесі шақырады ND :: Timer :: Setupқоңырау шалады ND_IRQ_InstallHandler бірінші позицияға енгізу үшін IRQ0, оқиға болған кезде қайта шақыру функциясы, яғни ND_Timer_Handler бұл ұлғаяды кенелер. Біз жылдамдықты 18 Гц-ке орнатқанымыздай, кейінірек көретініміздей, егер оны 18-ге бөліп, бүтін сан берсек, бір секунд өткен болар еді.

Функция ND :: таймер :: фаза Бұл бізге жылдамдығын реттеуге көмектеседі таймер, бұл экстравагант саны 1.19 МГц құрайды, бұл жалпы мән. Егер біз жылдамдығын өзгерткіміз келсе, онда бұл функцияны атаған жөн таймер, әдепкі бойынша ол 18,22 Гц-қа жетеді, бұл біреудің өзі шешкен ерекше мәні IBM және ол осы күнге дейін сақталды.

Функция ND :: таймер :: күте тұрыңыз бұл өте қарапайым, тек циклмен күтіңіз уақыт дейін кенелер жалғастыру қажет.

Суретте біз ND_Timer_Handler ішіндегі кодты алып тастасақ, мынаны аламыз:

NextDivel ішіндегі секундтар

Келесі тарауда біз пернетақтаның кірісін қалай оқып, аздап жасауға болатынын білеміз Shell біздің жүйемен өзара әрекеттесу үшін. Әдеттегідей, код қол жетімді GitHub лицензия бойынша GNU GPL v2.


Мақаланың мазмұны біздің ұстанымдарымызды ұстанады редакторлық этика. Қате туралы хабарлау үшін нұқыңыз Мұнда.

14 пікір, өз пікіріңізді қалдырыңыз

Пікіріңізді қалдырыңыз

Сіздің электрондық пошта мекен-жайы емес жарияланады.

*

*

  1. Деректерге жауапты: Мигель Анхель Гатан
  2. Деректердің мақсаты: СПАМ-ны басқару, түсініктемелерді басқару.
  3. Заңдылық: Сіздің келісіміңіз
  4. Деректер туралы ақпарат: заңды міндеттемелерді қоспағанда, деректер үшінші тұлғаларға жіберілмейді.
  5. Деректерді сақтау: Occentus Networks (ЕО) орналастырған мәліметтер базасы
  6. Құқықтар: Сіз кез-келген уақытта ақпаратты шектей, қалпына келтіре және жоя аласыз.

  1.   Нұх дижо

    Өте қызықты оқулықтар сериясы, жеке мен Linux дистрибутивін нөлден құру туралы көпті көрген емеспін, тіпті испан тілінде де толық емес. Менің ойымша, осыдан көп нәрсе білуге ​​болады және уақыт өте келе мен осы оқулықтарды орындай аламын деп үміттенемін.
    Менің сұрайтыным, сіз ешқашан ренжімеңіз және оқулықты аяқтаңыз, өйткені мен ешқашан аяқталмайтын көптеген жақсы оқулықтар таптым.
    Сәлемдесу және рахмет :).

    1.    жолшы дижо

      Бұл Linux таратылымы емес, бұл ядро ​​is.

    2.    десикодер дижо

      Сенікі дұрыс емес. Linux дистроғын құру ешнәрсені бағдарламалауды білдірмейді, мысалы, нөлден бастап Linux-де сіз бағдарламаламайсыз, не істейсіз (компиляцияға негізделген), дистроцияны құрайтын негізгі пакеттер. Бұл мүлдем басқаша. Бұл сіздің жеке амалдық жүйеңізді құру. Оның Linux-қа еш қатысы жоқ. Торвальдтар оның күнінде миникстен шабыттанған және торвальдтар мен андрусс арасындағы қызу және танымал пікірталас. моненитті ядродағы таненбаум және микро ядро.

      Сәлемдесу!

  2.   иллюки дижо

    Рахмет. Осы уақытқа дейін мен сіздің жазбаңызға көп көңіл бөлген емеспін, бірақ мен жобадамын, сондықтан оларды қарастырайын.
    Құттықтаулар.

  3.   жолшы дижо

    Айта кету керек, басқа тілдерді қолдануға болады, мысалы, Objective-C (++), C ++, D немесе Rust.

    1.    AdrianArroyoStreet дижо

      Бұл C емес, C ++ тілінде, бірақ айырмашылықтарды байқау қиын, өйткені көптеген C ++ операторлары кітапхананың қолдауын қажет етеді, мысалы, жаңа және жою операторлары. Rust-та операциялық жүйе жасау өте қызықты болар еді. Rust-та амалдық жүйелерге арналған IRC арнасы бар (# rust-osdev irc.mozilla.net сайтында). Машина кодын жасайтын кез-келген адам шынымен де оған лайық, егер біз GCJ-ді қолдансақ, Java-ны қосамыз.

      1.    жолшы дижо

        Ия, шындығында да, Rust операциялық жүйелер үшін өте қызықты тіл, өйткені оны үйрену C немесе C ++ тілдерінен гөрі оңай (ол әлі де үздіксіз өзгерістермен жалғасады, бірақ оңай), бірақ ол әлдеқайда қауіпсіз.

  4.   жолшы дижо

    70-ші жылдары ОЖ-сыз аппараттық құралдармен бағдарламалау әдетке айналды.

  5.   Кристофер дижо

    Өте жақсы ... енді мен түсінуім керек: 3 ...

  6.   MMM дижо

    Сәлем. Осы мақалаларыңыз үшін көп рахмет. Бірақ, егер бағдарламалау туралы білімім болмаса, мен оны істеуім керек деп ойламаймын, солай ма? Егер олай болмаса, бұл «жақсы болар еді, ал енді нені көшіріп, жапсырамын?» Деп айтамын ... қандай өкінішті, мен әрқашан бағдарламалауды білгім келді және ештеңе жасамаймын, мен есекпін!

    1.    десикодер дижо

      Өзіңді кінәлама, сен ешек емессің. Бастапқыда, барлық бағдарламашылар ядро ​​жазуды білмейді, бұл өте аз қарапайым тапсырма, ал іс жүзінде ол үлкенірек. Мысалы, мұнда автор пернетақта мен экранға арналған жалпы драйверлер жасайды, экран массивімен манипуляция жасайды, бұл әдіс бүгінде қолданылмайды. Қазіргі кезде Linux-дегі tty өте күрделі және олар x86 архитектурасына тәуелді емес, олардың экран массиві бар. Сонымен қатар, C кодының көп бөлігі архитектураға байланысты, өйткені идеал ассемблердегі архитектуралық кодты және кез-келген процессорда жұмыс істеуге арналған. Алайда, мен авторды кемітпеймін, өйткені ядро ​​біз линукс ядросында қазіргі кезде қалыпты деп санайтын сипаттамаларға ие болады, мысалы, бұл оңай мәселе емес, және сіз жалғыз адамның оны жасауға мүлдем қабілетсіз екеніне сенімді бола аласыз. Linux, gcc, glibc және т.с.с. сияқты үлкен жобаларды бір адам жасамайды, бірақ көптеген серіктестер бар.

      Сонымен қатар, егер сіз бағдарламалауды бастағыңыз келсе, Интернетте сізде бірнеше нұсқаулық бар, дегенмен сіз мұқият болыңыз және жақсы нұсқаулықтарды таңдаңыз. Мен бассейнге бассыз бас суға секіріп кіретін Linux-те бағдарламалауды бастадым (яғни сүйікті С тілімен), бірақ қазір менде питон туралы негізгі түсініктер бар (бұл да өте жақсы тіл). Сізде 6-бетте бас ауырғаннан бас тартатын кейбір С кітаптар бар, бірақ бұл кітаптардан гөрі тәжірибе арқылы алынған. Бұл OSI желілік моделіндегідей болады. Osi моделінің құжаттамасын жаңадан келген адам үшін түсіну мүлдем мүмкін емес, бірақ егер сіз желі қабаттарын жақсы түсіндіретін сайт тапсаңыз, онда сіз RFC сияқты техникалық құжаттармен жұмыс жасау үшін тез тұжырымдамалар аласыз.

      Бір сөзбен айтқанда, ол жерде жақсы веб-сайттар мен нұсқаулықтар бар, оған жету және жақсы материал табу керек.

      тілекпен

  7.   Бостандық дижо

    Сәлеметсіз бе, «қате: мультиботтық тақырып табылмады» дегенді шешуге тырысқаннан кейін. және «алдымен ядро ​​жүктеу керек», өйткені мен сияқты бірінші мақаланың мәселесін шешуді еш жерден таба алмадым ... міне, егер біреу үшін жұмыс жасаса ...

    Қатенің себебі туралы менің теориямның дұрыс екенін білмеймін, бірақ бәрібір мәселе, файлдарды 32 биттік операциялық жүйеде құрастыру кезінде қате туындамады, бірақ менде 64 биттік амалдық жүйе болғандықтан (Gnu / Linux Debian 7), және компиляциялау мен тестілеу кезінде менде «көп моторлы тақырып табылмады» деген қате пайда болды және күмән бар, сондықтан менің ойымша, бұл қате біз құрастыратын амалдық жүйенің қоршаған ортасына немесе архитектурасына байланысты файлдар ... және мен не істедім, 32 биттік ортаны немесе архитектураны көрсете отырып, файлдарымды жинақтадым.
    * sudo ретінде -o ядро.o -c ядро.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ақысыз -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -белгілеу
    Бір қызығы, менің күмәнім бар, хахаха, біз біртіндеп жасап жатқан амалдық жүйе x86 архитектурасына арналған немесе мен дұрыс емеспін ...

    PS: маған күмәндануға көмектесетін адам, орфографиялық қателіктерімді немесе жаман сөзімді кешіреді, мен кемелді емеспін, сондықтан «кемелдіктің бағасы бар» ... Ең бастысы, 32-биттік амалдық жүйеге еліктеу, қасиетті шешім … .Хахаха

    1.    Мартин Вильяба дижо

      Гений! Мен бұл оқулықты шынымен жасағым келді, басында мен сол қатемен кетіп қалдым хаха

  8.   Оскар дижо

    Құттықтаймыз, бұл керемет үлес. Бұдан былай сіздермен мен және басқалар арқылы сіздің жақсы жұмысыңыз кеңейтілетіндігімен бөлісемін;

    тілекпен

bool(шын)