【开坑】在mc里搞个操作系统!!!!!



楼主 savenseg  发布于 2019-05-02 21:22:00 +0800 CST  
这次的目标大概是在mc中的红石电脑上跑一个像样的操作系统。虽然可能咕咕咕,但还是会努力更新的!!!!!!!!!!!!!!!!!!!!!!!!

楼主 savenseg  发布于 2019-05-02 21:24:00 +0800 CST  
除此之外,这次的更主要目的是,希望可以在这个电脑上运行一些小游戏,比如麻将之类的。

楼主 savenseg  发布于 2019-05-02 21:25:00 +0800 CST  
而且这次不光是操作系统,计算机也要自己新做一个。
所以这次的目标大概是这样的:
设计一个计算机
在计算机上运行操作系统
在计算机上运行小游戏程序

楼主 savenseg  发布于 2019-05-02 21:27:00 +0800 CST  
但是说到底显示器分辨率还是个硬伤.....
所以楼主我决定采用一个分辨率很小的字体设计,不过大家如果设计出更小的也可以告诉楼主哦

楼主 savenseg  发布于 2019-05-02 21:28:00 +0800 CST  


楼主 savenseg  发布于 2019-05-02 21:29:00 +0800 CST  
其实操作系统的思路早就好了。他的结构大概是这样。

楼主 savenseg  发布于 2019-05-02 21:30:00 +0800 CST  
图片里面的操作系统是一个shell界面的传统操作系统(也就是大家熟知的黑白指令界面的操作系统)。这个计算机会街介入三个设备,分别是:
shell显示器
二维屏幕
键盘
_____________
其中里面的shell显示器是专门用来显示命令行的。
二位屏幕用来显示棋盘之类的程序界面。
键盘当然是作为用户的输入设备

楼主 savenseg  发布于 2019-05-02 21:34:00 +0800 CST  
然后就是计算机跟着三个外设的链接。。。。
shell显示器和二维屏幕都分别提供了一组ABI。供程序控制,这些ABI被放在内存里面,
当然以后可能直接改动到cpu里面也说不定。
键盘则比较特殊,它会把输入发送到cpu内部的IO寄存器里,这是为了程序更快访问用户输入。
并且键盘输入同时也可能会被转移到shell显示器,控制shell显示,这是为了降低shell显示器的刷新延迟

楼主 savenseg  发布于 2019-05-02 21:38:00 +0800 CST  
那个。。。大家如果有什么希望这个操作系统添加的功能都可以说出来,我可以考虑尽量实现

楼主 savenseg  发布于 2019-05-02 21:40:00 +0800 CST  
今天就先到这里好了

楼主 savenseg  发布于 2019-05-02 21:41:00 +0800 CST  
大家晚安哦

楼主 savenseg  发布于 2019-05-02 21:42:00 +0800 CST  


楼主 savenseg  发布于 2019-05-02 21:59:00 +0800 CST  
大家早上好啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
今天又是勤快的一天


楼主 savenseg  发布于 2019-05-03 08:09:00 +0800 CST  
昨天刚刚确定了整个操作系统的大体架构,那么今天就来具体定义一下这个操作系统的功能好了.


楼主 savenseg  发布于 2019-05-03 08:10:00 +0800 CST  
嗯....回到现在的正题。得开始涉及操作系统了.
首先操作系统的用户交互界面当然是钦定的shell界面。
用户通过shell输入指令与操作系统交互。
操作系统还需要实现文件系统,以方便用户在机上编程或者执行程序


总的来说,这个操作系统的架构大概是这样的:
内核 <———> Shell
还是比较简单的。


Shell的功能:
接受用户输入,并且在界面上显示.
分析并执行用户输入命令.执行将调用系统内核.


内核功能:
管理文件,创建进程,结束进程.


楼主 savenseg  发布于 2019-05-03 08:21:00 +0800 CST  
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


楼主 savenseg  发布于 2019-05-03 08:54:00 +0800 CST  
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


楼主 savenseg  发布于 2019-05-03 09:05:00 +0800 CST  
但是这样每输入一个字符就要等待数个时钟周期的设计实在反人类。
所以为了更加人性化,显然我们需要在键盘到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中取出数据。


楼主 savenseg  发布于 2019-05-03 09:20:00 +0800 CST  
在刚才提到的第二种中,有一个非常明显的确定:
CPU不能直接获得键盘的立即输入,
显然,只有用户摁下回车确定以后,输入流才会转入CPU中。
不过好在这个并不难补救,但是也会稍微复杂一些:
依旧为CPU提供IO寄存器,缓冲着用户键盘的即时输入,
只不过这个寄存器一般不会被shell程序使用罢了。




楼主 savenseg  发布于 2019-05-03 09:25:00 +0800 CST  

楼主:savenseg

字数:26214

发表时间:2019-05-03 05:22:00 +0800 CST

更新时间:2020-06-01 12:02:37 +0800 CST

评论数:575条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看