《使用开源软件-自己动手写操作系统》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

《《使用开源软件-自己动手写操作系统》Rev 2发布》上有33条评论

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

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

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

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

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

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

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

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

  9. 博主:
    您好!这本书非常好!我很喜欢!
    我实践了下代码,发现在第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
    ...
    若屏蔽上面部分,则不会出现错误,因为刚刚学习所以还不是太明白。请博主指导下什么原因。

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

  11. 你好

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

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

    我已经有make gcc 等

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

  12. 您好,

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

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

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

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

  16. 感謝大大感謝改寫成開元軟件版本的不過已經停擺了嗎?

回复 songq 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注