[OS64][023]源碼閱讀:程序4-9 中斷處理 : 顯示黑底紅字的中斷向量號(hào)

學(xué)習(xí)筆記

使用教材(配書(shū)源碼以及使用方法)
《一個(gè)64位操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》
http://www.ituring.com.cn/book/2450
http://www.reibang.com/p/28f9713a9171

源碼結(jié)構(gòu)

  • 配書(shū)代碼包 :第4章 \ 程序 \ 程序4-9

程序4-9 運(yùn)行結(jié)果

[anno@localhost bootloader]$ make
nasm boot.asm -o boot.bin
nasm loader.asm -o loader.bin
[anno@localhost kernel]$ make
gcc -E  head.S > head.s
as --64 -o head.o head.s
gcc -E  entry.S > entry.s
as --64 -o entry.o entry.s
gcc  -mcmodel=large -fno-builtin -m64 -c main.c
gcc  -mcmodel=large -fno-builtin -m64 -c printk.c
gcc  -mcmodel=large -fno-builtin -m64 -c trap.c
gcc  -mcmodel=large -fno-builtin -m64 -c memory.c
gcc  -mcmodel=large -fno-builtin -m64 -c interrupt.c
ld -b elf64-x86-64 -z muldefs -o system head.o entry.o main.o printk.o trap.o memory.o interrupt.o -T Kernel.lds 
objcopy -I elf64-x86-64 -S -R ".eh_frame" -R ".comment" -O binary system kernel.bin

[anno@localhost 4-9]$ ls
bochsrc  boot.img  bootloader  kernel  media

[anno@localhost 4-9]$ sudo mount boot.img media -t vfat -o loop
[anno@localhost 4-9]$ sudo cp bootloader/loader.bin media
[anno@localhost 4-9]$ sync
[anno@localhost 4-9]$ sudo cp bootloader/boot.bin media
[anno@localhost 4-9]$ sync
[anno@localhost 4-9]$ sudo cp kernel/kernel.bin media
[anno@localhost 4-9]$ sync

[anno@localhost 4-9]$ bochs -f ./bochsrc


程序4-9 運(yùn)行結(jié)果

程序4-9 源碼閱讀

代碼清單 4-84 interrupt.c

#define IRQ_NAME2(nr) nr##_interrupt(void)
#define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr)

#define Build_IRQ(nr)                           \
void IRQ_NAME(nr);                      \
__asm__ (   SYMBOL_NAME_STR(IRQ)#nr"_interrupt:     \n\t"   \
            "pushq  $0x00               \n\t"   \
            SAVE_ALL                    \
            "movq   %rsp,   %rdi            \n\t"   \
            "leaq   ret_from_intr(%rip),    %rax    \n\t"   \
            "pushq  %rax                \n\t"   \
            "movq   $"#nr", %rsi            \n\t"   \
            "jmp    do_IRQ  \n\t");

  • nr = 0x20舉例:
    IRQ_NAME(0x20) => void IRQ0x20_interrupt(void); 之后是asm部分代碼
    SYMBOL_NAME_STR(IRQ)#nr"_interrupt: => IRQ0x20_interrupt:
    "movq $"#nr", %rsi => movq $0x20, %rsi

代碼清單4-87 interrupt.c

void do_IRQ(unsigned long regs,unsigned long nr)    //regs:rsp,nr
{
    color_printk(RED,BLACK,"do_IRQ:%#08x\t",nr);
    io_out8(0x20,0x20);
}

  • 目前的中斷處理函數(shù)就是 在屏幕上顯示黑底紅字的中斷向量號(hào)僻造,0x20號(hào)中斷是時(shí)鐘中斷
  • io_out8(0x20,0x20); : 向主8259A中斷控制器發(fā)送EOI命令復(fù)位ISR寄存器

代碼清單4-85 interrupt.c

Build_IRQ(0x20)
Build_IRQ(0x21)
Build_IRQ(0x22)
Build_IRQ(0x23)
. . .


void (* interrupt[24])(void)=
{
    IRQ0x20_interrupt,
    IRQ0x21_interrupt,
    IRQ0x22_interrupt,
    IRQ0x23_interrupt,
    . . .
};
  • 函數(shù)指針的數(shù)組,輸入值void返回值也是void的一類(lèi)函數(shù)

lib.h

inline void io_out8(unsigned short port,unsigned char value)
{
    __asm__ __volatile__(   "outb   %0, %%dx    \n\t"
                "mfence         \n\t"
                :
                :"a"(value),"d"(port)
                :"memory");
}
  • 占位符 %0 等價(jià)于 EAX = value
  • outb %0, %%dx 在這里等價(jià)于 outb %ax, %dx坪仇, 向端口dx寫(xiě)入值ax

代碼清單4-86 interrupt.c

void init_interrupt()
{
    int i;
    for(i = 32;i < 56;i++)
    {
        set_intr_gate(i , 2 , interrupt[i - 32]);
    }

    color_printk(RED,BLACK,"8259A init \n");

    //8259A-master  ICW1-4
    io_out8(0x20,0x11);
    io_out8(0x21,0x20);
    io_out8(0x21,0x04);
    io_out8(0x21,0x01);

    //8259A-slave   ICW1-4
    io_out8(0xa0,0x11);
    io_out8(0xa1,0x28);
    io_out8(0xa1,0x02);
    io_out8(0xa1,0x01);

    //8259A-M/S OCW1
    io_out8(0x21,0x00);
    io_out8(0xa1,0x00);

    sti();
}
  • 外部硬件設(shè)備的中斷向量號(hào)從32開(kāi)始 : for(i = 32;i < 56;i++)
  • io_out8(0x20,0x11); 向端口0x20寫(xiě)入數(shù)值0x11

參考資料

  • 函數(shù)指針

[C指針]函數(shù)指針舉例:C語(yǔ)言 完整源碼
http://www.reibang.com/p/992cbb3a55ce

  • ATT 內(nèi)聯(lián)匯編 格式

[內(nèi)聯(lián)匯編]擴(kuò)展asm:格式栏笆、占位符、跳轉(zhuǎn)做入、內(nèi)聯(lián)匯編宏函數(shù)
http://www.reibang.com/p/76fda24ee7f7

  • _set_gate 格式化IDT描述符并填入IDT表

[OS64位][019]源碼閱讀:程序4-5 i=1/0 除法錯(cuò)誤
http://www.reibang.com/p/e14045176526

  • MFENCE — Memory Fence

https://www.felixcloutier.com/x86/mfence
Does it make any sense to use the LFENCE instruction on x86/x86_64 processors?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冒晰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子竟块,更是在濱河造成了極大的恐慌壶运,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浪秘,死亡現(xiàn)場(chǎng)離奇詭異蒋情,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)耸携,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)棵癣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人夺衍,你說(shuō)我怎么就攤上這事狈谊。” “怎么了沟沙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵的畴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我尝胆,道長(zhǎng)丧裁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任含衔,我火速辦了婚禮煎娇,結(jié)果婚禮上二庵,老公的妹妹穿的比我還像新娘。我一直安慰自己缓呛,他們只是感情好催享,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著哟绊,像睡著了一般因妙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上票髓,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天攀涵,我揣著相機(jī)與錄音,去河邊找鬼洽沟。 笑死以故,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裆操。 我是一名探鬼主播怒详,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼踪区!你這毒婦竟也來(lái)了昆烁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缎岗,失蹤者是張志新(化名)和其女友劉穎静尼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體密强,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茅郎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年蜗元,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了或渤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奕扣,死狀恐怖薪鹦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惯豆,我是刑警寧澤池磁,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站楷兽,受9級(jí)特大地震影響地熄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芯杀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一端考、第九天 我趴在偏房一處隱蔽的房頂上張望雅潭。 院中可真熱鬧,春花似錦却特、人聲如沸扶供。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)椿浓。三九已至,卻和暖如春闽晦,著一層夾襖步出監(jiān)牢的瞬間扳碍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工尼荆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留左腔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓捅儒,卻偏偏與公主長(zhǎng)得像液样,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巧还,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355