废话

  整个十月都没有再写一点什么, 其实没什么好写的, 把书里的东西码出来贴在博客里实在没什么意思, 况且书里已经写得够详细了.

  这本书给我最深刻的感觉是, 作者通过简化一些细节, 一步一步地模拟整个开发过程, 把做一个操作系统中最有趣的部分展示了出来. 最大的简化大概使用了他那一整套工具, 把编译出裸机可用C语言程序这一个麻烦给忽略了.

  经过一个多月的练习, 已经完成了700页中的300多页, 最后大概是停留day 12这里, 我开始有点厌倦. 从一开始完成一点功能就很兴奋, 到最后发现自己只是不停地抄实例代码, 所以我决定停下来, 这一停就是一个多月.

  我当然为自己这样做要找一个借口, 这本书固然是好书, 但以我的毅力和空余时间来看, 不适合从头到尾跟着做.

  虽然之前做了错误的决定, 这并不意味这我没有任何收获, 书里面有很多有趣的思路, 比如用循环队列+死循环来处理中断(类似Windows里面的消息泵), 如何绘制出鼠标, 用缓冲区来避免画面闪烁, 作者提供的方法不见得是最高效的做法, 但却让我知道这些东西可以这样实现, 这在动手做之前我是没有想过的, 作为一本讲操作系统的最简单的书籍, 它简化了硬件细节, 总还是能对整个计算机组成有个大概的把握.

  当然不止这些, 在这个过程中我还收集了很多零碎的知识, 就像点亮技能树一样, 在做这个项目的过程, 你感觉这样不方便, 于是去网上寻求一种更好的操作途径.

  • (最大的收获)我需要在Shell, Makefile, 汇编, C语言直接切换着编辑, 之前一直在用的Code::Blocks显然没有这个功能, 记事本又不能忍, 所以我就去学了vim, 从此再也离不开:w , 又顺手用了火狐的pentadactyl.
  • Makefile让我知道如果不借助IDE的话, 一个项目是怎么被编译的.
  • 我的代码放在一个目录, 书里的示例代码在另一个目录, 为了跳转方便又用了它Total Commander, 虽然只用了最简单的功能.
  • 每次打完代码把整个目录<c-c>再<c-v>一点都不Geek, 所以就开始用Github, 不得不说GitHub 的Windows客户端操作简便又直观, 后来环境换到了Linux每次add + commit + push总觉得好麻烦.

  其实上面这些只是花几天或者几个小时就能学会的小技能, 但如果不是做这个的话, 我想短期内我是不会有动力去学习的.

事实上我还得承认是我没有坚持做完它, 弃坑是一件挺丢人的事情, 但这并不是终点, 而是另一个开始.

  https://github.com/LastAvenger/OS67

  我想重新做一个OS, 和上次的区别是, 这次我用了现在流行的编译工具链, 在Linux下的make + gcc + nasm + ld, 结合网上的各种教程, (其实网上很多的, 尤其是国外, 只是一开始孤陋寡闻没有听说过, 当然现在也好不到那里去).

   不知道话会不会说太早? 前面有多少困难呢?

一些要注意的

对一些不了解的人来说, 编写操作系统听起来很高大上,  网上充斥的各种操作系统教程也只是一个简单的bootsector, 无非是两个关键字: 0x7c00 和 0xAA55,  只能当做汇编的练习而已, 再进哪怕一步的, 如果有, 也都是按书上的做的(于渊的Orange's, 30 天, Liunx 0.11), 再发到博客上, 基本不能讲清楚问题(这里突然觉得我之前发的那些博客蠢到家了).  要想更好地了解, 直接看于渊的Orange's, 30 天, Liunx 0.11就好了.

网上的资料当然不止这几本书, http://wiki.osdev.org/Main_Pagehttp://www.osdever.net/tutorials/是OS的Wiki网站,

另外有一个教程叫 Bran's Kernel Development Tutorial写得简明易懂, 大概我会在里面抄很多代码, 而且国内竟然有完整的翻译版, 感谢译者huigezi.

「x86汇编语言 从实模式到保护模式」 这本书也是值得借鉴的.

以上的书我没有完全看完, 但里面确实涵盖了全部的知识, 问题在于看得懂看不懂而已.

有了教程, 就可以着手制作了, 你需要了解一点汇编语言和C语言. 一开始比较重要的是保护模式和C语言的编译链接.

比如分段有什么用, GDT IDT里面放的是什么, CPL, DPL, RPL 的不同作用, 特权级的转移,  个人认为这是一个接受与否而非理解与否的问题, 有时候真不明白为什么CPU里面要加入这些奇奇怪怪的规则, 但实际上除去历史原因, intel的设计者们肯定是比我等厉害得多, 先接受它这种奇怪的机制, 慢慢的就会理解保护模式了. (当然细枝末节我还是记不住的.

如何用C语言写内核? 一开始这真的无法想象的, 而且我百度了好久都无果, 我看到的几乎所有中文教程都忽略了这一步, 而偏偏Orange's的内核是先用汇编解析ELF,再用C编译出ELF格式的内核的, 而我需要的是一个纯二进制的内核, 当然最终我求助于知乎的某个前辈, 从他提供的Bran's 的教程里面找到了答案, 在此表示感谢.

  要生成一个二进制的内核, 你需要在汇编写的loader里面指定C语言里面的入口函数, 并在合适的时候跳转到他, 比较重要的地方是C编译器的编译选项,(之前我不知道有那么多的选项, 做题的时候一律gcc -o), 你要对程序编译的流程有一点点的了解, 你才能理解这个过程, -> 指定参数让gcc不引用任何标准库, 使用自己的头文件, 而且只生成目标文件(你还可以生成一份gas的汇编文件用以对照), 然后在链接的时候合并好loader与kernel的各个段, 具体的做法参见: https://github.com/LastAvenger/OS67/blob/master/makefilehttps://github.com/LastAvenger/OS67/blob/master/kern/link.ld

说实话我也不能完全理解, 但至少程序跑起来了.

贴一张图吧?

「30天自制操作系统」 Stop & 「OS67 」 Start的更多相关文章

  1. 《30天自制操作系统》笔记(06)——CPU的32位模式

    <30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...

  2. 《30天自制操作系统》笔记(03)——使用Vmware

    <30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...

  3. 《30天自制操作系统》笔记(02)——导入C语言

    <30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...

  4. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...

  5. 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...

  6. 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么 ...

  7. 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...

  8. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...

  9. 关于U盘启动操作系统《30天自制操作系统》

    原本的启动是从img启动的,并且这个img是用FAT12文件系统进行格式化的(详细去搜索FAT12文件格式,这里给大家推荐一篇http://www.doc88.com/p-646605198560.h ...

随机推荐

  1. Amoeba for MySQL 非常好用的mysql集群软件

    http://docs.hexnova.com/amoeba/ Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专 ...

  2. weblogic数据源配置的问题,weblogic密码破解

    weblogic 报错 please increase XXX,得知是连接池出了问题,查看weblogic配置,发现没有设置超时 查看oracle 当前session,可以看到连接的机器,用户,当前执 ...

  3. css之选择器

    我们都用过jquery,使用jquery选择器,非常的简单,最近刚好有项目上手,拿起书本看了一下,发现好多的东西都忘掉了,好记性不如烂笔头,就将这章内容记录下来,现在我们看下css原生的选择器. 选择 ...

  4. ie兼容CSS3渐变写法

    在css3之前要想做背景色渐变就只能采用添加背景图片的方法,但是随着css3:linear-gradient属性的出现,就可以避免使用添加背景图片的方法,从而优化了性能.但是inear-gradien ...

  5. picasso_强大的Android图片下载缓存库

    tag: android pic skill date: 2016/07/09 title: picasso-强大的Android图片下载缓存库 [本文转载自:泡在网上的日子 参考:http://bl ...

  6. CDOJ 92 – Journey 【LCA】

    [题意]给出一棵树,有n个点(2≤N≤105),每条边有权值,现在打算新修一条路径,给出新路径u的起点v,终点和权值,下面给出Q(1≤Q≤105)个询问(a,b)问如果都按照最短路径走,从a到b节省了 ...

  7. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  8. 如何学习H264协议

    如何学习h.264协议 首先,我假定你已经具有如下基础: 1 了解基本的视频知识,知道什么是YCbCr/YUV: 2 知道基本的视频压缩原理: 如果这两条还不具备,那么,停一下,补一下课.这方面的相关 ...

  9. jQuery的矿建结构小demo举例

    (function (global) { var document = global.document,//变成局部变量提高搜索的性能 init;// 核心函数 function itcast(sel ...

  10. Filter过滤器实现同一地址手机和电脑页面不同

    最近做一个网站,客户要求在访问主域名的时候实现电脑访问时展示电脑页面,手机访问时展示h5的手机页面,这种需求的使用还是比较多的:尤其网站需要百度推广的时候,百度推广就要求同一域名下,手机访问时展示手机 ...