《使用开源软件-自己动手写操作系统》Rev 2发布

免费电子书《使用开源软件-自己动手写操作系统》的主页在:http://share.solrex.org/WriteOS/ ,您可以到这里下载 pdf 格式电子书和随书源代码。

免费电子书《使用开源软件-自己动手写操作系统》(无法看到此图,可能因为您无法连接国外网站)

2008 年 2 月 21 日发布第一版,拖了十个月我才发布了第二版。虽然有一些懒惰的原因在里面,但更重要的原因是没有很多可以大块利用的时间。从开始动手,才知道写书是一件非常痛苦的工作,尤其是有代码的书。再加上本书目前的主要代码都是汇编语言,一旦出错就要花好长时间调试,代码运行正确了,要在不同的 Linux 进行编译以确保能正确通过,又要加注释、除去冗余指令,代码的工作结束就要接着关注排版、查资料、填补内容、做插图,总之写一天书下来我累得精神都会振奋不起来。

本来打算十月底就发布第二版,但是因为研究工作稍微耽误了一下,就又拖到了十一月底,总之我还是完成了这一章。这一版虽然只增加了第三章,但页码却从 40 页增加到了 104 页,示例代码也从 2 个增加到 10 个,与第一版的工作量不可同日而语。由于这一版的发布周期过长,我在按版本发布的基础上增加了每周发布,也因此在编写过程中得到了不少帮助。

这本书从计划开始就得到很多朋友的肯定,在编写的过程中也得到了很多朋友的帮助。不计刚发布第一版时几乎每天一千次的下载量,从 2008 年 5 月 9 号把所有源代码迁移到 Google Code 项目后,加上每周发布,就有共计两万一千多次下载。我非常感谢大家对我一如既往的支持,感谢那些在我的博客评论或者发电子邮件给我打气的朋友,尤其感谢那些在邮件中或者错误报告页中指出本书错误或者提供很好建议的朋友!

我尤为高兴的是听一位朋友说北京邮电大学某位教授操作系统课程的老师向同学推荐这本电子书,这正与我写这本书的初衷相合,就像我在前言中所说:

本书的最终目标是成为一本大学“计算机操作系统”课程的参考工具书,为学生提供一个step by step 的引导去实现一个操作系统。这不是一个容易实现的目标,因为我本人现在并不自信有那个实力了解操作系统的方方面面。但是我想,立志百里行九十总好过于踯躅不前。

我将继续努力将这本书写下去,也希望大家能够继续对这本书保持关注,并帮助我完善此书。下面是本书这次发布的章节信息,如果您发现本书中的错误(那是不可避免的),或者有更好的建议,请您一定到本书的错误报告页指出,兄弟我将非常感谢!

第三章进入保护模式
3.1 实模式和保护模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1.1 一段历史. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.2 实模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.3 保护模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.4 实模式和保护模式的寻址模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2 与保护模式初次会面. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.1 GDT 数据结构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.2 保护模式下的demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2.3 加载GDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2.4 进入保护模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.2.5 特别的混合跳转指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.2.6 生成镜像并测试. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.3 段式存储. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.3.1 LDT 数据结构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3.2 段描述符属性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3.3 使用LDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.3.4 生成镜像并测试. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.3.5 段式存储总结. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.4 特权级. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.4.1 不合法的访问请求示例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.4.2 控制权转移的特权级检查. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.4.3 使用调用门转移. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.4.4 栈切换和TSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.5 页式存储. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.5.1 分页机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
3.5.2 启动分页机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.5.3 修正内存映射的错误. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.5.4 体验虚拟内存. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.6 结语. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

  1. Adeaman
    2008年11月29日20:46 | #1

    感谢博主,给我们带来这么好的学习资源。你的工作是意义非凡的!

  2. 2008年11月29日22:18 | #2

    我就是来顶一把的,呵呵。

  3. 2008年11月29日22:47 | #3

    down下来看下再说

  4. 2008年11月30日11:09 | #4

    Well done~ 看到完整的第三章新鲜出炉了~~

  5. Mathack
    2008年11月30日19:57 | #5

    超赞!!!!!!!! :-目

  6. xiao hei
    2008年12月2日06:05 | #6

    always back you up!!!

  7. xiao hei
    2008年12月2日06:10 | #7

    对了,我很喜欢你书的灰色背景,看了眼睛很舒服。 :)

  8. mayer
    2008年12月4日14:51 | #8

    很不错的东西,希望一直能做下去,呵呵,顶一个!!

  9. 李小白
    2008年12月9日20:06 | #9

    书写的很不错。
    有个小建议,你能不能在每章后面加上参考书目,或者推荐一些相关书籍。
    如果你觉得这样工作量比较大的话,就当我没说。

  10. rain
    2008年12月21日14:46 | #10

    感谢博主的辛勤劳动。继续加油,顶!

  11. 2009年1月5日14:00 | #11

    非常感谢你的书,很好,很实用,坚持写下去,一颗新星诞生了!
    祝天天开心!

  12. stong
    2009年1月14日23:33 | #12

    什么时候出下一章啊?

  13. songq
    2009年1月18日00:59 | #13

    期待你的下一章,很喜欢你的文章,一定要坚持哦!!!!!!!!!

  14. Tom.z
    2009年1月23日10:53 | #14

    终于有动静了~~

  15. 问路人
    2009年3月8日00:58 | #15

    哇塞 很不错的教材啊 期待下一张

  16. 2009年3月11日18:09 | #16

    以前一上有看LINUX源码分析之类的书籍,到头来,总是不知所以然,很多东西要在很多天后或者更长时间后的一天才能知道一点,现在有了这本书,我想路应该不一样了吧,感谢作者的辛勤工作。

  17. hehe
    2009年3月23日14:01 | #17

    楼主能留个 联系方式么 email / QQ 或者你有没有专门探讨这个系统的QQ群
    很希望能与你交流 能发份emal给我么?

  18. 2009年3月30日16:20 | #18

    牛人啊!

  19. guoqqqqqq
    2009年4月21日19:05 | #19

    博主很年轻啊。

  20. silvester
    2009年5月31日22:44 | #20

    博主:
    您好!这本书非常好!我很喜欢!
    我实践了下代码,发现在第3章6节的例子代码时发现(后面几节都出现这样的错误),运行后出现内核模式栈错误,比如在vmare上说:suffered a stack fault in kernel mode. 在bochs的输出为下面内容:
    00001207852e[CPU0 ] CALL_Ad: offset outside of CS limits
    00001207852e[CPU0 ] interrupt(): gate descriptor is not valid sys seg
    00001207852e[CPU0 ] interrupt(): gate descriptor is not valid sys seg
    00001207852i[CPU0 ] protected mode
    00001207852i[CPU0 ] CS.d_b = 32 bit
    00001207852i[CPU0 ] SS.d_b = 16 bit
    00001207852i[CPU0 ] | EAX=00000011 EBX=00000007 ECX=00000009 EDX=00000100
    00001207852i[CPU0 ] | ESP=00000100 EBP=00007d29 ESI=00007d1f EDI=0000011a
    00001207852i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af PF cf
    00001207852i[CPU0 ] | SEG selector base limit G D
    00001207852i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D
    00001207852i[CPU0 ] | CS:0008( 0001| 0| 0) 0009078d 0000005b 0 1
    00001207852i[CPU0 ] | DS:9000( 0000| 0| 0) 00090000 0000ffff 0 0
    00001207852i[CPU0 ] | SS:9000( 0000| 0| 0) 00090000 0000ffff 0 0
    00001207852i[CPU0 ] | ES:9000( 0000| 0| 0) 00090000 0000ffff 0 0
    00001207852i[CPU0 ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
    00001207852i[CPU0 ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
    00001207852i[CPU0 ] | EIP=00000000 (00000000)
    00001207852i[CPU0 ] | CR0=0x00000011 CR1=0 CR2=0x00000000
    00001207852i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
    00001207852i[CPU0 ] >> call .+0x00000087 (0x00090819) : E887000000
    00001207852e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
    00001207852i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called
    查看代码后,发现错误出现在loader.s中这个地方:
    LABEL_SEG_CODE32:
    ...
    push $(ARDSTitle) /* Display addr range descriptor struct title */
    call DispStr
    add $4, %esp
    call DispAddrMap /* Display system address map */

    call SetupPaging /* Setup and enable paging */

    push $(PMMessage)
    call DispStr
    add $4, %esp
    ...
    若屏蔽上面部分,则不会出现错误,因为刚刚学习所以还不是太明白。请博主指导下什么原因。

  21. 2009年6月1日22:37 | #21

    @silvester
    这个 BUG 我目前不能重现,您最好将该 BUG 提交到 http://code.google.com/p/writeos/issues/list
    这样方便其他人了解到这个 BUG 的详情,也有利于跟进后续的处理

  22. 2009年6月2日17:20 | #22

    solrex, 你好,很高兴能够在这里见到你, 如果有需要的话, 我想我能够帮你写上几章, 曾经看过<>, 而且自己也写过一个OS的雏形, 呵呵, 如果行的话, 可以给我e-mail, 回见

  23. dunlern
    2009年8月1日15:22 | #23

    好东西,我要看看学习下,谢谢博主.

  24. Qzi
    2009年12月3日08:20 | #24

    你好

    我是在ubuntu 下学习你这个教材的

    但是我不知道那个hello world 的代码要用到哪些工具

    我已经有make gcc 等

    但是不知道那个非intel标准的是用的哪个编译器

  25. heweitykc
    2010年1月7日09:39 | #25

    一直在关注,谢谢博主

  26. descent
    2010年3月30日10:23 | #26

    您好,

    我很喜歡\自己動手寫作業系統\, 當然, 你這本 open source 的版本, 更讓我喜愛。
    我是台灣的讀者, 我有 latex 排版的經驗, 我這裡有一個大膽請求,
    不知道是不是可以給我書籍的原始檔案, 我想做個繁體中文的翻譯,
    當然所有版權還是由你所有, 我別無所圖, 能看到有人出這樣的書籍,
    就很感動了。

  27. 2010年3月30日16:24 | #27

    @descent
    呵呵,您本来就可以从这里签出所有原始档:http://code.google.com/p/writeos/source/checkout ,只是我没有把 tex 打包放出而已。

  28. descent
  29. steven0lisa
    2010年6月1日10:16 | #29

    ubuntu 下默认的pdf浏览器显示你的电子书有不能显示汉字.
    My email:echo "c3RldmVuMGxpc2FAZ21haWwuY29tCg==" | base64 -d

  30. 2010年6月27日16:24 | #30

    谢谢文博老师!以前我也下载过《自己动手写操作系统》的电子书,不过版本太老了,很多内容都看不清楚(肯能是盗版的电子书吧,我在百度好不容易找到的。。),直到昨天,一朋友介绍给我你写的这本书,我才有机会学做操作系统!谢谢啦!

  31. Solrex Yang
    2008年12月9日20:25 | #31

    @李小白
    这个工作在计划中,但是可能放到后续去做。而且现在在一些小节前面也有推荐阅读的。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
说明:点击回复/引用, 会发邮件给该用户, 请慎用; 填写非真实电邮地址, 评论可能会被自动过滤, 无法及时显示, 不要责怪我. 卡内基梅隆大学的 reCAPTCHA 计划使用验证码帮助辨认古老典籍扫描时无法识别的文字,输入验证码的同时,您也为保存人类知识做了一分贡献,谢谢!