关于操作系统:从零开始写-OS-内核-运行-shell
系列目录序篇筹备工作BIOS 启动到实模式GDT 与保护模式虚拟内存初探加载并进入 kernel显示与打印全局描述符表 GDT中断解决虚拟内存欠缺实现堆和 malloc第一个内核线程多线程运行与切换锁与多线程同步进入用户态过程的实现零碎调用简略的文件系统加载可执行程序键盘驱动运行 shellshell 命令行这是本系列最初一篇了,为这个 OS 加一个用户界面 shell,这算是 Linux 编程中最入门的经典教科书我的项目了,网上也能够找到很多小教程。这里也不多浪费时间,仅展现一下它的外围局部: void print_shell() { printf("bash> ");}while (1) { print_shell(); while (1) { int32 c = read_char(); if (c == '\n') { run_program(); break; } else if (c < 128) { printf(c); }}shell 实质上只是一个壳,正如它的名字,它提供一个和用户交互的命令行界面,不停地期待用户输出字符并反馈打印进去;一旦用户按下了回车键,那么示意须要运行之前输出的命令行,这在 run_program 函数里实现: void run_program() { // Parse cmd and get program and args. // .. // (fork + exec) new prgoram. int32 pid = fork(); if (pid < 0) { printf("fork failed"); } else if (pid > 0) { // parent int32 status; wait(pid, &status); } else { // child int32 ret = exec(program, args_index, (char**)args); exit(ret); }}这里首先 parse 用户方才敲回车之前输出的命令行字符串,解析出可执行程序名,以及参数。而后就是经典的 fork + exec 组合,运行这个程序。程序名和参数都会被传递到 exec 零碎调用的处理函数 process_exec,那里会从磁盘上读取该用户可执行文件并执行。这里命令行输出的程序名都很简略,也没有什么门路的概念,因为咱们应用的 naive_fs 只有一层构造,所有文件全在顶层,所以间接用文件名就能够了。 ...