这个 topic 已经远超过 c_and_cpp 的范围了..囧
: → laughingman: 我知道syscall那行是呼叫system call handler,但是 08/21 23:33
: → laughingman: 是谁规定它呼叫谁的system call handler?因为start.s 08/21 23:34
: → laughingman: 看起来就像一般的MIPS组语,为什么这边的syscall就是 08/21 23:35
: → laughingman: 连到Nachos中的exception.cc写的system call handler 08/21 23:36
: → laughingman: ,而不是连到MIPS真正的system call handler?是因为 08/21 23:37
为什么你会觉得 exception.cc 里的 syscall handler 不是真正的
syscall handler? 你所谓的 syscall handler 是什么?
建议先多翻翻书建立背景知识, 有些东西就算是资工系的没有真的用过也只是背课文
1. 算盘本 Computer Organization and Deisng
看 The Processor 那章的 Exception.
不过这理的解释很篇 hardware design
2. Understanding the Linux Kernel 和 Linux Kernel Development
两本都有 System call 章节, 建翻去借书翻一翻
3. 去找 MIPS Architecture For Programmers, 是官发的开发文件,
有很多本, 要找 Privileged Resouce Architecture 那份
Syscall 通常的流程是.. (我也没做过 MIPS 的, 不过大家大同小异)
1. user mode code 用 syscall 指令触发 syscall exception (start.s 的Print)
2. CPU 依 exception vector table 查表对应的 handler 位置
vector 位置与 handler 应该是在 boot 时自已设的, 你应该 trace 一开
start code
3. 跳 syscall handler. 这里通常还会是 assmebly code 写的,
要保留 user mode code 的所有 context, 例如 general purpose registers
4. 再转跳到比较好写的 C code handler, 就是你在改的 exception.cc
如果你在改的那本 exception.cc 就是长这样,
https://github.com/echoz/NTUSCE/blob/master/CSC205/userprog/exception.cc
那这个做法就是所有 context 存完直接跳 ExceptionHandler, 由这里判断是哪
个 exception (syscall 只是其中一个)
建以上提到的东西你都自已 trace 和读过再来继续问, 不然你就白问了
: → laughingman: 组译器不同的关系吗?抱歉我的问题都很笨orz 08/21 23:38
: → laughingman: 还有照我google mips syscall abi的结果,我知道mips 08/21 23:40
: → laughingman: 会照$v0中的值来决定要呼叫哪个system call handler 08/21 23:41
: → laughingman: 那Nachos是哪边规定的呢?因为我看Nachos中的1是表示 08/21 23:42
哪边规定你应该去问老师, 或找 Nachos 的文件, 这些都要明定才能实作
不知道课程和你对自已的要求到什么层度, 就算没有文件,
你可以多看看 assembly code 把两边串起来