吴浪 方言o2o是什么意思思

######&br&去年的答案到现在已经有4百多赞了,还有十天今年考研就结束啦。毕业设计做一个操作系统,到时候把放到 github上,到时候传送过去~以及,我的笔记和预备知识都会奉上~等等哇!&br&######&br&&br&&br&“一个好一点儿的计算机硕士毕业的学生。写一个操作系统的内核绝对是应该办到而且肯定可以办到的事儿。” ------这句话我们可以理解为”&b&&u&一个好的计算机硕士掌握的理论知识足够他搭建起一个简单的操作系统框架&/u&&/b&“。&br&&br&我上操作系统课(大二)的第一天就问我的老师,学完了这门课可以自己实现一个操作系统了吗?老师说:”你可以&b&&u&基本掌握操作系统中要处理的主要问题,但是即使实现最简单的五脏俱全的操作系统还需要掌握很多很多东西,而且前提是你已经有很不错的代码能力。&/u&&/b&“&br&&br&回到题目上来,我们要实现一个简单的操作系统,最先需要解决的是哪些问题?这个问题我相信翻开任何一本操作系统书都可以得到答案,一般都是操作系统书的前五,六章内容(第一章基本是操作系统概念及发展历史)。&br&包括:&br&&ul&&li&进程管理&/li&&li&存储管理&/li&&li&文件系统&/li&&li&输入/输出&/li&&/ul&这些大部分是讨论理论类的书,比如我们上课用的书是西电汤子瀛老师的《计算机操作系统》,后来自己为了深入学习买了Andrew S. Tanenbaum的《Modern Operating Systems》。&br&&br&如果想写个操作系统,除了理论知识外,动手之前最好先看看操作系统源代码,Linux的代码都是开源的,可以先学习学习。不过对于&b&&u&我们这种初学者千万不要看最新的Linux内核代码&/u&&/b&,因为那是很多人的杰作,可能一辈子都看不完。最好先看看国内同济大学赵炯基于0.11的《Linux完全注释》,即使只看懂30%也至会让自己懂很多之前不知道的东西。&br&&br&理论类的书很少有提到Bootload问题的,就是加电之后从哪里开始执行的部分。仅仅是这个步骤也需要花不少时间去了解CPU知识,汇编语言知识等,相当不容易。不话说回来,这部分如果能处理好之后会发现&b&&u&组成原理,汇编语言,微机原理的知识被自己运用到了,成就感巨大&/u&&/b&。这部分内容,可以参看MIT的课程&b&&u&6.828 Operating System Engineering&/u&&/b&的课程,Google一下就能搜到不少大牛关于这门课的博客。如果英语不太好我记得&b&&u&华中科技大学有一个叫32位操作系统实践的课&/u&&/b&,资料都放到网上了,看起来很不错。&br&&br&过了这一关,用《深入理解计算机系统》加上《现代操作系统》看一下虚拟存储器的内容,这两本书这部分说得都很棒。虚拟存储器的概念贯穿所有,如果能弄懂,对很多方面都有很大的帮助,不仅仅是操作系统这块。有了&u&&b&虚拟存储器概念之后对于链接,加载等知识理解就会深刻许多。&/b&&/u& 不过,这部分内容也需要对硬件部分有所了解,又是一坑。&br&&br&之后回到进程上来之后,终于可以把工作重心从硬件部分转移过来了。但是我们又将面对进程创建,进程调度,进程通信三大问题,既然是简单实现,就先不考虑线程的事。算法书中会给很多,不过这些算法都是有一定的局限性,比如调度算法,对应的调度算法优劣差异很大,至于如何抉择就看个人需求。不过话说回来,操作系统里的”算法“和ACM里的算法在难度上差很多,还是比较容易实现的。&br&&br&内容太多了,就不完全展开了,后面就看自己“耐力”了,写操作系统是需要坚持很长实践+大量知识积累的。有些问题还涉及到哲学的观点,这里推荐上海交大邹恒明教授的《操作系统之哲学原理》。除了理论方面的书,现在市面上也有直接教如何实现一个操作系统的,比如&b&&u&《Orange'S:一个操作系统的实现》和《30天自制操作系统》&/u&&/b&(仅有的几本“XX天XX”而不是烂书的书),起步阶段跟着这些书来还是很不错的。&br&&br&&b&&u&总之,实现最最基本的功能也许可以做到。实现功能强大,鲁棒性强的操作系统极难。&/u&&/b&&br&&br&&img src=&/e821be17f6c632d1951330baf6bc3332_b.jpg& data-rawwidth=&3551& data-rawheight=&1674& class=&origin_image zh-lightbox-thumb& width=&3551& data-original=&/e821be17f6c632d1951330baf6bc3332_r.jpg&&&br&&b&&u&不过在此过程中学到了很多很多东西。无论最后能否实现属于自己的操作系统,在此过程中收获的知识是一笔宝贵的财富。&/u&&/b&
######去年的答案到现在已经有4百多赞了,还有十天今年考研就结束啦。毕业设计做一个操作系统,到时候把放到 github上,到时候传送过去~以及,我的笔记和预备知识都会奉上~等等哇!######“一个好一点儿的计算机硕士毕业的学生。写一个操作系统的内核绝对是…
&b&&u&基础知识&/u&&/b&&br&&br&首先说一下fork和vfork的差别:&br&&ul&&li&fork
是 创建一个子进程,并把父进程的内存数据copy到子进程中。&/li&&li&vfork是 创建一个子进程,并和父进程的内存数据share一起用。&/li&&/ul&这两个的差别是,一个是copy,一个是share。&br&&br&你 man vfork 一下,你可以看到,vfork是这样的工作的,&br&1)保证子进程先执行。&br&2)当子进程调用exit()或exec()后,父进程往下执行。&br&&br&那么,为什么要干出一个vfork这个玩意?
原因是这样的—— &b&起初只有fork,但是很多程序在fork一个子进程后就exec一个外部程序,于是fork需要copy父进程的数据这个动作就变得毫无意了,而且还很重,所以,搞出了个父子进程共享的vfork。所以,vfork本就是为了exec而生。&/b&&br&&br&&b&&u&为什么return会挂掉,exit()不会?&/u&&/b&&br&&br&从上面我们知道,&b&结束子进程的调用是exit()而不是return,如果你在vfork中return了,那么,这就意味main()函数return了,注意因为函数栈父子进程共享,所以整个程序的栈就跪了。&/b&&br&&br&&br&如果你在子进程中return,那么基本是下面的过程:&br&&ol&&li&&b&子进程的main() 函数 return了&/b&&br&&/li&&li&&b&而main()函数return后,通常会调用 exit()或相似的函数&/b&(如:exitgroup())&/li&&li&&b&这时,父进程收到子进程exit(),开始从vfork返回,但是尼玛,老子的栈都被你干废掉了,你让我怎么执行?&/b&(注:栈会返回一个诡异一个栈地址,对于某些内核版本的实现,直接报“栈错误”就给跪了,然而,对于某些内核版本的实现,于是有可能会再次调用main(),于是进入了一个无限循环的结果,直到vfork 调用返回 error)&/li&&/ol&&br&好了,现在再回到 return 和 exit,return会释放局部变量,并弹栈,回到上级函数执行。exit直接退掉。如果你用c++ 你就知道,return会调用局部对象的析构函数,exit不会。(注:exit不是系统调用,是glibc对系统调用 _exit()或_exitgroup()的封装)&br&&br&可见,&b&子进程调用exit() 没有修改函数栈,所以,父进程得以顺利执行&/b&。&br&&br&&br&&br&&b&——————————更新—————————&/b&&br&&br&有人在评论中问,写时拷贝呢?还说vfork产生的原因不太对。我在这里说明一下:&br&&br&&b&关于写时拷贝(COW)&/b&。&br&&br&就是fork后来采用的优化技术,这样,对于fork后并不是马上拷贝内存,而是只有你在需要改变的时候,才会从父进程中拷贝到子进程中,这样fork后立马执行exec的成本就非常小了。而vfork因为共享内存所以比较危险,所以,Linux的Man Page中并不鼓励使用vfork() —— &br&&br&“ It is rather unfortunate that Linux revived this specter from the past.
The BSD man page states: &This system
eliminated
when proper
system sharing mechanisms are implemented.
Users should not depend on the memory sharing semantics of vfork() as it will, in that case,
be made synonymous to fork(2).&”&br&&br&于是,从BSD4.4开始,他们让vfork和fork变成一样的了。但在后来,NetBSD 1.3 又把传统的vfork给捡了回来,说是vfork的性能在 Pentium Pro 200MHz 的机器上有可以提高几秒钟的性能。详情见——“&a href=&http://www.netbsd.org/docs/kernel/vfork.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&NetBSD Documentation: Why implement traditional vfork()&i class=&icon-external&&&/i&&/a&” &br&&br&&b&关于vfork产生的原因&/b&&br&&br&你可以看一下Linux Man page——&br&&br&Historic Description&br&&br&
Under Linux, fork(2) is implemented using copy-on-write pages, so the only penalty incurred by fork(2) is the time and memory required to duplicate the parent’s page tables, and to create a unique task structure for the child.
&b&However, in the bad old days a fork(2) would require making &/b&&b&a
complete copy of the caller’s data space, often needlessly, since usually immediately afterwards an exec(3) is done.
Thus, for greater efficiency, BSD introduced the vfork() system call, which did not fully copy the address space of the parent process, but borrowed the parent’s mem&/b&&b&ory
to execve(2) or an exit occurred.&/b&
The parent process was suspended while the child was using its resources.
The use of vfork() was tricky: for example, not modifying data in the parent process depended on knowing which variables are held in
a register.&br&&br&(更新完毕)
基础知识首先说一下fork和vfork的差别:fork 是 创建一个子进程,并把父进程的内存数据copy到子进程中。vfork是 创建一个子进程,并和父进程的内存数据share一起用。这两个的差别是,一个是copy,一个是share。你 man vfork 一下,你可以看到,vfork是这样…
研发一个内核不难,难的是让成千上万的设备为它做驱动。那是一项庞大到几乎不可能的任务。&br&&br&苹果可以自研内核,因为苹果只需要驱动非常有限的少量的设备。说服少数这些设备厂商开发苹果驱动即可,或者甚至可以自行开发。&br&&br&Windows 可以自研内核,因为这个星球上,设备驱动最多的可能就是它了吧。&br&&br&那么除了 Windows 之外,哪个内核能驱动最多的硬件设备?答案是 Linux。&br&&br&所以 android 必须只能选择 Linux 作为内核,没有任何其他选择。
研发一个内核不难,难的是让成千上万的设备为它做驱动。那是一项庞大到几乎不可能的任务。苹果可以自研内核,因为苹果只需要驱动非常有限的少量的设备。说服少数这些设备厂商开发苹果驱动即可,或者甚至可以自行开发。Windows 可以自研内核,因为这个星球上…
从Linux到Android再到其他种种,都有一群爱好折腾的人照着别人的教程改这改那,然后觉得自己特极客特专业特牛X。&br&&br&Linux内核代码超千万行,还有下面的各种桌面、平台、编译器、库、软件,你给他们贡献过一行代码没?
从Linux到Android再到其他种种,都有一群爱好折腾的人照着别人的教程改这改那,然后觉得自己特极客特专业特牛X。Linux内核代码超千万行,还有下面的各种桌面、平台、编译器、库、软件,你给他们贡献过一行代码没?
这个答案那么久了以后,好多人还来点赞真是太感谢了啊。终于周末了我来补充一下这个答案吧。&br&&br&首先先说说操作系统是干什么的吧。如果专业是计算机的同学可能学过操作系统这门课程,会发现课程上讲的内容和我们所认识到的操作系统差别很大。这个里面所讲的正是操作系统最核心的功能,任务调度、内存和设备的抽象和管理。然后 ,为了我们方便使用,才集成进了系统服务、驱动程序、文件系统之类的东西。&br&&br&我们平时运行的程序,每个程序各运行几十毫秒,大家来回轮换,这样子我们看起来这些程序好像在“同时”运行一样。应用程序之所以能够被操作系统通过时间片的方式调度,是因为对于CPU而言,普通的应用程序和操作系统的内核运行在不同的特权级别上,我们叫作rings。应用程序运行在Ring 3,而内核运行在Ring 0。&br&&br&随着科技的发展,操作系统变得越来越复杂,内核里面的东西也越来越多。人们也就开始考虑是否应该改变原有的架构,从而提高操作系统的性能和稳定性,主要是精简内核降低开发的复杂度,还有就是把各种程序尽可能的隔离,保证一个程序的崩溃不会牵连到其他的程序。上世纪80年代人们讨论得火热的微内核就是这样一种架构。&br&&br&微内核考虑在操作系统的内核中保留操作系统最基本的功能,也就是任务调度、内存和设备的抽象和管理。其他的功能全部从内核移出,放到用户态中了实现,并以C/S模式对其他应用程序提供服务。&br&&br&微内核带来的好处主要是稳定性和实时性,即内核中模块数量少了,结构更精简更优化了,能够影响内核的程序和驱动也减少了,稳定性随之提高;另外就是实时性,内核精简了以后,响应的时延的减小。不过并不是精简了以后会使得性能提升,微内核使得内核中只有最关键的部分,其他模块和系统功能全部作为独立模块放到用户态空间中运行,功能分散了以后增加了通信的成本。不过微内核操作系统的特点尤其适合工控系统的控制,而且设计简单,在小型的系统中有不少的应用。另外亦有不少实时操作系统是使用微内核架构设计。&br&&img src=&/80d47b770dc90fe14f7fac2f44f31403_b.jpg& data-rawwidth=&2000& data-rawheight=&511& class=&origin_image zh-lightbox-thumb& width=&2000& data-original=&/80d47b770dc90fe14f7fac2f44f31403_r.jpg&&&br&所有的理论设计,放到现实的工程中都是要做折衷的。所以有混合内核的出现,综合宏内核和微内核的不同优点,在两个方案中折衷设计。OS X和Windows就属于这类。至于Linux,上千万行代码,架构岂是说改就能改的。使用Linux构建的系统,不少都是要追求性能的吧,前面也说到微内核会降低性能,在Linux中,我们为了使得一个事情性能更高,往往还要把这个模块放到内核中运行,比如PF_RING。所以在需要考虑性能的时候,微内核又显得不那么合适,像微软一样取一个折衷算是一个好的办法。&br&&br&----分割线以下是原来的回答----&br&谁告诉你Mac OS X和Windows是微内核的?
这个答案那么久了以后,好多人还来点赞真是太感谢了啊。终于周末了我来补充一下这个答案吧。首先先说说操作系统是干什么的吧。如果专业是计算机的同学可能学过操作系统这门课程,会发现课程上讲的内容和我们所认识到的操作系统差别很大。这个里面所讲的正是…
厚脸皮推荐自己基于《JamesM's kernel development tutorials》写的中文文档,如果你只有基本的C语言和汇编基础以及一点点操作系统理论的话,这是起点很低的入门读物了。&br&&br&&b&项目地址:&a href=&http://hurley25.github.io/hurlex-doc/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Hurlex-doc by hurley25&i class=&icon-external&&&/i&&/a&&/b&&/p&&p&------------------------------------------&/p&&p&&b&补充一下文档目录:&/b&&/p&&ol&&li&&b&项目概述和开发环境配置&br&&/b&&/li&&li&&b&计算机启动过程、GRUB 以及 multiboot 标准&br&&/b&&/li&&li&&b&裸机上运行的 Hello OS Kernel&br&&/b&&/li&&li&&b&字符模式下的显卡驱动&br&&/b&&/li&&li&&b&相关库函数和调试打印函数&br&&/b&&/li&&li&&b&添加全局段描述符表&br&&/b&&/li&&li&&b&添加中断描述符表&br&&/b&&/li&&li&&b&完成中断请求和定时器中断&br&&/b&&/li&&li&&b&物理内存管理的实现&br&&/b&&/li&&li&&b&虚拟内存管理的实现&br&&/b&&/li&&li&&b&内核堆管理的实现&br&&/b&&/li&&li&&b&内核线程的创建与切换&br&&/b&&/li&&li&&b&接下来如何继续学习&/b&&/li&&/ol&&p&------------------------------------------&br&&/p&&p&
这个东西很难被称为“内核”,甚至说它是“玩具内核”都是缪赞了。这只是一个看起来能运行的原理示范性质的小程序。不过不可否认,按照文档来,你可以写出一个看起来挺好玩的东西并学到一些基础知识。&/p&&p&
虽然一个真正的内核很难很复杂,但是一个简单的Demo并不是遥不可及。&b&即使有兴趣,学习的过程中也需要乐趣和不断获得的成就感,不是吗?&/b&&/p&&p&
祝你玩的愉快~&/p&
厚脸皮推荐自己基于《JamesM's kernel development tutorials》写的中文文档,如果你只有基本的C语言和汇编基础以及一点点操作系统理论的话,这是起点很低的入门读物了。项目地址:------------------------------------------补充一…
恩,我以前也是和LZ一样,折腾过很多发行版,从什么都不会,到折腾一些发行版,一些美化,到编译/打包软件,到独自掌管八台学校的Linux服务器,维护上面的所有网站,最后到现在在Linux上做Python的项目,web,桌面都有。。。&br&&br&我也是抱着玩的态度去使用Linux,后来慢慢就越走越深了。我发现Linux带给我的改变很多,不论是个人修养,看待事物的眼光还是技术水平,我和我的一位一样转向Linux的朋友在各方面都已经远超我的大多数同学了。我想即使我以后并不依靠Linux为生,在Linux上学习到的东西,养成的解决问题的素质和能力,辩证看待事物的观念,在社区遇到的朋友,对“自由”二字的深刻理解等等依然让我受益终生。&br&&br&很多人会说重要的不是你会用Linux,而是你用Linux做了什么。这点我很赞同,但我想添加的一个观点是虽然并不是说会用Linux的人水平都很高,但是熟悉Linux会很容易理解编程中很多令人疑惑和不解的地方和设计,这可以避免你少走很多弯路,同时会潜移默化地指引你的方向。我记得我还是很新的新手的时候经常干的事就是切换各大发行版,美化桌面,解决一些使用中的小问题,在社区打口水战讨论哪个哪个更好。。。有一天我开始对这些事情感到极其无聊,我想---“这些事情好无聊,我应该做出一点看得见的东西”,于是我开始搭建服务器以及鼓捣各种服务,ftp,samba,apache,ssh。。。我发现我在之前使用Linux中学到的命令和知识,获得的经验在搭建服务器的过程中全部用上了,而这些服务为我和我周围的人的生活提供了极大的方便,这个过程让我觉得比之前做的“安装系统,调整桌面环境,调整配置”要有意思得多。再后来,我开始对搭建和维护服务器的工作感到无聊,我想,既然我懂得如何安装,配置和维护这些服务器,那么为什么不试一下web开发呢?所以我开始使用java和Python来尝试web开发,(后来由于种种原因放弃了java),于是我开始在Linux上学习Python,学习django框架,我发现在Linux上编程其实比在windows上方便多了,而Python这门语言让我觉得非常快乐,在那之前我学习过C,C++,java,没有一门语言能够像Python一样让我觉得coding是一件如此interesting和funny的事情,我爱死了python了。编写了一些网站并告诉朋友们“LOOK,这是我写的网站,你们可以在我的网站上留言,聊天,给我发信息哟”这种感觉非常酷,比之前维护服务器的工作还有有意思。再后来,我感觉在web端编程受到的限制太多了,我不希望实现任何有趣的想法都要依托于浏览器,于是我想,为什么不试试编写一个桌面软件呢?于是我使用PyQt编写了我在ubuntu上的第一个软件---一个使用了有道web的API的英汉词典,虽然功能很简陋,但是我觉得很开心,而且我发现我在web中的知识,json,xml,解析html等等在编写这个词典的时候都用到了。现在,我感谢这些open-source的软件对我的帮助,我希望我能够做写什么来回馈这些社区,于是我打算为开源项目贡献代码,并考虑着手做一个项目并在github上开源。&br&&br&现在回过头来,所有的这一切的因果关系是那么明显,但是我却从来没有认真计划过---先学Linux,然后学服务器,然后学web。。不是的,这一切我感觉都是自然而然的,没有任何周密的前期计划,而我想,如果我在windows上,或许并不见得会走这么远,而这一切的源头,都在于一年前的那个懒散的下午,闲得没事干的大一的我点开了一个标题为《ubuntu桌面生存指南》的文章&br&&br&其实想一想,并不是我们选择了Linux,而是Linux选择了我们。当时和我一样转向使用Linux的朋友很多,但是遇见的各种各样的困难让绝大多数人都退缩了,最后剩下我和另外一名小伙伴,在Linux的道路上越走越远。Linux吸引那些喜欢探索和研究,有冒险精神的人,然后不断地筛选掉其中不合适使用TA的人,最后留下的大多是有一定功底的,理解并赞同Linux哲学,并且很有可能会为社区作出贡献,反过来推动Linux发展的人。我发现我已经离不开Linux了,没有命令行我就觉得不舒服,感觉系统不是我的,我的手机是SailfishOS操作系统,一款基于Linux的,更Linux化的,带有terminal的移动操作系统;我喜欢在晚上睡觉前通过手机的ssh远程关闭隔壁房间的两台Linux电脑;我习惯定时地检查/var/log/目录下的所有文件,我能知道过去的一段时间电脑发生了什么;这些可能不是很好的习惯,但是我享受这些过程,因为我能感觉到系统是听命于我的。&br&&br&说了这么多,也是我使用Linux一年多的这些感慨,或许没有很好地回答你的问题,但希望我的回答能给看到这个答案的人一些启示和帮助。最后,我要说&br&Happy Coding,&br&Happy Python
恩,我以前也是和LZ一样,折腾过很多发行版,从什么都不会,到折腾一些发行版,一些美化,到编译/打包软件,到独自掌管八台学校的Linux服务器,维护上面的所有网站,最后到现在在Linux上做Python的项目,web,桌面都有。。。我也是抱着玩的态度去使用Linux…
为了体现本篇回答的专业性和严肃性,也为了体现俺的认真,俺决定暂停使用俺这个字。&br&&br&&br&其实操作系统不是个clean problem,我个人是认为写编译器对学习、工作的帮助更大啦(大很大,比更大更大),并且更干净(比干净更干净)更好写(比好写更好写),当然不可否认操作系统看上去是挺高深莫测的。。(而且挺没用的。。。我认为主要原因是很多人没学好cpu原理,觉得底层的一切都那么神奇,并无限渲染放大「底层高手论」。。。学EE的同学,大部分不还是被坑了)&br&&br&&br&如果你执意要写操作系统的话。。。&br&我的建议如下:&br&&br&学习、理解CPU,自己设计一个指令集,这个主要是让你明白计算机是怎么工作的,在没有OS的情况下如何使用。&br&你最好能对这个指令集写一个模拟器,写不出来,是因为你对理论和原理掌握不够。&br&如果你想要简单,可以采用stack-based模型,但是其实register-based模型用起来更方便也更熟悉。&br&&br&学习OS其实不应该用x86这种工业品,太脏太杂,就算用也可以只用一个子集。所以如果上面自定义指令集的cpu模拟器你写出来后,就可以扔掉x86了。&br&如果你不扔,用x86也不必看什么保护模式之类的东西,脏自己的手。&br&&br&&br&——————————&br&一个简单的OS,应该由这三部分组成:&br&&ul&&li&进程管理&/li&&li&内存管理&/li&&li&驱动程序&/li&&/ul&&br&——进程管理——&br&理论知识不表,实践上,你应该实现这两个函数:_execute和_exit&br&而且你如果实现单进程OS,那就更简单了,多进程就是多点苦力活。&br&_execute用来开一个进程,做的事情是保存当前寄存器状态,设置新进程属性,然后让新进程开始执行。&br&_exit用来结束一个进程,做的事情是结束当前进程,恢复到上一个进程的状态。&br&状态保存在一块特殊的内存区域内,按照x86的做法,是用一个寄存器以stack的方式来管理那段内存,那个寄存器叫SP&br&&br&&br&——内存管理——&br&内存管理也是两个函数:_alloc和_free&br&内存管理其实也很简单,_alloc的时候,记下size和地址,放入一个链表中,_free的时候,遍历链表,把那一块相应的记录标示一下,这个理论知识也说过,最好用装箱问题那一套解法,但其实你就裸来就可以了。。。反正是简单操作系统,原理比算法重要得多。&br&这样管理内存足矣,再高级点的话,现在的OS都带有分页功能,这个理论上也写了,你照着看就是了,话说前几天还做梦梦到页面置换算法来着。。。这个算法在我梦中的形象是一根白萝卜片烤串。。。&br&&br&&br&&br&——驱动程序——&br&显示设备:&br&现在的显示设备都是光栅(raster)技术,光栅其实就是像素点。。意思是屏幕由无数像素点组成。&br&用一段内存来当做显示设备的source,比如显示器是400*300的,不考虑颜色,就用一字节代表一个点,那就要开一块400*300的内存当显存,显示设备每帧通过对这块内存的扫描来实现显示功能。&br&你的显示设备驱动需要实现的函数也很简单,大致就是_drawPixel、_drawLine、_drawRectangle、_drawCharacter之类的。&br&&br&&br&这几个东西你可以看看我写的一个答案里面的例子&br&地址是&a href=&/question//answer/& class=&internal&&能不能设计出一个终极傻瓜编程软件,让普通人可以完美编程? - 知乎用户的回答&/a&&br&&br&当然那个例子还是太简单了,因为是伪光栅,实际上画线算法要麻烦一点,这个图形学的书上会有写,不过你搜点博客看看就好了,很简单,无非是套公式计算而已,没必要自己想。如果这样写的话用汉编没个把小时很难调试正确。。。还不如汇编。所以我的例子就用伪光栅了。。。&br&&br&&br&显示字符的方法是这样的,对于每个字符,你都要画一份字符的图片(最简单的就是一个m*n的像素图),然后_drawCharacter函数的实现是把这个字符的图片复制到显存中去(你想象一下,体会一下我说的脏是什么意思。。。。)&br&&br&&br&输入设备:&br&键盘,一段内存空间映射成按键,通过对这段内存的操作来实现输入。&br&&br&&br&当然还有文件系统啊鼠标啊什么的,但其实没有文件系统也没什么,本来硬盘就不是计算机的标配,鼠标更不是必须,而且鼠标要配合GUI或者字符GUI来用,那就更脏了,所以就这样吧。。简单操作系统嘛&br&&br&你或许会觉得我说的东西很奇怪,和书上讲得不一样,但其实操作系统就这么回事,书上写得太深层太详细了,我不是说书写得不好,书很好,很理论,但是你看书的时候应该要学会看到它背后的意思。&br&书会告诉你这是什么,有什么用,甚至为什么要这样,但你要学会思考「如果不这样会怎样?」&br&&br&&br&好,现在你可以在这个操作系统上实现一个俄罗斯方块(其实贪食蛇更好实现,让我写俄罗斯方块不如杀了我。。。)来忽悠那帮老师了。&br&否则他们会问你:「这黑乎乎的就就算完事了?写的什么东西!」&br&&br&&br&不过这里还是真诚建议楼主,不要写操作系统,付出远大于回报,写编译器吧。&br&你还年轻,以后实在想写,再写不迟
为了体现本篇回答的专业性和严肃性,也为了体现俺的认真,俺决定暂停使用俺这个字。其实操作系统不是个clean problem,我个人是认为写编译器对学习、工作的帮助更大啦(大很大,比更大更大),并且更干净(比干净更干净)更好写(比好写更好写),当然不可…
当年上我老板的OS课,老板上来就告诉我们,OS不是运行着的代码,而是一堆躺在内存里等着被调用的代码。&br&&br&内核就是一个由interrupt驱动的程序。这个interrupt可以是一个系统调用(x86下,很多OS的系统调用是靠software interrupt实现的),可以是一个用户程序产生的异常,也可以是一个硬件产生的事件中断。&br&&br&于是你的问题解决了:一个用户程序运行的时候,Linux就在内存里呆着,等着一个中断的到来。在这个中断的处理过程中,来做“调度”。而一般的时分系统里,都会有个timer interrupt每隔一段时间到来,也就是楼上说的“时间片”。&br&&br&PS:很多人在认识OS的过程中被大量的artificial concept给困惑了。比如神马进程,线程,调度,micro kernel,monolithic kernel的。从x86架构上来理解OS才是王道。&br&&br&=================================================================&br&PS of PS: 把评论粘上来,补充上面的PS,谢 &a data-hash=&00cac8fef58a8c5505097dfc01a4706b& href=&/people/00cac8fef58a8c5505097dfc01a4706b& class=&member_mention& data-editable=&true& data-title=&@许越& data-tip=&p$b$00cac8fef58a8c5505097dfc01a4706b&&@许越&/a&提醒:&br&因为很多教材在讲os的时候,更喜欢从app的角度来看待os,于是很多时候被各种概念绑架。因为很多例如进城,线程,系统调用这样的东西都是由os在硬件上抽象出来的。站在这些概念上看os,就有点“不识庐山真面目”的感觉。所以我的意思是从硬件的角度看os,反过来理解为何os要抽象出这些概念。站在cpu的角度,理解指令是怎么在cpu上一条一条的运行的。
当年上我老板的OS课,老板上来就告诉我们,OS不是运行着的代码,而是一堆躺在内存里等着被调用的代码。内核就是一个由interrupt驱动的程序。这个interrupt可以是一个系统调用(x86下,很多OS的系统调用是靠software interrupt实现的),可以是一个用户程序…
占坑,一点点的说。&br&&br&先说内核的定义:狭义的WindowsNT内核指的就是NTOSKRNL.EXE,Linux内核就是Grub里指定的那个内核文件,这两个文件都不大,属于系统最核心的组件;广义的内核定义是:WindowsNT架构下的大部分SYS文件,Linux里所有工作在内核模式的进程。&br&&br&因为WindowsNT是微内核(勉强算是吧),Linux则完全不属于微内核结构,就先从这种区别来说安全性吧:&br&&br&微内核的好处就是核心的东西通常可靠性较高,并且如果某一个子系统挂掉的情况下,不会完全影响到内核的工作(当然实际NT情况不是这样),缺点就是外围驱动的代码无法控制,为此微软引入了数字签名之类的东西,从WIN7x64开始,没有签名的驱动是无法被加载的,这一点可以保证一些安全性。&br&&br&Linux里内核包括了很多东西,编译内核的时候可以定制自己想要的东西,如果对自己想要的东西理解的足够多的话,那么驱动的安全性是可以保证的。但Linux的一大问题是LKM,LKM可以在root权限下动态载入任意一个内核代码。&br&&br&从载入第三方代码的角度说,微软在WIN7以后安全性提高了很多,而Linux因为有LKM的存在,如果root权限被控制,那么任意指令都可以被载入到内核执行。&br&&br&所以,我不太认为Linux的内核安全性比NT内核要高多少,虽然微软签名也有可能滥发,但LKM更可怕。&br&&br&Windows使用IRQL之类的限制保证不同的代码运行在不同的内存空间下,理论上说,对硬件的资源控制是要优于Linux的。Linux在这方面没有提供更多的保护(或者,我不了解相关的情况)。注:此处的内存空间是指page和non-paged的区别。&br&&br&剩下的我慢慢补充。&br&&br&------------------补充1------------------&br&&br&关于root权限的问题:&br&&br&这是在对等的条件下进行比较的,Windows的管理员权限下是无法载入未验证的代码到内核的,Linux在root(管理员)权限下是可以载入任何未验证的代码到内核的。所以说从内核的结构上看对待ring0的代码来说Linux的保护机制更弱。&br&&br&&a data-title=&@deep-pro& data-editable=&true& class=&member_mention& href=&/people/760c696a351e8d9e73b59& data-hash=&760c696a351e8d9e73b59& data-tip=&p$b$760c696a351e8d9e73b59&&@deep-pro&/a&&a data-title=&@殷红路& data-editable=&true& class=&member_mention& href=&/people/0edbe5df44fed3426169& data-hash=&0edbe5df44fed3426169& data-tip=&p$b$0edbe5df44fed3426169&&@殷红路&/a& 你们的说法我无法赞同,Windows非管理员权限是很安全的,但是没有人这么用,如果用Windows管理员权限与Linux一般用户去比较那么是不公平的。&br&&br&另外,&a data-title=&@殷红路& data-editable=&true& class=&member_mention& href=&/people/0edbe5df44fed3426169& data-hash=&0edbe5df44fed3426169& data-tip=&p$b$0edbe5df44fed3426169&&@殷红路&/a& 以下是我找到的数据链接:&br&&a href=&http://en.wikipedia.org/wiki/Usage_share_of_operating_systems& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Usage share of operating systems&i class=&icon-external&&&/i&&/a&&br&&br&看不出Linux的占有率哪里&b&明显&/b&高于Windows了,在服务器市场,IDC的数据仍然是Windows高于Linux,唯一的一组数据是安全领域Linux很高,但是点开那个引用数据可以看到那个数值是基于apache的应用的,Windows、Linux、Unix是都支持apache的,尤其在IDC的服务器上Apache+Windows的应用也是见过很多的,所以也没理由说Linux的占用率一定高于Windows。&br&&br&----------------------------补充2----------------------------&br&&br&讨论的是内核安全性,但我还要说说应用的事情,在应用的方面,Windows应用的安全性还是远远低于Linux的,虽然微软在vista以后加入了UAC这种控制,但易用性和安全性之间本身就是有矛盾的,在方便的同时是要牺牲一部分安全性的代价的。&br&&br&Windows的应用漏洞多的不计其数,但也不是说Linux是完全安全的,Linux的代码来源未必都是可靠的,并且就算是可靠的也未必是安全的,比如今年的struts2漏洞,当然有人会说那不是Linux的,那好吧Windows的很多应用也不是微软发布的,在这之间没有明显的界限,不做进一步讨论了。&br&&br&----------------------------补充3----------------------------&br&&br&继续说安全性,说两个内核区别:&br&&br&Windows内核的二次开发是非常困难的,比如,Linux里可以基于VFS很快建立一个自己的文件系统,自建文件系统的好处就是可以保证数据安全,而Windows想要扩展第三方文件系统是十分困难的,因为Windows内核里有太多的API是不公开或者没有明确文档说明的。&br&&br&Windows内核的为了方便第三方软件工作提供了过滤驱动这种接口,这种设计简直是为木马软件专门留的后门。当然微软的策略是:&b&方便自己封闭、也方便别人使用&/b&,但正是这种思路,也使得用户无法触及封闭的部分,使得开放的部分被人滥用,因此也就有了各种奇怪的保护手段,比如QQ密码框用的修改IDT表项之类的,Linux因为系统是开放的,应用软件有足够的手段去开发安全性更强的驱动、插件、系统调用。&br&&br&所以NT内核的封闭性+开放API的做法很容易导致开放的部分被滥用,这一点对开发者而言是很不友好的,在这个方面,Linux取胜。&br&&br&----------------------------补充4----------------------------&br&&br&两个系统内核还有明显的区别,但跟安全性关联不大,比如:&br&&br&系统调用,一个用int 0x80,另一个用sysenter,据说最新版本的Linux也是用sysenter,我没有考察过,二者安全性应该没太大区别,只存在于速度上。sysenter更快一点。&br&&br&图形化组件是集成在Windows内核里的,但Linux的图形化不集成在内核里,集成内核的效果是图形化更快。但对于服务器而言,图形化组件不是一个必需的选项,Windows这么做其实是在浪费资源,并且也多了一个漏洞存在的可能性,因为Windows JPEG缓冲区溢出漏洞是能攻击到内核的。&br&&br&Windows的调用栈更多,写过Windows驱动的人都知道IRP这个东西,一层一层的传递,效率其实很差的,浪费内存资源,所以Linux能精简,但Windows想精简都困难。
占坑,一点点的说。先说内核的定义:狭义的WindowsNT内核指的就是NTOSKRNL.EXE,Linux内核就是Grub里指定的那个内核文件,这两个文件都不大,属于系统最核心的组件;广义的内核定义是:WindowsNT架构下的大部分SYS文件,Linux里所有工作在内核模式的进程。…
&b&之所以回答,是因为想吐槽一下点赞最多的&a data-title=&@pansz& data-editable=&true& class=&member_mention& href=&/people/836f5b2ee72d& data-hash=&836f5b2ee72d& data-tip=&p$b$836f5b2ee72d&&@pansz&/a& 回答。&/b&&br&&br&恰恰相反,linux最难的部分就是它的kernel.作为在n个开源或不开源的嵌入式系统下写过m种设备驱动的人,我想说,设备驱动的编写难度,绝对是吊丝级的。&br&&br&其次,嵌入式的设备不需要同时技持什么成千上万种设备,不像是电脑,你换个声卡显卡重装驱动就OK了。你可以把你手机的屏幕换一个别的型号试试,硬件接口都不一样,软件需要去做支持吗?&br&&br&再次,手机中需要的外围设备也没有成千上万那么夸张~。&br&&br&&b&现在回答题主的问题。google为什么要用linux.&/b&&br&1,不要拿google与apple类比。它们两个不是同一种公司。&br&google是互联网公司,google是靠服务挣钱的。而apple是设备商。apple要做的是apple认为最人性化的设备,用设备去赚钱,apple的软件是为apple的设备服务的。&br&&br&2,智能设备需要一个有着优秀管理能力的多任务操作系统。没有人花钱让你去从头去开发这样一个系统。这个难度很大。&br&&br&3,不是google选择了linux。是google选择了android, 而anroid选择了linux。当然,如果android当年用的并不是一个开源系统。google不一定会选择它。&br&&br&4,一个稳定的,开源的,全球有众多工程师免费帮你升级维护的系统。对于一个互联网公司,它还不是最佳的选择吗?&br&&br&5,linux功能强大,它的很多feature都能满足android的需要。且免费,免维护费。我想这是android最初选择linux的原因。或者说在android还不叫android之前,就选择了linux的原因。请看第6条。&br&&br&6,最后,讲一个故事。曾经一个sun的大牛跳到了moto(也可能是被挖过去的)。因为是sun出来的人,到moto就建立了这样一个项目,底层是c(不记得是不是linux了)上层是java的系统用于手机。那个年代还是moto是业界老大的时代。所有的手机系统(包括界面)都是用c编写的,木有c++,更木有java。那个年代的手机cpu的主频26M是比较快的,想象一下,在这样的处理能力下,先跑一个c的系统,再跑一个虚拟机,再运行java是什么感觉?那个项目的bug满天飞啊~~~最后,这个项目最后在moto挂掉了,大牛自然也离开了。再再再最后,这个大牛到了google。
之所以回答,是因为想吐槽一下点赞最多的 回答。恰恰相反,linux最难的部分就是它的kernel.作为在n个开源或不开源的嵌入式系统下写过m种设备驱动的人,我想说,设备驱动的编写难度,绝对是吊丝级的。其次,嵌入式的设备不需要同时技持什么成千上万种…
我来扯几句。&br&&br&就计算机安全来说,离不开谈论的环境,即所谓要确立&可信计算域&的概念和范围,就当前这个问题来说,内核的安全性。嗯,话题有点大,写一米厚的书都够了,我简单写点NT的。&br&&br&首先,已经是内核了,那么在NT内核里面执行的代码的权限就是无限大,linux我想应该是差不多的,所以首先要确立对于这个问题来说,内核内就是“可信计算域”,这里面能做出危害整个系统的事情。&br&&br&OK,那么问题就分两方面,NT内核对内对外的安全性体现。&br&&br&首先说NT内核自身,因为这货是闭源的,所以普通的扩展方法就是写驱动,驱动加载进去基本也就什么都能做了。ok,你可以认为这是一个不安全的地方。但是,首先,安装驱动程序是需要权限的,如果你每天开着administrator上网还扯什么安全性,这就是搞笑;其次,现在的NT内核因为x64下面patch guard技术的引入,胡乱Hook的现象少多了,进一步限制了驱动胡搞;最后x64要求驱动有sign,恶意代码进系统比以往有了很大的难度。&br&&br&其次说说内核对外的安全性体现。NT其实有一大弱点,就是r3有几个进程是不能结束的,crash掉会马上BSOD,但这和今天的话题无关。&br&1 当下的NT内核提供了ASLR,大大提高了进程被inject后shellcode run起来的难度;&br&2 传统NT的ACL模型就不废话了&br&3 UAC,这货也不扯了&br&4 EFS和Bitlocker,EFS的易受攻击性已经是被证明的,所以这货只能提供有限的安全性,但是Bitloacker在正确配置的情况下,可以提供几乎不存在什么弱点的安全保护,相关话题我就不在这里扯了,有兴趣的自己看看相关资料。&br&5 UMDF,因为内核驱动会导致BSOD,所以现在NT内核提供用户模式驱动,这货崩掉只会导致一个系统服务crash,重启服务即可(并不是重启计算机,比如USB的,只需要重新插一下就行了)&br&&br&就说这么多,以下是嘲讽时间:&br&如上所述,要确立“可信计算域”,安全是对用户来说的,无论吹得多么天花乱坠,伤害了最终用户,再先进的技术也是不安全的。&br&举例来说,安卓对用户来说就是一完全恶意不安全的系统,当然你可以反驳我“你觉得这个app要的权限多,你可以不用,你换一个阿”,这是废话,当每一个app都可以(事实上也都是)肆无忌惮的要求各种权限的时候,用户没得选,用户也没地方设置。&br&另外总有人蹦出来说linux如何优越,开源就是棒,一般来说这种嚷嚷得越欢的越菜,开源等于安全是一个悖论,不多扯了,跑题,能战100页。
我来扯几句。就计算机安全来说,离不开谈论的环境,即所谓要确立"可信计算域"的概念和范围,就当前这个问题来说,内核的安全性。嗯,话题有点大,写一米厚的书都够了,我简单写点NT的。首先,已经是内核了,那么在NT内核里面执行的代码的权限就是无限大,li…
我觉得,最简单的,你去试一试自己爱什么。&br&&br&读一个简单的内核,不是工业化的linux内核,你可以看看xv6 &a href=&/guilleiguaran/xv6& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&guilleiguaran/xv6 · GitHub&i class=&icon-external&&&/i&&/a&&br&作为一个8000行左右的内核,极好的在可用性和简洁方面做到了平衡。&br&&br&游戏后端,你需要的是一个比较有趣的服务器的例子,我很早前看过一个尚且不错,&a href=&/xtaci/gonet& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&xtaci/gonet · GitHub&i class=&icon-external&&&/i&&/a& 受到这个启发,我也造过一些轮子。&br&&br&第一份工作的环境,薪资都很重要。对你将来的发展来说可能说就是决定了起点。&br&&br&我认为,选择一份工作首先是对所做事情的认同度的选择,如果不爱游戏,那选内核多半不错,反之亦然。&br&&br&其次是对人的选择,哪边大牛多一些,哪边大牛愿意带我?这是个重要问题,就网易而言,网易广州有许多已经超凡入圣的大牛,超我十倍百倍的两手两脚数不过来。而且广州的新入职相对较少,能分到大牛手里,对你谆谆教诲,必然可以一日千里。对个人来说是好事。阿里云接触较少,你也可以找信源了解。&br&&br&最后,选择一份工作是对行业的选择,你要不要在游戏行业持续的干下去,还是要在内核领域走远。这是你对浪潮的认知,也是对你自我的认知。&br&&br&解决选择的关键,在于正确的认知事物和正确的认知自我。我相信你有不错的运气和见解,选到你自己喜欢的offer。
我觉得,最简单的,你去试一试自己爱什么。读一个简单的内核,不是工业化的linux内核,你可以看看xv6 作为一个8000行左右的内核,极好的在可用性和简洁方面做到了平衡。游戏后端,你需要的是一个比较有趣的服务器的例子,我很早…
作为一个在System方向实验室待过的同学来稍微补充一下这个问题的答案。&br&&br&&a class=&member_mention& data-editable=&true& data-title=&@冯东& data-hash=&44faf17ff5f5a4ccc4cf9bda47de8da2& href=&/people/44faf17ff5f5a4ccc4cf9bda47de8da2& data-tip=&p$b$44faf17ff5f5a4ccc4cf9bda47de8da2&&@冯东&/a&&a class=&member_mention& data-editable=&true& data-title=&@王垠& data-hash=&361cb6f59fa28f664bad5fab8871b0cf& href=&/people/361cb6f59fa28f664bad5fab8871b0cf& data-tip=&p$b$361cb6f59fa28f664bad5fab8871b0cf&&@王垠&/a& 的答案更多是从Monolithic Kernel和Micro Kernel的设计角度比较优劣,这个话题争论的时间比较久,也需要蛮长篇幅来说。就本问题来说,“Linux为什么坚持使用Monolithic Kernel”和设计优劣还是有一定区别的。&br&&br&&a class=&member_mention& data-editable=&true& data-title=&@詹健宇& data-hash=&b0cdcb9cda4& href=&/people/b0cdcb9cda4& data-tip=&p$b$b0cdcb9cda4&&@詹健宇&/a& 的回答与本主题较为贴近,Linus Torvalds与Andrew S. Tanenbaum(当时System研究领域的大牛 Modern Operating System一书的作者,也是今天System界领军人物Frans Kaashoek的老师)有过一场关于Linux设计是否过时的争论(&a href=&/forum/#!topic/comp.os.minix/wlhw16QWltI%5B1-25-false%5D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/forum&/span&&span class=&invisible&&/#!topic/comp.os.minix/wlhw16QWltI%5B1-25-false%5D&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&),当时学术界主流观点是Monolithic Kernel只有在效率上相对Micro Kernel有优势,并且已经有学者的研究结果表明Micro Kernel的效率经过优化并不比Monolithic Kernel差。从设计角度,当年Linus在讨论中也一定程度上同意了这个观点。&br&&br&那么为什么Linus还是采用Monolithic Kernel作为Linux的设计模型呢?首先,Linux本身在实现之初仅仅作为Linus一个业余项目而存在。而Monolithic Kernel由于不需要处理消息队列等等原因从实现角度来说比Micro Kernel更为方便,我个人认为这是Linus采用Monolithic Kernel的原因之一。其他原因可能是他本人从情感上喜欢这一架构,也可能他顺延模仿的Unix或者认为现有Micro Kernel消息传递的实现代码很ugly。但这些原因并不是重点,重点在于他的作品与采用Micro Kernel的Minix相比,它的易用性更好。&br&&br&Minix为了尽可能兼容更多的硬件设备,做到更加全面的兼容性,在实现上尽量避免利用单一某种处理器的新特性,这也是导致其效率不高的原因之一。而Linux则认为操作系统只需要对用户态程序保持统一的API即可保证兼容性,底层硬件的驱动等支持可以扩充,并且工作量不大。在编写Linux的开始阶段,仅支持在当时使用人数占多数的i386架构,但在内存管理,网络等模块上实现均优于Minix,因此取得了大量用户的支持,并最终流行。&br&&br&回到这个问题,Linux保持Monolithic Kernel设计的原因是,Linux在这种架构上可以实现的足够好(现在的Linux Kernel也证明了这一点),即使费很大力气切换到Micro Kernel架构并不会获得什么优势。同时,这些不代表Micro Kernel从今天的角度来看设计就劣于Monolithic Kernel。通过种种途径的优化总可以变得完善。Nokia的Symbian系统也统治了一段时间。所以归根到底,决定一款产品是否成功的要素不仅仅取决于它的设计,也在于它的实现。很有意思的是,计算机领域往往经过完善设计的产品最终结果都是失败了,像UNIX赢了Multics,设计很好的Lisp并没有C语言流行, 又像同设计OSI的愿景最后由TCP/IP协议完成。这篇Worse is Better就是说的这个道理:&a href=&/WorseIsBetter.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Worse Is Better&i class=&icon-external&&&/i&&/a&&br&&br&另外&a class=&member_mention& data-hash=&361cb6f59fa28f664bad5fab8871b0cf& href=&/people/361cb6f59fa28f664bad5fab8871b0cf& data-tip=&p$b$361cb6f59fa28f664bad5fab8871b0cf&&@王垠&/a&可能对System领域了解不是很深:) 操作系统保护内存的原因并不是因为C语言的限制。操作系统设计的目的是为了方便用户态程序不用过于关心硬件的底层细节,为用户态程序提供各种系统资源的抽象。而内存隔离的目的一是为了用户态程序不影响其他用户态程序的状态,二是为了操作系统本身的安全性,状态不被用户态程序所修改。而C语言的指针操作只是对内存访问的一种直接描述罢了,并不是C语言影响了操作系统或者处理器的设计。其他动态类型检查的比较,由于我对程序语言领域没有很多了解,所以没有办法评论。最后补充一下宏内核的宏的意思是大,即将内存管理,文件系统等模块均置于内核态,所以是Monolithic,而不是Macro这个宏:)
作为一个在System方向实验室待过的同学来稍微补充一下这个问题的答案。 的答案更多是从Monolithic Kernel和Micro Kernel的设计角度比较优劣,这个话题争论的时间比较久,也需要蛮长篇幅来说。就本问题来说,“Linux为什么坚持使用Monolithic Kern…
grub 本身就是一个系统,它与 linux 无关,你可以用 grub 启动 windows。&br&&br&grub 系统在引导区,它从引导区直接启动,并内置了文件系统,所以不存在鸡蛋问题。&br&&br&在 grub 中选择内核的过程,全部都由 grub 这个系统控制,与 linux 无关,此时 linux 还根本没有启动。&br&&br&grub 这个系统读取了 /boot/grub.conf,然后引导了 linux 内核之后,才把控制权交给 linux 系统,之后才是 linux 的事,所以读取 grub.conf 与 linux 内核没有任何关系。
grub 本身就是一个系统,它与 linux 无关,你可以用 grub 启动 windows。grub 系统在引导区,它从引导区直接启动,并内置了文件系统,所以不存在鸡蛋问题。在 grub 中选择内核的过程,全部都由 grub 这个系统控制,与 linux 无关,此时 linux 还根本没有启…
市场份额问题,以前,pc端只有1% Linux 份额,MacOS 也不到10%,自然别人不做。&br&&br&现在有了移动平台。android Linux 份额这么高,虽然是 openGL 各产商也得做。iOS平台同理,你有市场份额,再偏的技术厂家也会抢着开发。&br&&br&所以这些根本就不是技术问题。&br&&br&另外,现在macosx平台其实也有游戏,例如魔兽世界什么的还是有mac版的。osx份额其实已经超10%了。
市场份额问题,以前,pc端只有1% Linux 份额,MacOS 也不到10%,自然别人不做。现在有了移动平台。android Linux 份额这么高,虽然是 openGL 各产商也得做。iOS平台同理,你有市场份额,再偏的技术厂家也会抢着开发。所以这些根本就不是技术问题。另外,现…
因为做驱动实在是&b&太麻烦了&/b&。&br&&br&没做过操作系统的developer都认为开发操作系统最复杂的是内核,这话说的也没错,但也不能说完全对,开发操作系统最麻烦的地方在于驱动。&br&&br&一个经典的操作系统内核,刨除驱动,可能就几百KB到几MB之间,不会太大。这就是说,如果有一个团队,技术足够NB的话,设计一个差不多的(注意:我说的是差不多的,可不是说完美的)内核不需要消耗太长时间(不会超过3-5年吧,快的话1-2年也是有一定可能的)。&br&&br&但是驱动真是个大麻烦,翻翻Linux内核源码,真正的内核调度器、内存管理的代码没多少,大量的代码都是驱动,因为要兼容各种各样的硬件。&br&&br&同样的,Windows的内核文件是NTOSKRNL.EXE,也是几MB大小,但再看看system32\drivers\下面有多少驱动?&br&&br&开发驱动和开发内核不同,开发驱动需要硬件厂商给资料,并非所有厂商都愿意合作,所以后果就是一个OS用的越广泛,厂商越是愿意协助开发对应的驱动,一个OS用的越少,厂商越不愿意给资料。&br&&br&目前比较成熟的内核里,驱动比较多的就只有Linux,所以Linux的驱动也越来越多,而如果要另起炉灶,写内核容易,写驱动难啊。&br&&br&而一个操作系统想用起来,没有硬件支持是不行的,所以最终各个国家/企业凡是要“自主研发”操作系统的时候,首先想到的就是Linux,原因也是因为实在没有办法去写那么多驱动。&br&&br&写内核,在x86平台上,感谢intel公开了这么多的资料,一个计算机专业毕业的稍微NB一点的学生给一年的时间都能写出来一个能用的内核(仅限于能用,好不好另说),而且资料特别多。&br&&br&写驱动,举个例子:XHCI的驱动,不给资料,别说1年了,十年都写不出来,甚至可能XHCI是什么都不知道(注:这是USB3.0控制器)&br&&br&当然了,要是有足够多的钱,能不能把驱动和内核都重写了?能,肯定能,但那肯定是要很多人和很多钱。&br&&br&微软有那么多的工程师,大部分都是写驱动的,并且还有大量代码能重用的情况下,也是隔1-2年才出一个版本,如果从Windows1.0开始算,都快有30年了,这么多年才做出这么多驱动(并且还有一些不是他们自己做的),可见开发驱动得投入多少人。
因为做驱动实在是太麻烦了。没做过操作系统的developer都认为开发操作系统最复杂的是内核,这话说的也没错,但也不能说完全对,开发操作系统最麻烦的地方在于驱动。一个经典的操作系统内核,刨除驱动,可能就几百KB到几MB之间,不会太大。这就是说,如果有…
不是太难,关键还是需要兴趣,如果你真的想刨根问底,没什么能挡住你。&br&最基本的有几个部分:&br&1 bootloader, 你是用个现成的grub还是自己写,很多人就倒在这一步了。&br&2 内存管理&br&3 进程管理&br&4 中断和系统调用&br&5 文件系统, &br&当然可以折腾的很多,但最好还是先把这些弄出来,才可称之为一个操作系统。&br&资料都有,你可以参考: &br&&a href=&http://wiki.osdev.org/Main_Page& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Expanded Main Page&i class=&icon-external&&&/i&&/a&。&br&&a href=&http://www.jamesmolloy.co.uk/tutorial_html/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JamesM's kernel development tutorials&i class=&icon-external&&&/i&&/a&&br&xv6的代码也不错,文档齐全,&a href=&http://pdos.csail.mit.edu/6.828/2012/xv6.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Xv6, a simple Unix-like teaching operating system&i class=&icon-external&&&/i&&/a&&br&在GitHub无数个人在折腾自己的操作系统,&a href=&/SamyPesse/How-to-Make-a-Computer-Operating-System& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SamyPesse/How-to-Make-a-Computer-Operating-System 路 GitHub&i class=&icon-external&&&/i&&/a&。&br&&a href=&/subject/3735649/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Orange'S:一个操作系统的实现 (豆瓣)&i class=&icon-external&&&/i&&/a& 可以参考,只是有很多部分其实可以不用汇编写了。&br&James的那个教程还是入门最好的。&br&&br&你要做的就是准备好时间,做,看,做,看...
不是太难,关键还是需要兴趣,如果你真的想刨根问底,没什么能挡住你。最基本的有几个部分:1 bootloader, 你是用个现成的grub还是自己写,很多人就倒在这一步了。2 内存管理3 进程管理4 中断和系统调用5 文件系统, 当然可以折腾的很多,但最好还是先把这…
或许这样的标题,应该是由像Linus或Greg KH这样的大师级的高手才有资格写的吧。但是作为我来说,也许我更想把这个标题作为一个疑问句来使用,整理一下自己的认识,用来勉励自己,和大家一起努力实现这个目标。认识肤浅的地方,还请大家见谅。&br&&br& 从事嵌入式开发是当下比较热门的一个领域,做职业规划的时候,比较清晰的是有三条路可以走:&br&&b&C1&/b&、嵌入式软件开发工程师 &br&&b&C2&/b&、嵌入式硬件开发工程师 &br&&b& C3&/b&、嵌入式驱动开发工程师。&br&&br&
C1是计算机相关专业的同学可以选择的,因为学习的课程相对偏软,平时在PC上编程比较多,做软件开发会相对轻松。&br&
C2是学习电子电路的同学可以考虑,对模拟电路比较熟悉,可以设计出质量好的电路板。&br&
C3的难度比较大,需要同时熟悉软件和硬件,真正的做到软、硬相结合,搭建软件和硬件互通的桥梁,当然了在业界的待遇也是相对来说比较高的。&br&&br& 我们可以去一些招聘网站查看相关企业的岗位要求,这样学习的时候就有了一个比较明确的目标。今天看到一位前辈的博文,谈究竟应该如何成为优秀的驱动开发工程师,很受鼓舞,在此与大家分享共勉。&br&--------------------------------------------------------------&br&&strong&何谓优秀的驱动开发工程师&/strong&&strong&&/strong&&br&
首先要定义,我所认为的一个优秀的驱动开发工程师,应该具备什么样的能力,这里列一下按照从易到难的顺序,个人认为应该会有几个方面的要求吧:&br&&br&&ul&&li&能够独立完成驱动的功能开发任务&/li&&li&能够分析和优化驱动的性能,针对特定硬件扬长避短&/li&&li&能够充分了解模块相关软硬件能力、发展方向,辅助应用工程师最大化利用硬件能力&/li&&li&能够辅助硬件工程师规划硬件设计,预防问题,谋求功能模块的最佳方案&/li&&li&能够协助定义系统架构,合理规划软硬件,谋求产品实现的最佳方案&/li&&/ul&&br&&br&
作为一个驱动工程师,很多时候不是完全从头开发一个完整的子系统,而是针对特定硬件和平台移植驱动,增加功能,解决Bug等等,如果从这方面外在的表现来看:&br&&br&解决问题的境界,大概会有这么几个阶段:&br&&br&&ul&&li&
不知道哪里存在BUG&/li&&li&
不知道如何解决BUG&/li&&li&
知道如何解决BUG&/li&&li&
知道如何发现BUG&/li&&li&
知道如何规划BUG&/li&&/ul&&br&&br&
知道如何发现BUG(而不是撞上BUG)其实并不简单,需要你对系统有足够的了解,能够察觉可能出问题的地方。 而规划Bug更难,需要你能对问题的轻重缓急做出准确的判断。没有的完美的世界,只有适当的取舍,规避和预防。&br&&br&而从解决问题过程的角度来看,我认可以分为几个阶段:&br&&br&&ul&&li&
BUG发生 -& 大量跟踪调试代码 -& 终于发现并解决BUG&/li&&li&
BUG发生 -& 理论推测可能原因 -& 迅速定位并解决BUG&/li&&li&
阅读代码 -& 预测可能出现的BUG -& 证实并解决BUG&/li&&/ul&&br&--------------------------------------------------------------- &br&&strong&应该具备怎样的素质&/strong&&strong&&/strong&&br&那么要达到上诉最佳境界,需要具备和发展哪些素质和能力呢?&strong&&/strong&&br&&br&&strong&一、足够的硬件知识&/strong&&strong&&/strong&&br&能看简单的原理图,能够分析硬件异常的可能原因,能够使用常见的&strong&硬件调试工具&/strong&,我想这是做为优秀的驱动工程师,区别与其它软件工程师,所不可避免、必须具备的专业素质。当然取决于你具体从事的工作,对这方面的要求不尽相同。&br&
对于驱动开发者来说,不了解所开发驱动外设的硬件原理和相关背景知识,也许很多时候,也能够完成一些移植,修补的工作任务,但这就好比无源之水,无根之木,我相信是很难走远的。&br&&br&&strong&二、多多益善的操作系统知识&/strong&&strong&&/strong&&br&做驱动开发,特别是纯粹的外设的驱动移植工作,刚开始的时候,也许你并不需要了解很多操作系统本身的知识(像内存管理,进程调度,锁,各种内核子系统的原理框架等等),也能顺利完成手头的一些工作。&br&但是,如果一但需要优化驱动,需要完善软件框架,或者是遇上疑难问题需要跟踪解决,对操作系统,内核本身的了解,就体现出它的价值了。&br&对于Linux内核驱动开发者,尤其如此,首先,代码是完全开源的,你有条件去了解背后的运行机制,其次,&strong&Linux&/strong&&strong&内核和各个组成子系统总是在迅速的进化发展中,不进则退,你也有必要跟上时代发展的脚步。&/strong&&strong&&/strong&&br&&br&&strong&三、强烈的好奇心,持续的热情&/strong&&strong&&/strong&&br&如果驱动开发不仅仅是你的爱好,更是你养家糊口的途径,我想,很多时候,你大概不会有机会专注于一两个你最有经验的模块的开发和维护。随着能力的成长,势必会要求你接触和掌握越来越多的各式各样的驱动模块的开发。&br&对于这件事,包括我自己,有时候大概都会有如下几种反应:&br&&br&哇,原来的工作做太久了,太乏味了,很高兴能做不同的工作。&br&啊?又要做别的模块啊?我手头的工作已经太多了!&br&这个模块没意思,我不想做。&br&&br&相信多数有志青年们都是第一种表现了,不过,有些时候,我发觉,很多人的这种热情其实并不持久,&strong&一个新的模块没做多久,就再次厌倦了,是已经炉火纯青了么,未必,或许只是修改了几个&/strong&&strong&BUG&/strong&&strong&以后不甚其烦。&/strong&很多时候,我面试前来求职的工程师时,发现简历上这个也做过,那个也做过,但是一旦问到解决了什么问题,所做过的驱动,框架、流程、原理之类的问题的时候,就一问三不知了。&br&&br&我觉得如果自己的目标是优秀,那么最起码的标准应该是对具体驱动模块相关的子系统的整体工作流程,框架,具备足够的好奇心,乐于去了解和学习,而不仅仅是为了完成任务而工作,否则的话,很难积累下扎实的经验和技术。&br&&br&&strong&四、清晰的逻辑思维能力&/strong&&strong&&/strong&&br&这一点,也许是个软件开发人员都应该具备吧,不过,做为驱动开发工程师来说,有时候,大多数情况下,工作的硬件环境并不是完美的,遇到问题需要分析判断错误的原因是硬件问题还是驱动Bug,这时候,清晰的逻辑思维能力尤其重要。&br&&br&&strong&五、良好的工作习惯&/strong&&strong&&/strong&&br&大多数人都不是天才,要成为优秀的开发工程师,其一需要持续努力,其二需要时间积累经验,而这过程中,很重要的一点,就是要有良好的工作习惯。譬如,注意设计文档的维护,对工作中遇到的问题的记录,过往经验的及时记录,适当的软件开发流程等等。文档工作,可能很多人很不愿意去做,它的确很花费时间。不过,唉。。。老啦,好记性不如烂笔头啊 。当然,其实设计文档更多的是为你提供思考的机会,而过往经验的总结,也可以起到和大家交流技术,共同进步的目的。&br&&br&&strong&六、英语&/strong&&strong&&/strong&&br&这个也是必须的啦,没有办法,邮件列表,技术文档,社区,精通英语肯定是很大的优势,做开源项目尤其如此。阅读各种Spec标准文档之类的速度还是很重要的。阅读无障碍是一回事,能和母语一样一目十行,那才爽呀,唉,人生苦短,效率啊!光读文档,就不知道要比老外多花多少时间。&br&参考资料:&br&1、colorant的专栏: &a href=&http://blog.csdn.net/colorant/article/details/2758947& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/colorant/&/span&&span class=&invisible&&article/details/2758947&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
或许这样的标题,应该是由像Linus或Greg KH这样的大师级的高手才有资格写的吧。但是作为我来说,也许我更想把这个标题作为一个疑问句来使用,整理一下自己的认识,用来勉励自己,和大家一起努力实现这个目标。认识肤浅的地方,还请大家见谅。 从事嵌入式开…
事实一:操作系统内核是软件工业里需求最为稳定的一类软件。内核有天然的屏障可以防止 GPL 等许可证的传染。更不用说还有很多类似 BSD 许可的软件。&br&&br&事实二:大量人员参与的开源工程适合需求稳定并且不需要和用户直接打交道的底层软件。&br&&br&事实三:Microsoft 决定开发服务器操作系统时,Linux 内核还不成熟,BSD 内核正在经受法律纠纷。&br&&br&事实四:Microsoft 在关于版权的法律上是极端保守派。试图避免任何的法律不确定性。&br&&br&所以,结论是,Microsoft 由于「事实四」的极端偏执,不顾「事实一」和「事实二」的优势,无限夸大「事实三」的不确定性。致使其在操作系统方面采取了一条和业界其它公司都截然不同的道路。这条道路在软件没有形成标准化之前是行得通的,因为那时候一个低廉的通用硬件平台(Wintel)带来的价格优势远远超过违背「事实一」和「事实二」带来的成本和稳定性劣势。但是在应用软件形成标准化之后,特别是 Web 流行之后,这条路带来的成本维护劣势就高于能采用通用硬件平台的优势了。
事实一:操作系统内核是软件工业里需求最为稳定的一类软件。内核有天然的屏障可以防止 GPL 等许可证的传染。更不用说还有很多类似 BSD 许可的软件。事实二:大量人员参与的开源工程适合需求稳定并且不需要和用户直接打交道的底层软件。事实三:Microsoft 决…

我要回帖

更多关于 思密达是什么意思 的文章

 

随机推荐