【开坑】在mc里搞个操作系统!!!!!
这次的目标大概是在mc中的红石电脑上跑一个像样的操作系统。虽然可能咕咕咕,但还是会努力更新的!!!!!!!!!!!!!!!!!!!!!!!!
而且这次不光是操作系统,计算机也要自己新做一个。
所以这次的目标大概是这样的:
设计一个计算机
在计算机上运行操作系统
在计算机上运行小游戏程序
所以这次的目标大概是这样的:
设计一个计算机
在计算机上运行操作系统
在计算机上运行小游戏程序
但是说到底显示器分辨率还是个硬伤.....
所以楼主我决定采用一个分辨率很小的字体设计,不过大家如果设计出更小的也可以告诉楼主哦
所以楼主我决定采用一个分辨率很小的字体设计,不过大家如果设计出更小的也可以告诉楼主哦
图片里面的操作系统是一个shell界面的传统操作系统(也就是大家熟知的黑白指令界面的操作系统)。这个计算机会街介入三个设备,分别是:
shell显示器
二维屏幕
键盘
_____________
其中里面的shell显示器是专门用来显示命令行的。
二位屏幕用来显示棋盘之类的程序界面。
键盘当然是作为用户的输入设备
shell显示器
二维屏幕
键盘
_____________
其中里面的shell显示器是专门用来显示命令行的。
二位屏幕用来显示棋盘之类的程序界面。
键盘当然是作为用户的输入设备
然后就是计算机跟着三个外设的链接。。。。
shell显示器和二维屏幕都分别提供了一组ABI。供程序控制,这些ABI被放在内存里面,
当然以后可能直接改动到cpu里面也说不定。
键盘则比较特殊,它会把输入发送到cpu内部的IO寄存器里,这是为了程序更快访问用户输入。
并且键盘输入同时也可能会被转移到shell显示器,控制shell显示,这是为了降低shell显示器的刷新延迟
shell显示器和二维屏幕都分别提供了一组ABI。供程序控制,这些ABI被放在内存里面,
当然以后可能直接改动到cpu里面也说不定。
键盘则比较特殊,它会把输入发送到cpu内部的IO寄存器里,这是为了程序更快访问用户输入。
并且键盘输入同时也可能会被转移到shell显示器,控制shell显示,这是为了降低shell显示器的刷新延迟
大家早上好啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
今天又是勤快的一天
今天又是勤快的一天
嗯....回到现在的正题。得开始涉及操作系统了.
首先操作系统的用户交互界面当然是钦定的shell界面。
用户通过shell输入指令与操作系统交互。
操作系统还需要实现文件系统,以方便用户在机上编程或者执行程序
总的来说,这个操作系统的架构大概是这样的:
内核 <———> Shell
还是比较简单的。
Shell的功能:
接受用户输入,并且在界面上显示.
分析并执行用户输入命令.执行将调用系统内核.
内核功能:
管理文件,创建进程,结束进程.
首先操作系统的用户交互界面当然是钦定的shell界面。
用户通过shell输入指令与操作系统交互。
操作系统还需要实现文件系统,以方便用户在机上编程或者执行程序
总的来说,这个操作系统的架构大概是这样的:
内核 <———> Shell
还是比较简单的。
Shell的功能:
接受用户输入,并且在界面上显示.
分析并执行用户输入命令.执行将调用系统内核.
内核功能:
管理文件,创建进程,结束进程.
Shell的逻辑大致应该是这样的,上伪代码:
loop:
get(input) //获得下一个字符,input是内置的io寄存器
if(Input = ascii::enter)//如果是回车
shell.abi.newline() //控制shell显示器换行
call interpreter //调用解释器分析命令
//当call interpreter执行后,控制流转移到interpreter
if(Input = ascii::backspace)//如果是空格
shell.abi.backspace() //控制shell显示器输入行回退一个字符
pop R0 //R0是寄存器,但读出值永远为0
goto:loop
if(shell.state.full != TRUE)//如果shell输入行没满
shell.abi.print( input ) //在输入行打印字符
push input
goto:loop
loop:
get(input) //获得下一个字符,input是内置的io寄存器
if(Input = ascii::enter)//如果是回车
shell.abi.newline() //控制shell显示器换行
call interpreter //调用解释器分析命令
//当call interpreter执行后,控制流转移到interpreter
if(Input = ascii::backspace)//如果是空格
shell.abi.backspace() //控制shell显示器输入行回退一个字符
pop R0 //R0是寄存器,但读出值永远为0
goto:loop
if(shell.state.full != TRUE)//如果shell输入行没满
shell.abi.print( input ) //在输入行打印字符
push input
goto:loop
loop:
get(input);~~~~~~~~~~~~~~~//获得下一个字符,input是内置的io寄存器
if(Input = ascii::enter)~~~~~~//如果是回车
{
shell.abi.newline();~~~~~~~~~//控制shell显示器换行
call interpreter;~~~~~~~~~~~//调用解释器分析指令
~~~~~~~~~~~~~~~~~~~~~//call interpreter执行后控制流转移interpreter
}
if(Input = ascii::backspace)~~//如果是空格
{~~//如果是空格
shell.abi.backspace();~~~~~~//控制shell显示器输入行回退一个字符
pop R0;~~~~~~~~~~~~~~~~~//R0是寄存器,但读出值永远为0
goto:loop
}
if(shell.state.full != TRUE)~~~~//如果shell输入行没满
{
shell.abi.print(input);~~~~~~~~//在输入行打印字符
push input;
}
goto:loop
get(input);~~~~~~~~~~~~~~~//获得下一个字符,input是内置的io寄存器
if(Input = ascii::enter)~~~~~~//如果是回车
{
shell.abi.newline();~~~~~~~~~//控制shell显示器换行
call interpreter;~~~~~~~~~~~//调用解释器分析指令
~~~~~~~~~~~~~~~~~~~~~//call interpreter执行后控制流转移interpreter
}
if(Input = ascii::backspace)~~//如果是空格
{~~//如果是空格
shell.abi.backspace();~~~~~~//控制shell显示器输入行回退一个字符
pop R0;~~~~~~~~~~~~~~~~~//R0是寄存器,但读出值永远为0
goto:loop
}
if(shell.state.full != TRUE)~~~~//如果shell输入行没满
{
shell.abi.print(input);~~~~~~~~//在输入行打印字符
push input;
}
goto:loop
但是这样每输入一个字符就要等待数个时钟周期的设计实在反人类。
所以为了更加人性化,显然我们需要在键盘到io寄存器之间架一个缓冲器buffer,
来实现人类友好的设计。甚至可以直接通过硬件硬接shell显示器与键盘,毫无疑问这样是最快的。
现在尚不确定应该选择哪个方案,但是这两种设计都并不复杂,所以在这里可以一并讨论:
加入buffer的方案1:
键盘的所有输入都会被顺序缓冲到buffer中,
每当cpu执行一次get(input),就会从buffer的头上取下一个输入处理,
如果buffer是空闲的,那就让get(input)等待到出现有效输入为止.
硬接的方案2:
键盘输入直接硬接到shell显示器上,
显示器同样为输入提供一个bufferA,以顺序接收键盘输入。
输入行会直接以字符形式显示bufferA中的数据。
当shell显示器模块检测到用户输入为backspace时,执行backspace()
检测到输入enter时,将buffer中的数据提交到CPU内部的另一个缓冲器bufferB中,
并且调用解释器interpreter,同时执行newline()换行.
解释器interpreter会通过特殊指令"Fetch"从bufferB中取出数据。
所以为了更加人性化,显然我们需要在键盘到io寄存器之间架一个缓冲器buffer,
来实现人类友好的设计。甚至可以直接通过硬件硬接shell显示器与键盘,毫无疑问这样是最快的。
现在尚不确定应该选择哪个方案,但是这两种设计都并不复杂,所以在这里可以一并讨论:
加入buffer的方案1:
键盘的所有输入都会被顺序缓冲到buffer中,
每当cpu执行一次get(input),就会从buffer的头上取下一个输入处理,
如果buffer是空闲的,那就让get(input)等待到出现有效输入为止.
硬接的方案2:
键盘输入直接硬接到shell显示器上,
显示器同样为输入提供一个bufferA,以顺序接收键盘输入。
输入行会直接以字符形式显示bufferA中的数据。
当shell显示器模块检测到用户输入为backspace时,执行backspace()
检测到输入enter时,将buffer中的数据提交到CPU内部的另一个缓冲器bufferB中,
并且调用解释器interpreter,同时执行newline()换行.
解释器interpreter会通过特殊指令"Fetch"从bufferB中取出数据。
在刚才提到的第二种中,有一个非常明显的确定:
CPU不能直接获得键盘的立即输入,
显然,只有用户摁下回车确定以后,输入流才会转入CPU中。
不过好在这个并不难补救,但是也会稍微复杂一些:
依旧为CPU提供IO寄存器,缓冲着用户键盘的即时输入,
只不过这个寄存器一般不会被shell程序使用罢了。
CPU不能直接获得键盘的立即输入,
显然,只有用户摁下回车确定以后,输入流才会转入CPU中。
不过好在这个并不难补救,但是也会稍微复杂一些:
依旧为CPU提供IO寄存器,缓冲着用户键盘的即时输入,
只不过这个寄存器一般不会被shell程序使用罢了。