免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: MJK2012
打印 上一主题 下一主题

[自制操作系统研究]分享一下, 我为什么想要做一个操作系统. 细节. [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-03-15 13:23 |只看该作者
本帖最后由 MJK2012 于 2012-03-15 13:24 编辑

回复 9# linuxfellow



在嵌入式领域, 这些Context与如何决定下一步怎样做, 好像就被成为 '状态机' 方案.


而不适用callback, 用大函数调用小函数,按顺序一步一步编写代码并执行的模式, 就叫streamline的方式,  

比起状态机方案.  streamline更直观, 更加符合一个人对过程先后顺序的理解.


新的异步模式解决了streamline的等待机制问题,

主要方式, 是让语法的方式去构造特殊的自动包含上下文的'callback', 本质是异步的, 但是编程方法却是streamline

可以参考一下这个文章.
http://msdn.microsoft.com/zh-cn/magazine/hh456401.aspx

论坛徽章:
0
12 [报告]
发表于 2012-03-15 13:32 |只看该作者
回复 10# linuxfellow


呵呵. 只是研究一下如何实现这个系统而已.

这个系统是可伸缩的嘛.

对于家电应用, 完全不需要那么夸张的多任务能力..


而这个系统适合智能家电, 是因为它的单核心进程的设计方案 .

主程序与内核编译在一起,  这种模式介乎于 RTOS 与 常规意义的Linux


只不过我在研究的过程中, 发现了很多新的想法.

智能家电应用, 只是一个切入点, 避开Windows/Linux的锋芒.


发展到一定阶段后, 服务器应用是一个很大的前景.

系统能够承载任意的程序, 不怕担心它的线程数量导致系统承受不了 ,

而我也打算加入各种可控制的服务器使用量统计, CPU,内存,网络流量 等等. 很适合做PAAS应用.



论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
13 [报告]
发表于 2012-03-15 15:05 |只看该作者
回复 1# MJK2012

>>>1 - 基于内存分页, 却以ring0单进程为主要应用. (可以运行多个ring3进程, 但那只是后话.)
>>>2 - 主进程与内核完全融合在一起, 不需要中断或sysenter进行系统调用. (但其他ring3进程要)

这跟一个只运行在内核态的内核线程有何区别?这跟内存分页有何冲突,为什么后面说“却”?


>>>3 - 可作为 RTOS(实时操作系统) 来使用 , 允许实时级别地执行某些逻辑.
>>>4 - 自创的内存管理模式, 用消耗较多的内存的方式提高运算效率, 然后在CPU空闲时清理.

好像有点冲突。

   
>>>主要的研究方向是将来的智能家电的应用, 与智能家电共同前进, 时机合适.
>>>也支持各种嵌入式设备, (例如工控设备, 路由器, ...)
>>>移动设备, 手机啊, PAD, 点歌点菜之类的各种触屏界面等等.

独特的IO模型导致并发效率提高的话,在服务器端可能有点创新。但是在家电,工控设备,点歌触屏界面之类的方向上,有什么亮点可以跟现存的系统竞争?


>>>而最难的部分, 也许就是驱动程序了. 也许我会提供各种兼容的API接口, 去让移植LINUX的驱动也更容易吧.

这个基本不可能了,Linux给大部分硬件设计了一个子系统,驱动只要实现子系统期待的API即可工作。想要兼容驱动或者让驱动移植更容易,你得把这些子系统也移过去。



>>>很多服务器程序编写OAuth代码, 依然是使用阻塞的方式.

这个例子没看懂。我不是做网络的,也不熟悉Windows,查了一下完成端口,大抵是跟epoll解决的是同一种问题。这种情况下,对切换进程似乎没有什么影响。


>>>举个例子吧, 假如一个进程, 有65536个任务在执行, 那么就需要256G的地址空间吧, 一个进程4G空间装不下 ,  但是我用内存分页技术解决了这个难题.

65536个任务是线程么?256G是指栈所占的内存? 内存分页可以克服物理内存太小,还可以克服虚拟地址空间太小?

>>>第一, 分配多少个stack, 和分配多少地址空间, 和分配多少物理内存, 是分开的事情.  分配的4M的地址空间, 不会立刻占用4M的物理内存.

demand paging ?


>>>第二, 在32bit模式下, 一个进程有4G的地址空间, 但是通过我的OS机制, 一个进程能用到的内存是远超4G的.

这个有点意思。首先,前提是CPU能寻址到4G内存。32位CPU配上PAE机制,确实可能做到。一个进程怎么能同时访问4G内存倒有些好奇。Linux的高端内存也不过是分时把一段虚拟地址空间映射到不同物理内存上而已。

>>>那么 , 就可以在页目录上, 切换页表的形式, 加载和卸载stack的数据了.

没看出来这有什么意义。听起来像就是复用虚拟地址空间,这种事在Linux用户态下似乎确实做不到(用户态不能操纵页表)。这样做对增强并发能力有何帮助?在64bit环境下,虚拟地址空间也不是稀缺资源。

>>>主程序与内核编译在一起,  这种模式介乎于 RTOS 与 常规意义的Linux

在Linux中,每个进程里都可以认为有一个内核。主程序与内核编译在一起,不知是不是针对Window种微内核说的。

论坛徽章:
0
14 [报告]
发表于 2012-03-15 22:04 |只看该作者
你是想做类似erlang的东西吧?

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
15 [报告]
发表于 2012-03-16 07:59 |只看该作者
异步IO我实现过,用得很好,而且是在实时系统。办法是:
模块往server发请求时,除了请求的内容外,同时提供自己的ID,server应该用的callback. 把这些内容打在同一个包里作为一次请求;模块发出请求后立即返回,不再等待。
服务器接到请求后,首先执行请求指令,读取IO,得到结果后,再用请求包里的回调函数,按照模块ID,返送结果就行了。
不论是单一cpu,还是多个cpu,好像没有太多的context或stack要传递。这样做,结构,数据流都比较清晰;实现起来比新语言,新操作系统要容易得多。

论坛徽章:
0
16 [报告]
发表于 2012-03-16 09:20 |只看该作者
谢谢楼上的三位先. 这两天我有点事, 要迟点再来讨论.

昨天阅读了很多关于PCI接口的文章, 对如何与硬件进行二进制通信有了一个基本的概念. 剩下的就是通信二进制格式的细节了.  
VGA有通用的FRAMEBUFFER协议, 所以早一点向做图形界面也OK了.

论坛徽章:
0
17 [报告]
发表于 2012-03-17 02:23 |只看该作者
回复 14# tempname2


Linux即使是在内核态里写代码, 但是如果使用的是普通函数, 那么还是会重新调用int 0x80或sysenter去执行内核代码的, 这个开销太大了.

而且int 0x80之后, Linux依然会做很多安全类型的检查, 或导致性能降低.

而我的实现是, 在内核执行的程序, 调用核心功能的时候, 会避免中断和安全检查. 用完全可信的态度去提高性能.


一般的系统如果只是单个进程的, 那是不需要对内存进行分页的. 而我的刚好反过来. 我觉得, 即使物理内存很少, 但是用虚拟地址空间却能带来很多好处.


3,4不冲突, 整理内存的逻辑可以分段进行, 保证每段整理的间隔少于0.1ms, 系统实时性不会受影响.
关键就是, 我的内存管理方案, 无论是分配还是释放, 都是立刻完成, 并且内存浪费量少于25%,

但是我的算法由于在释放内存的时候, 是根本不会与附近的内存合并, 导致在某些时刻, 内存分配会不合理导致过多的内存被占用.
而内存整理逻辑就是等CPU空闲的时候才去整理内存. 所以这会增大内存高峰期的OOM风险, 好处是的确够简单够快..


本来比起已存在的系统就是毫无竞争力的.. 选择家电, 其实是出于策略因素. 并不是竞争力因素.


我研究了一天的驱动, 设计了自己的驱动架构, 可以不依赖Linux的驱动代码了. 模拟Linux的环境的话太累, 还不如移植代码逻辑.


65536个任务, 可以认为是65536个线程, 或者是类似RTOS的task context,  256G指需要 256G的线性空间, 由于线性空间不够, 所以要分时复用.


任务的stack用的的确是产生page fault时才继续增加物理内存分页.


在我严重, 内存只有两种.  一种时候用指针指来指去的.   一旦一个内存被指针指着.. 那么这个内存就不方便移动了..

除了被指针指着的部分, 全部都可以移动, 或者临时收起来, 等到需要的时候才加载.

实际上这就是分时的页面切换.  目前在我的设计中, 有2种机制用到它

1 - MemoryStream (或者叫内存文件) , 对它的操作是read/write, 所以根本没有地址的说法, 所以不占用地址空间, 可以不断地切换内存去读写不同的部分.

2 - 动态Stack , 为了兼容性, 我保留了普通的Stack , 普通的Stack占用地址空间, 一直到相关线程结束位置.  而动态的Stack, 则在任务切换走的时候释放掉它所占的空间.

根据这种分时服用的方式, MemoryStream解决的是大块内存的占用 , 动态Stack解决任务占的内存 . 那么内存空间里, 就剩下各种指来指去的对象了.


64bit下有用不完的地址空间, 的确可以解决所有的地址问题. 但是一个OS还是需要保留32bit的方式的,  对于增强并发力的关键还是内存消耗量.

例如在32位的Windows里, 即使物理内存再多, 但是一个程序要是运行几千个线程, 那么这个进程也差不多到了2G的极限了. 而我的目标就是要超过这个极限.



Linux并不是每个进程都有自己的内核, 只是他们共享某些公共代码而已.  实际的内核还是必须int 80或sysenter的呀.

即使是最可信的程序, Linux也是做一大堆检查, 对于单进程的程序来说, 实在没必要了.

所以这个系统比RTOS要复杂得多, 但是又比Linux要轻量级一点.


当然, 这个比较, 针对的是普通意义上的Linux, 而不是各种Linux的变种.











论坛徽章:
0
18 [报告]
发表于 2012-03-17 02:24 |只看该作者
回复 15# kde2000

Erlang以前简单地看过, 觉得它就是F#之类的并发函数式编程. 对它没深入研究. 不好对比.

论坛徽章:
0
19 [报告]
发表于 2012-03-17 02:27 |只看该作者
回复 16# linuxfellow

异步IO是一直都有的了. 而这次要创新的目标, 是用一个较直观的方式去编写异步操作.

也就是说, 纯粹是为了语法方便而做的创新而已.


要做到高性能服务器, 我的那个方案根本不是必须的.

但是随着云计算的普及, 会越来越多的人参与服务器编程.

编程语言需要推出新的机制去让程序员写代码变得更容易.

   

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
20 [报告]
发表于 2012-03-17 02:56 |只看该作者
回复 20# MJK2012
你要是能说服国家科委的人就可以申请到一笔基金。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP