签到

05月06日
尚未签到

共有回帖数 0

    小小小鱼儿

    等级:
    这里有简单的中断介绍(英文):
    http://ece.wpi.edu/~wrm/Courses/EE3803/Labs/roehrl.html
    这里有四个详细列表:
    http://www.htl-steyr.ac.at/~morg/pcinfo/hardware/interrupts/inte1at0.htm
    http://www.clipx.net/ng/rbrown/
    http://poli.cs.vsb.cz/misc/rbint/text/
    http://homepages.ius.edu/jfdoyle/c335/Html/Chapter9.htm

    这个是关于显示中断 10H 的
    http://www.uv.tietgen.dk/staff/mlha/PC/Prog/ASM/INT/INT10.htm

    小于 20H 的中断都是属于 BIOS 的。
    先假设你用 GNU 系列的工具,如 gcc 和 as。
    怎样保证汇编写出来的函数能被 C 正确调用呢,自己操作栈很麻烦的,我教你一个偷懒的方法(呵呵,这个我以前常用,很方便)
    首先:用 C 写个函数库,包括了你要实现的系统调用,这里假设只有两个函数 getch 和 putch,函数体除了 return 等语句,基本是空的:
    例子如下:
    /* Wuxiao.c */
    int getch()
    {
       return 0;
    }

    void putch(int ch)
    {
       int c = ch;
    }
    然后用 gcc 的编译功能,但记住要用 -S,即编译成汇编源码
    $gcc -S Wuxiao.c
    好了,gcc 已经把你的 C 函数调用中的栈操作帮你处理好了,不信你看看(产生的文件为 Wuxiao.s):
    现在看看 Wuxiao.s 内容:
    $cat Wuxiao.s
       .file    "gp.c"
       .text
    .globl getch
       .type    getch, @function
    getch:
       pushl    %ebp
       movl    %esp, %ebp
       movl    $0, %eax
       popl    %ebp
       ret
       .size    getch, .-getch
    .globl putch
       .type    putch, @function
    putch:
       pushl    %ebp
       movl    %esp, %ebp
       subl    $4, %esp
       movl    8(%ebp), %eax
       movl    %eax, -4(%ebp)
       leave
       ret
       .size    putch, .-putch
       .section    .note.GNU-stack,"",@progbits
       .ident    "GCC: (GNU) 3.3.5 (Debian 1:3.3.5-8)"
    movl    $0, %eax
    这句是设好返回值的。

    subl    $4, %esp
    movl    8(%ebp), %eax
    movl    %eax, -4(%ebp)
    这个就是 int c = ch; 这样你就有了一个怎么操作传递的参数的模板。
    在这个基础上,改成 BIOS 的中断调用,实现功能。

    改完了,用汇编器,汇编成机器码。
    $as Wuxiao.s -o Wuxiao.o
    这样,你的系统调用函数库就算是完成了��
    现在为这个系统库写一个头文件:
    /* My Sys Library */
    /* wuxiao.h       */
    #ifndef WUXIAO_LIB
    #define WUXIAO_LIB 0x0100
    int getch();
    void putch(int ch);
    #endif /* WUXIAO_LIB */
    好了,可以试用了,随便编一个:

    #include "wuxiao.h"
    int main()
    {
       int g;
       g = getch();
       putch(g);
       return 0;
    }
    存盘(假设叫 main.c)、编译、连接:
    $gcc main.c Wuxiao.o -o test
    运行:
    $./test
    如果一切顺利,那就恭喜你了,你实现了最基本的 I/O
    由于系统不同(debian linux),我这里没有测试。
    但我以前在 dos 下面经常用这招,没遇过问题。
    不知道课设要求怎么样,但基本的 I/O 没问题了,你就可以用 C 来编其他部分了。
    要是有兴趣,搞得完整点,再实现进程的调度,然后写个 shell,说不定你会成为中国的 linus。
    ---------------
    呵呵,要是真的想做,我想 assiss 会有兴趣的,
    就让他写个编译器,就叫 acc,哈哈,谁叫他数学比我好。shell 我来做,叫 8sh。
    内核由你搞定~~~~~~
    ---------------
    ~~~~以上是白日梦

    楼主 2016-03-16 13:07 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知