İntel 8086 de kesme vektörü?

Başlatan Seferi, 03 Ağustos 2012, 20:14:54

Seferi

İyi günler. Konuyu uygun yere mi açtım bilemedim, yanlış bölgede ise kusura bakmayın.
Daha önceden iyi kötü pic ile ilgili biraz bilgim var. Şimdi mikroişlemci öğrenmeye başlayınca iş  değişti, bana bayağı farklı geldi, bazı şeyleri tam kavrayamıyorum. Ve onlardan biri olan şu soruyu sizlere sormak istedim: Okuduğum bi nottan alıntı yaparak sorayım "Kesme vektörü, mikroişlemci gerçek modda (real mode) çalışırken, hafızanın ilk 1024 byte'lık alanında (00000h-003FFh) saklıolan 4 byte'lık bir adrestir. Dolayısıyla 256 farklıkesme vektörübulunur. İlk 32 kesme vektörü(0-31) 8086-80486 ve daha sonraki işlemciler için ayrılmıştır. Geriye kalan kesme vektörleri (32-355) kullanıcıiçindir."
Şimdi benim anlamadığım bu 8086 mikroişlemcide başlangıçta bir hafıza birimi yok galiba, ee o zaman bu ilk 32 kesme vektöründeki adreslere kesme programlarını kim yazacak? Hafıza birimini biz ekliyorsak?
(Not:Sorum belki saçmadır , belki yanlış da soruyor olabilirim lütfen kusura bakmayın)

z

0000:0000 adresine ram ekliyoruz. Power on resette zaten CPU rami initialize ediyor ve firmware int vector adreslerini rama yerlestiriyor. Ilgili int rutinleri gene firmware icinde oluyor.

Kullanici kendi programini hatta kendi interrupt programlarini rama yerlestiriyor ardindan int vector adres alanindaki adresleri kendi programlarina yonlendirecek adresleriyaziyor.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

#2
Aslında bu vektörlerin 0-31 arası olanına BIOS Interrupt vektörleri de diyebiliriz. Detaylı Interrupt listesi için bakınız;
Ralph Brown Interrupt List

Yani bunlar BIOS kodu tarafından yürütülen interruptlar.  Tabi sonradan kullanıcı tarafından modifiye edilebilirler. Zaten DOS virüsleri de bu şekilde hayat bulmuştur. Hatta bir nevi multitasking bile. :) CPU başlar başlamaz BIOS kodunu yükler ve işletir. Bu işlem Base memory de real mod da gerçekleşir ki bu memory 640KB' tır. Sonrasında gerekli POST işlemleri ve genişletilmiş bellek ayarlamaları gibi donanımsal işleri yürütür. Yani BIOS kodu aslında bu iş için var. Boşuna "Basic Input Output system" demiyoruz.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Seferi

Alıntı yapılan: z - 03 Ağustos 2012, 20:33:19
0000:0000 adresine ram ekliyoruz. Power on resette zaten CPU rami initialize ediyor ve firmware int vector adreslerini rama yerlestiriyor. Ilgili int rutinleri gene firmware icinde oluyor.

Kullanici kendi programini hatta kendi interrupt programlarini rama yerlestiriyor ardindan int vector adres alanindaki adresleri kendi programlarina yonlendirecek adresleriyaziyor.

Hocam tam olarak anlamadım.  Şimdi 0000:0000 adresine ram ekledik burası tamam ama buraya vektör adreslerini neresinden yerleştirecek?   Firmware nerede bulunuyor?

z

#4
8086 vs ile bir kart yaptığında bu kartın üzerinde RAM ve Flash (yada eprom vs) olacak. Flasda senin firmware var.

Flash üzerine  yazdığın programı yerleştireceksin. Reset ile flashdaki kodların koşmaya başlayacak. Bu aşamada RAM daki vektör tablosunun içeriğini senin flash romdaki kodların  belirleyecek. 8086 ya elveda diyeli çok zaman oldu.  Şu anda emin değilim ama 0 adresine Ram değil de Rom yerleştirirsen de sistemin işlemesi  lazım. Bu durumda vektörler değiştirilemez romdaki değerler ne ise öyle kalır.

PC de olaylar; reset ile flashdaki kodlar koşmaya başlar. Flashda BIOS denen Basic I/O System  rutinler bulunur. Bu rutinler çevre birimlerini init eder rama vectör adreslerini yerleştirir. En son aşamada işletim sistemini yükleyecek boot programını çağırır.

8086 daki vektörleri PIC 16 serisinden ayıran, PIC işlemcide vektörler fix adreslerken, 8086 da fix adreslerde (RAM da) fakat bu fix adreslerde saklı verilerdir.

Atıyorum Ramın 0. adresine 0xF000 ve 0xE000 yazarsan bu vektöre ait int oluştuğuda ve PIC (Programmable Int Controller) buna izin verdiyse E000:F000 adresine dallanılır. (Yukarıdaki örnekte segment adresi ile temel adresin sıralamasını karıştırmış olabilirim ama mantık böyle.)


Mesela  INT 0 programını vector alanına yerleştirmek için

MOV AX,0
PUSH AX
POP  DS
MOV BX,0
LEA AX,INT Adresin
MOV [BX],AX
LEA AX,INT Segment Adresin
ADD BX,2
MOV [BX],AX

tarzında bir kod ile int 0 ın segment ve temel adresini değiştirebilirsin. (Dediğim gibi sıralamayı unuttum önce adres sonra segmentti galiba)
Tabiki bu tip vectör değişim işleri çok kritik işler olduğu için bu kodun başında ve sonunda CLI ve STI ile önce intları disable sonra da enable yapmalısın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

#5
Mesela INT3 INT4 INT8(INT1C) gibi interruptlar işlemci tarafından sıkça çağrılabilir. INT8 saniyede 18.2 kez çağrılır mesela.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

esensoy

konu dışı olacak ama pc açılırken POST mesajlarını basıyor pci dan,
Hatta arıza tespit kartları da numaralarla ilgili durumu bildiriyor,
bu mesajlar hangi adresten, ne şekilde basılıyor bilen var mı?
En tehlikeli an "zafer" anıdır.

diot

@emresensoy

post mesajları 0x80 nolu adresten çıkar . Bu tür 8086 ailesi ile ilgili ayrıntılı bilgileri Nortonun 8086 diye bir kitabı var orada bulursun.  IBM pc  donanımı ile ilgili bütün bilgiler ve interrupt adresleri ve açıklamaları hepsi bu kitapda var. 1987 de almıştım galiba bu kitabı tam anlamıyla pc için bir hazine arayıp bulun.

Seferi

O halde 8086 ile bir kart yapacak olsak ve buna rom da biz takacaksak, ilk 1024 byte kesme vektörü için ayrılacak diye bir kaide yok mu? Kesmeyi ilk roma yazılan program mı belirliyor?  İlk 1024 byte kesme için ayrılmış derken, onların tasarladığı 8086 lı bir kart için mi geçerli?

z

1) kartina rom takacaksin

Romun muhakkak FFFF0 adresini kapsayacak.
Boylece Reset ruktinine ziplayabileceksin.

Bu romu Istersen 00000 - 003FF e kadar uzatabilirsin. Bu durumda int vectorlerini degistirilemez sekilde roma gomebilirsin.

2) Kartina bir de ram takacaksin. Ramin baslangic adresini 00000 secersen int vector tablonu yazilimla degistirebilir hale getirirsin.

Kafa karistiracak hic bir sey yok. Roma istersen dogrudan uygulama kodlarini yazabilirsin. 

Hatta PC kartini isletim sistemi yuklemeden hdd vs kullanmadan da kullanabilirsin.

bunun icin bir roma kodlarini yazip yuklemen yeterli. bu romu busa ilistirmen yeterli.

Romun fiziksel adresi icin ozel adresler belirlenmis durumda. birde romun basina bir imza atman gereekiyor.

bu durumda PC resetlendiginde BIOS isletimsistemi arastirmasina gecmeden once BIOSun uzatilmis kodlari olup olmadigini sinamak icin ozel adreeslerde imza arar. Senin romdaki imzayi yakalayinca da romundaki kodlari isletir.
boylece PC kartini mikroislemci karti gibi kullanabilirsin.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Eger 8086 ile calisacaksan bosuna rom ram vs ile ugrasma.

80186 ailesine goz at. Rom, ram, PIC, timer, IOPORT tek cipte mevcut.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Evet  dokumana bakinca hatirladim. Rom ve Ram icin hazir CS sinyalleri cikartiyordu.
gene de 8086 yerine tercih edillmeli. Tum cevre birimlerini barindiriyor.

bu islemciden aldigim tadi hic bir islemciden almadim.

http://www.datasheetcatalog.org/datasheet/Intel/mXuyuqy.pdf
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Seferi

Yardımlarınız için çok teşekkür ederim. Amacım kart tasarlamak değil, olayı tam kavrayamadığım için mantığını anlamaya çalışıyorum. 8086 için sormamın sebebi mikroişlemci dersinde 8086 baz alınarak ders işliyorduk da o yüzden.
Şimdi mesela program kodları işlerken sıfıra bölme hatası oldu, bunu gören 8086 kesme vektörünün ilkine gitti (INT0'a), buradaki adersi CS:IP sine yerleştirdi şimdide oraya gitti,   burada INT0'a adresi ben mi yerleştiriyorum?