2006-12-09
关于学习操作系统编程
关键字: 操作系统 C++
写这篇是因为simohayha在C++圈子里的留言:
希望圈子能专门开个报道贴,置顶的。
然后就是不知道老大们对linux源码了解多少?希望能就此发些文章,哈哈。
本来是想在留言里面回simohayha的,结果越写越多,改成博客算了,也许对别人也有帮助。没什么中心思想,大家胡乱看看。
我在读大学的时候是努力试图学习过linux源码的,在机房里打印出厚厚一叠纸,闷在计算机旁边猛看了好几天,饭也没好好吃,那些纸的质量不太好,有股怪味,空着肚子钻研,到后来闻那股味道,差点呕吐,于是放弃,出去大吃了一顿。
这是上世纪末的事情了,那时其实水平还没到,心里好奇,完全是赖蛤蟆想吃天鹅肉。学习这个事情,还是得循序渐进的。
要想学深入学习操作系统,推荐从这本书开始: Operatiing Systmes, Design and Implementation (by Tanenbaum, Woodhull),里面有个用于教学的操作系统Minix。Linux的某些方面,现在还可以找到Minix的影子。
我手里的这本书,是第二版,现在书最新版是第三版。Minix 3.0,也已经有点难度了, X Window System都有了。http://www.minix3.org/
要是觉得还是太复杂,还有个更简单的GeekOS,http://geekos.sourceforge.net/
OS的设计是受限于硬件的,尤其是CPU。当代OS的不同进程之间的内存保护,虚拟地址,都要通过硬件。所以对一个CPU的深刻了解,必不可少。对于Intel的CPU,应该读下面三本:
1. Intel Architecture Software Developer's Manual, Volume 1: Basic Architecture http://www.intel.com/design/PentiumII/manuals/243190.htm
2. Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference Manual http://www.intel.com/design/PentiumII/manuals/243191.htm
3. Intel Architecture Software Developer’s Manual Volume 3: System Programming http://www.intel.com/design/PentiumII/manuals/243192.htm
尤其是第三本,编OS必看,虚拟内存,内存保护的东西全在里面。
操作系统里面代码最多的,实际是IO部分,理论不多,可事关重要。Mindshare出了一系列书,写的非常深入详细。http://www.mindshare.com/
学汇编开始直接学CISC的指令集太费劲了,推荐先从RISC汇编开始,西方大学计算机专业走的也是这条路。可以看的一本书是Introduction to RISC Assembly Language Programming,by John Waldron。里面用的处理器MIPS,可以下载个SPIM Simulator,在PC上跑。http://www.cs.wisc.edu/~larus/spim.html
Knuth老先生在The Art of Computer Programming一书里的例子,都是汇编,现在用的虚拟机是访RISC设计的,叫做MMIX,Knuth写了本书,叫做MMIXware, A RISC Computer for the Third Millennium, 呵呵,口气好大啊。
讲计算机架构的两本计算机学科经典书,是Patterson和Hennessy合写的两本:Computer Organization and Design: The Hardware/Software Interface 3rd edition,以及Computer Architecture, Fourth Edition: A Quantitative Approach
学汇编要注意一点,每个汇编器,其语法都不一样。在Windows下面写汇编,微软的Macro Assembler不是很合适,里面的Macro太多,都赶上高级语言了。有个开源的Netwide Assembler, http://sourceforge.net/projects/nasm, 倒是挺不错,推荐使用。
关于学习操作系统内核,如果不是非抱着Linux的话,BSD是个挺好的选择。代码的结构可能还清晰些。我有一台FreeBSD服务器,基本非常满意,有两点不足,MySQL是针对Linux优化的,在FreeBSD下性能不够好,但是根据Yahoo的人说(Yahoo用FreeBSD),FreeBSD最新版下用MySQL threading library重新编译性能可以接受了。Java也不尽如意,Sun 现在提供Java 5的binary给FreeBSD。但我在FreeBSD如果启动Tomcat开的内存太大,启动会失败。
想看看FreeBSD的源码,可以看看这里:http://www.leidinger.net/FreeBSD/src_docs/,里面列的都是内核各个部分的Code Reference Manual。里面那个讲kernel的文件有23M,共2205页,可见钻研这些是件极为费时费力的事情。
http://www.chinaunix.net/也有很多BSD的资料。
现在主流操作系统,就两大家了,一边是微软的以NT为内核的Win2k/XP/2003/Vista,另一边是以UNIX为根基的Linux/BSD/Solaris等等.
Tanenbaum说过这么一句话,操作系统是什么呢,就是操作系统定义的API。
学习Windows下的API,容易许多,资料全,另外Jeffrey Richter的Programming Application for MS Windows那本书写的太好了,Process, Job, Thread, Fiber, Critical Section, Event, Waitable Timer, Semaphore, Mutex,Virtual Memory, IO,写的非常详尽清楚。要是Linux/BSD下面也有这么一本书,该有多好啊。Linux, BSD里面的线程,家家各有不同,把人搞得糊里糊涂。
如果从研究操作系统是怎么实现的,那么正好反过来,Linxu/BSD/Solaris简单明了多了.除了代码公开,他们内部结构没有Windows那么复杂。Windows的源码,要是成为微软的MVP,也是可以看到的。Windows 2000的大部分源码,还泄露出来了,在网上流传了一阵子。
我个人觉得搞应用的去学习编译器回报可能更大,首先就是对语言了解很深入,写码,读码容易。如果会了编译器前台技术,可以自己写个分析代码的程序啊,那么读别人的码不久容易很多。现在虽然有现成的源码分析器,但是想想你有个数据库,一种是只能使用别人写好的界面,一种是可以用SQL自由查找,哪个好?如果学会了编译器后台技术,恭喜你,写任何一行代码都知道在计算机里怎么执行的,这是一种多么自由自在的境界啊。
simohayha 写道
希望圈子能专门开个报道贴,置顶的。
然后就是不知道老大们对linux源码了解多少?希望能就此发些文章,哈哈。
本来是想在留言里面回simohayha的,结果越写越多,改成博客算了,也许对别人也有帮助。没什么中心思想,大家胡乱看看。
我在读大学的时候是努力试图学习过linux源码的,在机房里打印出厚厚一叠纸,闷在计算机旁边猛看了好几天,饭也没好好吃,那些纸的质量不太好,有股怪味,空着肚子钻研,到后来闻那股味道,差点呕吐,于是放弃,出去大吃了一顿。
这是上世纪末的事情了,那时其实水平还没到,心里好奇,完全是赖蛤蟆想吃天鹅肉。学习这个事情,还是得循序渐进的。
要想学深入学习操作系统,推荐从这本书开始: Operatiing Systmes, Design and Implementation (by Tanenbaum, Woodhull),里面有个用于教学的操作系统Minix。Linux的某些方面,现在还可以找到Minix的影子。
我手里的这本书,是第二版,现在书最新版是第三版。Minix 3.0,也已经有点难度了, X Window System都有了。http://www.minix3.org/
要是觉得还是太复杂,还有个更简单的GeekOS,http://geekos.sourceforge.net/
OS的设计是受限于硬件的,尤其是CPU。当代OS的不同进程之间的内存保护,虚拟地址,都要通过硬件。所以对一个CPU的深刻了解,必不可少。对于Intel的CPU,应该读下面三本:
1. Intel Architecture Software Developer's Manual, Volume 1: Basic Architecture http://www.intel.com/design/PentiumII/manuals/243190.htm
2. Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference Manual http://www.intel.com/design/PentiumII/manuals/243191.htm
3. Intel Architecture Software Developer’s Manual Volume 3: System Programming http://www.intel.com/design/PentiumII/manuals/243192.htm
尤其是第三本,编OS必看,虚拟内存,内存保护的东西全在里面。
操作系统里面代码最多的,实际是IO部分,理论不多,可事关重要。Mindshare出了一系列书,写的非常深入详细。http://www.mindshare.com/
学汇编开始直接学CISC的指令集太费劲了,推荐先从RISC汇编开始,西方大学计算机专业走的也是这条路。可以看的一本书是Introduction to RISC Assembly Language Programming,by John Waldron。里面用的处理器MIPS,可以下载个SPIM Simulator,在PC上跑。http://www.cs.wisc.edu/~larus/spim.html
Knuth老先生在The Art of Computer Programming一书里的例子,都是汇编,现在用的虚拟机是访RISC设计的,叫做MMIX,Knuth写了本书,叫做MMIXware, A RISC Computer for the Third Millennium, 呵呵,口气好大啊。
讲计算机架构的两本计算机学科经典书,是Patterson和Hennessy合写的两本:Computer Organization and Design: The Hardware/Software Interface 3rd edition,以及Computer Architecture, Fourth Edition: A Quantitative Approach
学汇编要注意一点,每个汇编器,其语法都不一样。在Windows下面写汇编,微软的Macro Assembler不是很合适,里面的Macro太多,都赶上高级语言了。有个开源的Netwide Assembler, http://sourceforge.net/projects/nasm, 倒是挺不错,推荐使用。
关于学习操作系统内核,如果不是非抱着Linux的话,BSD是个挺好的选择。代码的结构可能还清晰些。我有一台FreeBSD服务器,基本非常满意,有两点不足,MySQL是针对Linux优化的,在FreeBSD下性能不够好,但是根据Yahoo的人说(Yahoo用FreeBSD),FreeBSD最新版下用MySQL threading library重新编译性能可以接受了。Java也不尽如意,Sun 现在提供Java 5的binary给FreeBSD。但我在FreeBSD如果启动Tomcat开的内存太大,启动会失败。
想看看FreeBSD的源码,可以看看这里:http://www.leidinger.net/FreeBSD/src_docs/,里面列的都是内核各个部分的Code Reference Manual。里面那个讲kernel的文件有23M,共2205页,可见钻研这些是件极为费时费力的事情。
http://www.chinaunix.net/也有很多BSD的资料。
现在主流操作系统,就两大家了,一边是微软的以NT为内核的Win2k/XP/2003/Vista,另一边是以UNIX为根基的Linux/BSD/Solaris等等.
Tanenbaum说过这么一句话,操作系统是什么呢,就是操作系统定义的API。
学习Windows下的API,容易许多,资料全,另外Jeffrey Richter的Programming Application for MS Windows那本书写的太好了,Process, Job, Thread, Fiber, Critical Section, Event, Waitable Timer, Semaphore, Mutex,Virtual Memory, IO,写的非常详尽清楚。要是Linux/BSD下面也有这么一本书,该有多好啊。Linux, BSD里面的线程,家家各有不同,把人搞得糊里糊涂。
如果从研究操作系统是怎么实现的,那么正好反过来,Linxu/BSD/Solaris简单明了多了.除了代码公开,他们内部结构没有Windows那么复杂。Windows的源码,要是成为微软的MVP,也是可以看到的。Windows 2000的大部分源码,还泄露出来了,在网上流传了一阵子。
我个人觉得搞应用的去学习编译器回报可能更大,首先就是对语言了解很深入,写码,读码容易。如果会了编译器前台技术,可以自己写个分析代码的程序啊,那么读别人的码不久容易很多。现在虽然有现成的源码分析器,但是想想你有个数据库,一种是只能使用别人写好的界面,一种是可以用SQL自由查找,哪个好?如果学会了编译器后台技术,恭喜你,写任何一行代码都知道在计算机里怎么执行的,这是一种多么自由自在的境界啊。
评论
小帽子
2007-05-23
引用
为什么一说操作系统编程就是“写一个操作系统”啊?
9494 大部分是DRIVE 还是写LX上的实用程序比较好 既满足了自己对OS的好奇 有带来了一定的效益
simohayha
2007-05-11
hurricane1026 写道
黑眼豆豆 写道
提供一下这本书的下载地址
Operating Systems Design and Implementation, Third Edition
http://cpp.ga-la.com/downloads/ebooks/os/os_d&i_stdcpp.cn.rar
Operating Systems Design and Implementation, Third Edition
http://cpp.ga-la.com/downloads/ebooks/os/os_d&i_stdcpp.cn.rar
买吧。。。才20+,还能找到更便宜的么?
jebtang
2007-03-08
sp42 写道
lighter 写道
写任何一行代码都知道在计算机里怎么执行的,这是一种多么自由自在的境界啊。 .
人机合一啊!!记得中科院计算所的博士生的一个作业就是从最底层的寄存器操作到word application去解释一个word文档的open的全过程。
刑天战士
2007-02-25
发觉很多操作系统黑客喜欢用trick解决问题,而不是倾向于使代码好懂。而且对于很多函数,变量的命名过于随便,使得像我这样的初学者望而生畏……
七猫
2007-02-23
Elminster 写道
为什么一说操作系统编程就是“写一个操作系统”啊?
写一个完整的操作系统,在今天早就远远超出了一个人所能负担的界限,特别是今天的操作系统里面有很大一块其实是各种驱动程序(这个倒真的是体力活),个人根本做不了。但有些事情还是很有趣、很值得一做的,比方说给 linux/free bsd 的 kernel 贡献一点东西。我印象里面 Redhat 搞 NPTL 的小组就没几个人,现在这个东西已经是 linux 下面线程的标准实现了。当然那个组有大牛压阵,可能听起来夸张一点,那么换一个我身边的例子好了:我一个朋友当初的毕业论文,就是把 linux 的 kernel 架到一个 RTOS 上面,这样凡是没有硬实时要求的东东都可以扔到 linux 里面去跑,省的重新在 RTOS 下面实现。挺有意思的一个东西,工程量也不大,一个人几个月就搞定了。
写一个完整的操作系统,在今天早就远远超出了一个人所能负担的界限,特别是今天的操作系统里面有很大一块其实是各种驱动程序(这个倒真的是体力活),个人根本做不了。但有些事情还是很有趣、很值得一做的,比方说给 linux/free bsd 的 kernel 贡献一点东西。我印象里面 Redhat 搞 NPTL 的小组就没几个人,现在这个东西已经是 linux 下面线程的标准实现了。当然那个组有大牛压阵,可能听起来夸张一点,那么换一个我身边的例子好了:我一个朋友当初的毕业论文,就是把 linux 的 kernel 架到一个 RTOS 上面,这样凡是没有硬实时要求的东东都可以扔到 linux 里面去跑,省的重新在 RTOS 下面实现。挺有意思的一个东西,工程量也不大,一个人几个月就搞定了。
这个比较现实一些。而且中国不像外国是福利国家。先填饱肚子吧。
sp42
2007-02-15
lighter 写道
写任何一行代码都知道在计算机里怎么执行的,这是一种多么自由自在的境界啊。 .
人机合一啊!!
avi2
2006-12-20
介绍的真的很不错
geekos到真的不错,是一个值得学习的操作系统
geekos到真的不错,是一个值得学习的操作系统
lix23
2006-12-17
我要是对操作系统的架构,各模块作用有个较深入了解,也就满足了。
刑天战士
2006-12-15
最好的办法是找个小的不能再小的操作系统,然后给他添加功能……
Elminster
2006-12-12
为什么一说操作系统编程就是“写一个操作系统”啊?
写一个完整的操作系统,在今天早就远远超出了一个人所能负担的界限,特别是今天的操作系统里面有很大一块其实是各种驱动程序(这个倒真的是体力活),个人根本做不了。但有些事情还是很有趣、很值得一做的,比方说给 linux/free bsd 的 kernel 贡献一点东西。我印象里面 Redhat 搞 NPTL 的小组就没几个人,现在这个东西已经是 linux 下面线程的标准实现了。当然那个组有大牛压阵,可能听起来夸张一点,那么换一个我身边的例子好了:我一个朋友当初的毕业论文,就是把 linux 的 kernel 架到一个 RTOS 上面,这样凡是没有硬实时要求的东东都可以扔到 linux 里面去跑,省的重新在 RTOS 下面实现。挺有意思的一个东西,工程量也不大,一个人几个月就搞定了。
写一个完整的操作系统,在今天早就远远超出了一个人所能负担的界限,特别是今天的操作系统里面有很大一块其实是各种驱动程序(这个倒真的是体力活),个人根本做不了。但有些事情还是很有趣、很值得一做的,比方说给 linux/free bsd 的 kernel 贡献一点东西。我印象里面 Redhat 搞 NPTL 的小组就没几个人,现在这个东西已经是 linux 下面线程的标准实现了。当然那个组有大牛压阵,可能听起来夸张一点,那么换一个我身边的例子好了:我一个朋友当初的毕业论文,就是把 linux 的 kernel 架到一个 RTOS 上面,这样凡是没有硬实时要求的东东都可以扔到 linux 里面去跑,省的重新在 RTOS 下面实现。挺有意思的一个东西,工程量也不大,一个人几个月就搞定了。
lixigua
2006-12-11
不一定要去做一个实用的操作系统阿,满足点好奇心而已阿-----不是学什么都能带来经济效益的,求知快乐而已。
一直有想法,有时间的时候还是要学学操作系统实现,心里老想着要见识操作系统的一点皮毛,现在一点皮毛都不懂,郁闷得很。
一直有想法,有时间的时候还是要学学操作系统实现,心里老想着要见识操作系统的一点皮毛,现在一点皮毛都不懂,郁闷得很。
Arath
2006-12-11
基本如此,而且操作系统的推广不是一朝一夕可以完成的,即使你做出了比windows安全10000倍,好用100倍的操作系统,如果推广不力也只能是实验室里的花朵
runes
2006-12-11
Arath 写道
介绍的不错,加个精~
操作系统需要百倍的耐心和仔细,相关的核心技术实际上现在都已成熟,自我突破的空间比较小了。
而且正如楼主所说,写操作系统必须得到硬件厂家的全力支持,否则基本上是很难过的。
至于编译器...回报不会很高的。
操作系统需要百倍的耐心和仔细,相关的核心技术实际上现在都已成熟,自我突破的空间比较小了。
而且正如楼主所说,写操作系统必须得到硬件厂家的全力支持,否则基本上是很难过的。
至于编译器...回报不会很高的。
我感觉,有机会试着做做这两个东东 demo级的,就够了,切身的知道到底是咋回事就行了,破除一下心中的“好奇”。
以国内目前的状况,如果是以专业的心态去搞它,闹不好最后弄个 “曲高和寡”。
Arath
2006-12-11
qiezi 写道
Arath 写道
介绍的不错,加个精~
操作系统需要百倍的耐心和仔细,相关的核心技术实际上现在都已成熟,自我突破的空间比较小了。
而且正如楼主所说,写操作系统必须得到硬件厂家的全力支持,否则基本上是很难过的。
至于编译器...回报不会很高的。
操作系统需要百倍的耐心和仔细,相关的核心技术实际上现在都已成熟,自我突破的空间比较小了。
而且正如楼主所说,写操作系统必须得到硬件厂家的全力支持,否则基本上是很难过的。
至于编译器...回报不会很高的。
编译器回报挺高啊,看看IronPython, JRuby, 这些家伙们都被大公司收了,有技术的话做个编译器不需要很多人。操作系统就不一样了,那么多人参与,拿到钱的有多少?
不要这么看,那么Windows的回报不高吗?全球首富就是这么诞生的。
而且你去google一下,有多少人在做编译器,有很多听都没有听说过。
最后东西还没做成,分什么钱啊
qiezi
2006-12-11
Arath 写道
介绍的不错,加个精~
操作系统需要百倍的耐心和仔细,相关的核心技术实际上现在都已成熟,自我突破的空间比较小了。
而且正如楼主所说,写操作系统必须得到硬件厂家的全力支持,否则基本上是很难过的。
至于编译器...回报不会很高的。
操作系统需要百倍的耐心和仔细,相关的核心技术实际上现在都已成熟,自我突破的空间比较小了。
而且正如楼主所说,写操作系统必须得到硬件厂家的全力支持,否则基本上是很难过的。
至于编译器...回报不会很高的。
编译器回报挺高啊,看看IronPython, JRuby, 这些家伙们都被大公司收了,有技术的话做个编译器不需要很多人。操作系统就不一样了,那么多人参与,拿到钱的有多少?
Arath
2006-12-11
介绍的不错,加个精~
操作系统需要百倍的耐心和仔细,相关的核心技术实际上现在都已成熟,自我突破的空间比较小了。
而且正如楼主所说,写操作系统必须得到硬件厂家的全力支持,否则基本上是很难过的。
至于编译器...回报不会很高的。
操作系统需要百倍的耐心和仔细,相关的核心技术实际上现在都已成熟,自我突破的空间比较小了。
而且正如楼主所说,写操作系统必须得到硬件厂家的全力支持,否则基本上是很难过的。
至于编译器...回报不会很高的。
taowen
2006-12-11
Elminster 写道
taowen 写道
俺觉得操作系统就是体力活。编译器虽然也是体力活但是更有意思一些。
呵呵,你写过?来分享一下经验吧,我倒是好奇你为啥这么说。
No, I have no experience at all. Sorry.
taowen
2006-12-11
runes 写道
taowen 写道
俺觉得操作系统就是体力活。编译器虽然也是体力活但是更有意思一些。
偶,见过的JAVAEYE有史以来最NB的发言(也就是最牛的牛人现身了),或 吹的最凶的 吹牛贴,到底是哪个,有待 进一步证实,
希望 是前者,出一个真的牛人不容易啊,hoho.......
thanks. I am recalling my words now.
runes
2006-12-11
taowen 写道
俺觉得操作系统就是体力活。编译器虽然也是体力活但是更有意思一些。
偶,见过的JAVAEYE有史以来最NB的发言(也就是最牛的牛人现身了),或 吹的最凶的 吹牛贴,到底是哪个,有待 进一步证实,
希望 是前者,出一个真的牛人不容易啊,hoho.......
Elminster
2006-12-11
editted
- 浏览: 65477 次
- 性别:

- 来自: 斯德哥尔摩

- 详细资料
搜索本博客
我的相册
books-small
共 17 张
共 17 张
最新评论
-
中国大陆高考创意答案
高考怎么还有初中小学的?
-- by bagui3 -
中国大陆高考创意答案
。。。 写道第8条内涵了.....
-- by spyker -
中国大陆高考创意答案
第8条内涵了.....
-- by 。。。 -
中国大陆高考创意答案
这个不是高考的,而且...............火星了哦。
-- by wzgme -
中国大陆高考创意答案
还真没几个能答的上来
-- by anchor






评论排行榜