MyException - 我的异常网
当前位置:我的异常网» 操作系统 » 30天自持操作系统第九天学习笔记(u盘软盘双启动版

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

www.MyException.Cn  网友分享于:2013-10-09  浏览:16次
30天自制操作系统第九天学习笔记(u盘软盘双启动版本)

暑假学习小日本的那本书:30天自制操作系统

qq交流群:122358078    ,更多学习中的问题、资料,群里分享

environment:开发环境:ubuntu


第九天的课程已学完,确实有点不想写这个笔记了,因为开学了,还要学习课业上的压力,转博了压力山大啊.

这一天的课程最难的我感觉是后面的memory free的部分,这一部分有很多已经没有接触到的东西,所以感觉比较难.
内存的管理在任何os中都是一个重要的问题.

还是按照作者的书本上第九天的顺序的来做笔记吧:


       1:整理源文件部分,这一部分就没有什么了,把一个.c文件拆成多个.c文件工程大了,为了方便管理,方便各类函数的查找,必须要多个函数,能快速的定位所以与keyboard有关的函数放到keyboard中,与mouse有关的函数放到mouse中.

       2:这一部分是内存的容量检查,作者的思路,在学arm的时候,也用到了,就是向内存中写一个数,然后读出来,如果这个内在地址可用,那么读出来的数,肯定和写进去的数一样.但是作者在检查内存容量之前,讲了好多关于cache的东西,一开始以为没有用,后来才知,如果不关cahce,我们目的是想往内存中写的数,很有可能写到了cache中这样就会导致,不能正确的检测出这个内存地址是否真的存在.

       所以要先关了cache再检查内存的容量,因为386没有cache,先以后的cpu486及以上都有cache.所以要先判断cpu是不是i386,作者的思路是通过cpu中的eflags寄存器中的ac位,因为386的cpu还没有ac位这个标志位,所以向386cpu的efags的ac位写1是无效的,还是保持为0,通过这个方法,可以判断cpu是不是386.下面是伪代码.通过写出伪代码,可以更好的了解整个过程,而不会局限于一个细节

unsigned int memtest(start ,end)
{
    tmp=read_eflag();
    tmp|=acbit;
    write_elfag(tmp);
    tmp=read_eflag();
    if(tmp_ac_bit==1)
    {
     cpu=486higher;
    };

    if(cpu==486higher)
    {
     turn_off_cache(); //control cr0 register
    }

    size=get_memory_size(start,end);

    if(cpu==486higher)
    {
     turn_on_cache();
    }
    return size;//返回得到的memroy的值(byte为单位)
}

而get_memory_size()这个函数就用作者的方法搞定就行了,只是作者最后用汇编写了这部分的代码,因为作者认为编译器把他的代码给优化了,所以不得不用汇编写.但是实际上因为作者不了解c语言中还有一个强大的关键字,volatile.

只要把这个关键字用上,编译器就不会对指向内存地址的变量进行优化了.

当然,这一招是在学arm的时候学到的.

所以get_memory_size()这个函数,就用下面的代码来实现就ok了

unsigned int get_memory_size(start,end)
{
 unsigned int i ,old;
 unsigned int pat0=0xaa55aa55,pat1=0x55aa55aa;
 volatile unsigned int *p;//注意这里的volatile关键字,
 for(i=start;i<end;i+=0x1000)
 {
  p=(unsigned int *)(i+0xffc);
  old=*p;
  *p=pat0;
  *p^=0xffffffff;
  if(*p!=pat1)
  {
   *p=old;
   break;
  }
 
 }
 return i;//i就是得到的memory size

}

上面的函数我做了一些简化,因为我觉得作者做了一些没用用的事

当然在memtest,中需要用到读eflag,cr0,写eflag,cr0的函数,这个是用gcc内嵌汇编实现的

        3:这一部分就是作者一步一步发现c编译器如何优化了他的函数,而不得已只好用汇编写get_memory_size这个函数的过程,没有细看,能看懂汇编对于做顶层的人太重要了.

        4:这一天的第四部分,我觉得是最值得一看的,作者分析了两种内存管理的方法,
        第一种是用数组的方法,也介绍了如何实现内在的allocate and free,数组中的每一个字节都和一个具体的地址对应了,而且每一个
memory block的大小也是固定的.有点想是分段的机制.因为这个管理内存的这个表太大了,而且在alocate and free时候要用for对数组
读写多次,非常耗时.但是这个方法是最简单的,非常好理解.
        第二种方法是用下面的个数据结构
:
sturct FREEINFO
{
 unsigned int  addr;
 unsigend int  size;
};
struct MEMMAN
{
 unsigned int frees;
 struct FREEINFO free[1000];
};

上面的数据结构,配合上 下面的四个函数,内存管理就搞定了
void memman_init(struct MEMMAN *man);
unsigned int memman_total(struct MEMMAN *man);
unsigned int memman_alloc(struct MEMMAN *man):
int memman_free(struct MEMMAN *man,unsigned int addr,unsigned int size);


用struct数据结构抽象成对象,上面的四个函数抽象成对 对象的操作.oop的编程.
四个函数有个共同的特点,传递的都是函数的指针,所以要对一个对象进行操作,指针是非常重要的,
可以在这些函数内部改变对象的属性.传递指针的方法也使函数具有更好的封装性,高内聚,低耦合就是这个道理吧.

当然作者对memman_free这个函数是写的非常清楚的,可是我还是只看到了一个半懂.后面再温故知新吧.

下面上一张virtualbox启动运行的图片,u盘启动,我也试了.如果要从u盘启动,命令如下

sudo -s
make usb=1
make copy
make u
make dd   //这一步是写os.img到u盘,会看到u盘灯闪
好了,启动u盘做好了,have a try and enjoy !

借用寝室哥们的电脑,从u盘启动,上图: 可以看到哥们的电脑内存是2GB的,天天打lol还没有压力,呵呵!

代码下载地址:百度云中去下载吧,传到csdn速度太慢了.

百度云:用户名:397916230@qq.com

           密码:397916230

从第一天到第九天的代码和笔记全部在百度云盘中


文章评论

程序员的鄙视链
程序员的鄙视链
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
我的丈夫是个程序员
我的丈夫是个程序员
为什么程序员都是夜猫子
为什么程序员都是夜猫子
编程语言是女人
编程语言是女人
10个调试和排错的小建议
10个调试和排错的小建议
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
一个程序员的时间管理
一个程序员的时间管理
Java程序员必看电影
Java程序员必看电影
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员应该关注的一些事儿
程序员应该关注的一些事儿
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
漫画:程序员的工作
漫画:程序员的工作
程序员都该阅读的书
程序员都该阅读的书
 程序员的样子
程序员的样子
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
旅行,写作,编程
旅行,写作,编程
那些争议最大的编程观点
那些争议最大的编程观点
中美印日四国程序员比较
中美印日四国程序员比较
鲜为人知的编程真相
鲜为人知的编程真相
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
每天工作4小时的程序员
每天工作4小时的程序员
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员必看的十大电影
程序员必看的十大电影
程序员和编码员之间的区别
程序员和编码员之间的区别
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
如何成为一名黑客
如何成为一名黑客
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有