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

照着当前的指令集,试着写了下这个操作系统的核心部分,感觉真的简化的非常简单

楼主 savenseg  发布于 2019-05-16 03:55:00 +0800 CST  
那一天我又有了新的想法

楼主 savenseg  发布于 2019-05-17 04:12:00 +0800 CST  
何不为cpu提供一个新的关联存储器TABLE解决我的所有烦恼呢

楼主 savenseg  发布于 2019-05-17 04:13:00 +0800 CST  
比之前的设计要优秀很多

楼主 savenseg  发布于 2019-05-17 04:23:00 +0800 CST  
text用来实现io中的数据同步。而ram再也不用担心这种问题

楼主 savenseg  发布于 2019-05-17 04:25:00 +0800 CST  
今天在考虑之后,将寄存器数目调整为8个,并且将所有设备io用途的(内存io除外)寄存器全部归并到io接口上。现在寄存器只剩下了ip,acc,zero还有剩下的普通寄存器。

楼主 savenseg  发布于 2019-05-18 02:02:00 +0800 CST  
所以另一个重点就是降低io访问的延迟。另外table这个外设用来分析序列,肯定得提供数据本身,也许有几种办法:dma,一个一个提交,提交ptr还有长度然后table自己搜索内存弄到buf里。dma还是太麻烦了。先排除这个

楼主 savenseg  发布于 2019-05-18 03:29:00 +0800 CST  
也许可以私货加个内核态吗?好吧两秒就否定了,陷入内核太慢

楼主 savenseg  发布于 2019-05-18 03:40:00 +0800 CST  
现在等待io信号只能用text来轮询同步了。不过也只有三行代码,大概不会增加太多延迟。。。毕竟本来就很慢了。。。。

楼主 savenseg  发布于 2019-05-18 19:15:00 +0800 CST  
现在的指令集架构
—————————————————
ISAS
位宽:16bits
指令结构:
A:[ op8 ][ a4 ][ b4 ]
M:[ op8 ][ imm8 ]


%a,b是寄存器对象
%imm8是8bit立即数
%在指令执行写回阶段之前,就要求完成$ip<-$ip+1,以保证跳转指令对$ip的覆写值不会被自增偏移


运行环境
—————————————————
主要存储体
mem //支持[0b]~[1111 1111 1111 1111b]物理地址范围
io //支持[0b]~[1111 1111b]物理地址范围


寄存器组
$7~$0 //提供$7~$0八个寄存器
$flag


堆栈组
stk //栈,深度20
stk.spr //备用栈,深度20


—————————————————


寄存器组
—————————————————
$flag //不可操作
$ip //$7,程序计数器
$e~$a //$6~$2,常规的寄存器
$acc //$1,累加器,很多指令会操作它
$zero //$0,永远为0,即使被写入
—————————————————


标志位含义
—————————————————
标志位:CMF(2)


cmf = s.== 11 //在cmp运算中,a=b
cmf = s.>= 10 //在cmp运算中,a>b
cmf = s.<= 01 //在cmp运算中,a<b
cmf = s.u = 00 //未定义状态
—————————————————


寄存器操作指令(A,M)*17
—————————————————
adda,b//add的op为0000 0000,这意味着0000 0000 0000 0000含义是$0<-$0+$0,等价于nop
suba,b//$a<-$a-$b
anda,b
ora,b
nora,b
xora,b
mova,b//$a<-$b


cmpa,b//进行无符号比较,设置cmf


inca,-
deca,-
sla,b
sra,b


sjmp.+imm8
sjmp.-imm8


sjmp.+.=imm8//cmf==s.=
sjmp.+.>imm8//cmf==s.>
sjmp.+.<imm8//cmf==s.<
—————————————————


访存指令(A结构)*5
—————————————————
loada,mm[b]//$a<-mm[$b]
storea,mm[b]//mm[$b]<-$a


inio[imm8]//$acc<-io[imm8]
outio[imm8]//io[imm8]<-$acc
textio[imm8]//io[imm8]?cmf<-s.=:cmf<-s.<
—————————————————


访栈指令(A)*4
—————————————————
popa //pop($a)
pusha //push($a)
pop.sprb//spr.pop($a)
push.sprb//spr.push($a)
—————————————————


立即数指令(M)*2
—————————————————
imm.himm8//$acc_h<-imm8
imm.limm8//$acc_l<-imm8
—————————————————


控制指令*1(M)
—————————————————
stop-//关机
—————————————————


楼主 savenseg  发布于 2019-05-18 21:33:00 +0800 CST  
空格还是没了,郁闷,那还是截图吧


楼主 savenseg  发布于 2019-05-18 21:34:00 +0800 CST  
用了特别的截屏技巧



楼主 savenseg  发布于 2019-05-18 21:40:00 +0800 CST  
去掉text了,因为懒得实现


楼主 savenseg  发布于 2019-05-19 17:02:00 +0800 CST  
可能在实际设计中,会提供宽度更低的指令集,主要是为了压缩编码以减少存储器体积


楼主 savenseg  发布于 2019-05-19 17:15:00 +0800 CST  
考虑了一个8bits的压缩指令集,并且支持14bits范围的物理地址,
也许在实际中可以使用这个


楼主 savenseg  发布于 2019-05-19 20:39:00 +0800 CST  
应该还是够用的



楼主 savenseg  发布于 2019-05-19 20:43:00 +0800 CST  
text又回来了,不过是$a与1比较

楼主 savenseg  发布于 2019-05-20 03:34:00 +0800 CST  
延迟没救啊

楼主 savenseg  发布于 2019-05-20 10:07:00 +0800 CST  
alu




楼主 savenseg  发布于 2019-05-21 02:31:00 +0800 CST  
接了dualreadregisters后发现延迟已经翻倍了,可能1hz都达不到

楼主 savenseg  发布于 2019-05-21 08:46:00 +0800 CST  

楼主:savenseg

字数:26214

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

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

评论数:575条评论

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

 

热门帖子

随机列表

大家在看