[OS64][023]源码阅读:程序4-9 中断处理 : 显示黑底红字的中断向量号

学习笔记

使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171

源码结构

  • 配书代码包 :第4章 \ 程序 \ 程序4-9

程序4-9 运行结果

[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 运行结果

程序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);
}

  • 目前的中断处理函数就是 在屏幕上显示黑底红字的中断向量号0x20号中断是时钟中断
  • io_out8(0x20,0x20); : 向主8259A中断控制器发送EOI命令复位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,
    . . .
};
  • 函数指针的数组,输入值void返回值也是void的一类函数

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 等价于 EAX = value
  • outb %0, %%dx 在这里等价于 outb %ax, %dx, 向端口dx写入值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();
}
  • 外部硬件设备的中断向量号从32开始 : for(i = 32;i < 56;i++)
  • io_out8(0x20,0x11); 向端口0x20写入数值0x11

参考资料

  • 函数指针

[C指针]函数指针举例:C语言 完整源码
https://www.jianshu.com/p/992cbb3a55ce

  • ATT 内联汇编 格式

[内联汇编]扩展asm:格式、占位符、跳转、内联汇编宏函数
https://www.jianshu.com/p/76fda24ee7f7

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

[OS64位][019]源码阅读:程序4-5 i=1/0 除法错误
https://www.jianshu.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?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342