代码、内容参考来自于包括《操作系统真象还原》、《一个64位操作系统的设计与实现》以及《ORANGE’S:一个操作系统的实现》。
我们的系统还差个help命令
输出帮助信息,比如我们系统支持的命令
修改fs/fs.c
/* 显示系统支持的内部命令 */
void sys_help(void) {
printk("\
\
Welcome to DreamsOS! \n\
\n\
Available commands :\n\
ls: show directory or file information\n\
cd: change current work directory\n\
mkdir: create a directory\n\
rmdir: remove a empty directory\n\
rm: remove a regular file\n\
pwd: show current work directory\n\
ps: show process information\n\
clear: clear screen\n\
\n\
Example:\n\
mkdir dir\n\
\n\
Thank you for using DreamsOS!\n\
\n\
");
}
对应fs.h加入函数声明
void sys_help(void);
/lib/user/syscall.c
/* 显示系统支持的命令 */
void help(void) {
_syscall0(SYS_HELP);
}
/lib/user/syscall.h
enum SYSCALL_NR {
SYS_GETPID,
SYS_WRITE,
SYS_MALLOC,
SYS_FREE,
SYS_FORK,
SYS_READ,
SYS_PUTCHAR,
SYS_CLEAR,
SYS_GETCWD,
SYS_OPEN,
SYS_CLOSE,
SYS_LSEEK,
SYS_UNLINK,
SYS_MKDIR,
SYS_OPENDIR,
SYS_CLOSEDIR,
SYS_CHDIR,
SYS_RMDIR,
SYS_READDIR,
SYS_REWINDDIR,
SYS_STAT,
SYS_PS,
SYS_EXECV,
SYS_EXIT,
SYS_WAIT,
SYS_PIPE,
SYS_FD_REDIRECT,
SYS_HELP
};void help(void);
修改/userprog/syscall-init.c,加入syscall_table[SYS_HELP]
/* 初始化系统调用 */
void syscall_init(void) {
put_str("syscall_init start\n");
syscall_table[SYS_GETPID] = sys_getpid;
syscall_table[SYS_WRITE] = sys_write;
syscall_table[SYS_MALLOC] = sys_malloc;
syscall_table[SYS_FREE] = sys_free;
syscall_table[SYS_FORK] = sys_fork;
syscall_table[SYS_READ] = sys_read;
syscall_table[SYS_PUTCHAR] = sys_putchar;
syscall_table[SYS_CLEAR] = cls_screen;
syscall_table[SYS_GETCWD] = sys_getcwd;
syscall_table[SYS_OPEN] = sys_open;
syscall_table[SYS_CLOSE] = sys_close;
syscall_table[SYS_LSEEK] = sys_lseek;
syscall_table[SYS_UNLINK] = sys_unlink;
syscall_table[SYS_MKDIR] = sys_mkdir;
syscall_table[SYS_OPENDIR] = sys_opendir;
syscall_table[SYS_CLOSEDIR] = sys_closedir;
syscall_table[SYS_CHDIR] = sys_chdir;
syscall_table[SYS_RMDIR] = sys_rmdir;
syscall_table[SYS_READDIR] = sys_readdir;
syscall_table[SYS_REWINDDIR] = sys_rewinddir;
syscall_table[SYS_STAT] = sys_stat;
syscall_table[SYS_PS] = sys_ps;
syscall_table[SYS_EXECV] = sys_execv;
syscall_table[SYS_EXIT] = sys_exit;
syscall_table[SYS_WAIT] = sys_wait;
syscall_table[SYS_PIPE] = sys_pipe;
syscall_table[SYS_FD_REDIRECT] = sys_fd_redirect;
syscall_table[SYS_HELP] = sys_help;
put_str("syscall_init done\n");
}
修改/shell/buildin_cmd.c
/* 显示内建命令列表 */
void buildin_help(uint32_t argc UNUSED, char** argv UNUSED) {
help();
}
对应/shell/buildin_cmd.h加入函数声明
void buildin_help(uint32_t argc, char** argv);
最后在shell.c加入分支
} else if (!strcmp("help", argv[0])) {
buildin_help(argc, argv);
我们看看执行结果

整个系统如下:


到这里这个简易的操作系统已经完成了,我给他取名为Dreams,哈哈!

慷慨一下
在大一开学,虽然选择了软件工程专业,但是第一次接触电脑,根本不会用,当时电脑开机不用长按,都是同学告诉我的。
大一开学学C语言的时候,就对计算机有了兴趣。之后选择了java方向,开始学javaweb,ssm,springboot,springcloud,之后做了几个微服务项目,学一大堆的底层JVM、JUC以及第三方redis、消息中间件等等。
某一天突然就想好了毕业设计,畅想自己实现一个简易的操作系统,在这之上运行自己实现的简易的JVM,上面再来用我自己实现的spring和mybatis,可能说起来有一点绕。虽然早就有了这个想法,但是为了就业,也还是先学后端。
又学汇编,操作系统,经典书籍《深入理解计算机系统》,再次感谢B站,王道算入门了,哈工大李治军老师的就有接触代码,还不错。
到现在确实已经实现了手写操作系统、手写JVM、手写mybatis、手写spring、手写springMVC。
不过可惜的是由于从简单到困难,先实现手写mybatis、手写spring这些,再实现操作系统的,其实一开始就已经发现了,我实现的JVM是用GO写的,我实现的spring这些是用java写的,但是这个简易操作系统不可能支持的,不过还是全部实现了,我自己也是有一个目标的,那就是实现一个开源框架。
也算不负此行。
开学就大四了~~~~~~~~

参考
郑钢著操作系统真象还原
田宇著一个64位操作系统的设计与实现
丁渊著ORANGE’S:一个操作系统的实现


