• ^_^,今天是我的23岁生日。发生了几件事情,随手记录下来。

    1、拖拖拉拉,终于成功突破了linux0.11源代码中最前面的729行汇编代码,开始读C的代码了。读这样原始的小内核,不会给人一种无法驾驭的感觉,不错。

    2、在CU上决定申请C/C++版的版主了。虽然差很多,但是,金子不是总会被人发现,从今往后,做人不应该太低调了,努力就好。

    ……

  • 原来,战场上战友的倒下,是没有声响的……

    在CU上逛,有位兄弟忽然发现一个叫“黑寺岭”ID,已经1个月没有来了。查了他最后的帖子,是一篇感慨,是重回上海的一些打算,而他,正是打算乘坐东方航空公司云南分公司MU5210航班在上海虹桥机场降落的……。这正是上个月的一次空难。戏剧的是,他的文章的开篇就写明了时间和目的地,仿佛,冥冥中早有安排一样。

    看了这些,心情很不好。原来,灾难离我们如此之近。不知道自己的ID在论坛上消失的时候,会不会这样的被人记起?

    http://bbs.chinaunix.net/forum/viewtopic.php?t=448762

    http://bbs.chinaunix.net/forum/viewtopic.php?p=3100110#3100110

    不知道这两个链接,会被保留多长时间。

  • 我们很多时候能听到保护模式、实模式这样的词。不知道别人怎样,我一直是感觉很模糊。总是理解的很浅显,感觉有层薄薄的面纱挡在前面。终于,找了个机会,好好的学习了一下。揭开了这层神迷的面纱。

    首先,保护模式是增强了的实模式,将很多原来16位的寄存器扩展成了32位,而且在兼容实模式寻址形式的基础上增加了寻址空间;其次,保护模式可以看作是在实模式上增加了很多软件可以实现功能的硬件实现;可以说,保护模式=增强的实模式+硬件上对一些功能的支持。

    保护模式只是在实模式的基础上增加了寻址空间,增加了对多任务的支持(TR寄存器,应该也可以由OS实现),增加了分页方式的内存管理,可以由硬件提供的缺页异常(以便于OS及时的在物理内存和虚拟内存中进行交换,这是一个可选的功能,其实也完全可以由OS实现)。

    保护模式中,对段的处理,不再简简单单是16位的段了,而是16位的段选择符,要到GDT或者LDT中去查找段的位置。GDT和LDT是在内存中的,由OS设置。这样就避免了在CPU中增加过多的寄存器,而且可以对各个段进行各种描述和权限的控制。段的长度也不再受实模式中64K的限制了,而是可以达到4GB的极限(通过调整粒度和段限长字段的值)。

    保护模式中对多任务的支持,不过是维护一个TSS来完成的。这个TSS,由TR在GDT中标明,是一个很短的段。各个任务有自己不同的TSS,在切换任务的任何设置TR来切换不同的TSS。其实,TSS就是寄存器级的上下文。

    保护模式中对中断的处理,其实还是和实模式中是一样的。不过这回不是固定在内存前端的中断向量表了,而是可以在内存中自由指定位置的IDT,这个位置便是由IDTR来指定。而且这回的ID,可以带回更多的信息,更可以处理陷阱和任务切换。

    保护模式中可以选择使用分页的方式对内存进行操作。使用分页方式的好处是:一、物理内存中没有的缺页可以直接由CPU发出异常,进而由OS捕获,从容的进行物理内存和虚拟内存的交换;不然的话,是否存在于物理内存中,只能由OS谨慎的进行处理了。二、可以根据各级页表中的信息提供分页级的权限保护。其实,在DOS时代,限制于只能使用CPU的实模式,为了突破1MB物理内存和640KB基本内存的限制,人们已经想出了类似保护模式下CPU对内存进行分页管理的机制的EMS,只是这个后来使用不多。后来,随着DOS的发展,人们已经可以在DOS下进入保护模式,并利用保护模式下的CPU内存分页管理机制来获取更大的内存了,到了DOS6.22,已经可以寻址64M的XMS了。但由于DOS设计上的限制,最终还是被越来越强悍的硬件淘汰了,Bill的那句“人们只需要640K的内存就足够了。”也成了IT发展的见证。最近,FreeDOS也推出了32位的版本。开源的DOS也开始像保护模式大踏步的前进了。

  • 一直以为很清楚这两个概念,结果细一调查,好啊,这居然有好几个重名的家伙。现在就来场决斗,将他们的身份一一揭穿,仔细的鉴别一下。

    1、应用中的概念。

    物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了。看机器配置的时候,看的就是这个物理内存。

    虚拟内存,这个概念就要稍微了解一下CPU了,^_^,只是稍微,毕竟我们现在谈的是应用中的概念。我们应该知道,对于一般的32位CPU,有32根地址线,那么它的寻址空间就是4GB。也就是说,如果没有其他的限制,我们的主板上最大可以安装4GB的物理内存。哈哈,一般的机器是不会装那么多物理内存的,大把的银子啊,性价比可合不上。程序员可不管这个,我们对CPU编程,不能一台机器根据你物理内存的大小我编一个程序吧?那也太原始社会了吧。所以程序员都是直接使用的4GB的奢侈的进程空间(或许,不应该用奢侈这么短视的词。曾几何时,128M的物理内存也是我们不可想象的呢?)。这怎么办?总不能不用那些程序了吧。好吧,这个问题交给OS去解决吧。这样,OS就提出了一个虚拟内存的概念。就是进程、用户、不必考虑实际上物理内存的限制,而直接对4GB的进程空间进行寻址。如果所寻址的数据实际上不在物理内存中,那就从“虚拟内存”中来获取。这个虚拟内存可以是一个专门文件格式的磁盘分区(比如linux下的swap分区),也可以是硬盘上的某个足够大的文件(比如win下的那个i386文件,好像是这个名字)。物理内存中长期不用的数据,也可以转移到虚拟内存中。这样的交换由OS来控制,用户看起来就好像物理内存大了一样。有了虚拟内存的概念,我们就可以自由的使用4GB的进程空间了。但是,前提是你的硬盘由足够的空间,而且你舍得划分出(4GB-物理内存)大的虚拟内存空间来。^_^。一般情况下,虚拟内存的大小,各个OS也进行了限制(比如linux的swap分区的大小,win下也可以调整虚拟内存文件的大小和位置)。所以,我们程序所能使用的存储空间大小就是:物理内存+虚拟内存。

    2、CPU中的概念。

    物理内存,CPU的地址线可以直接进行寻址的内存空间大小。比如8086只有20根地址线,那它的寻址空间就是1MB。我们就说8086能支持1MB的物理内存。即使我们安装了128M的内存条在板子上,我们也只能说8086拥有1MB的物理内存空间。同理32位的386以上CPU,就可以支持最大4GB的物理内存空间了。

    虚拟内存,这便是一个和CPU的寻址方式有关的一个概念了。x86体系结构中,为了更好的管理内存空间,采用分段的方式来对内存进行寻址。比如8086就用两个字节的段基地址和两个字节的偏移地址来寻址整个可以寻址的内存空间,即:0000:0000方式(具体怎么计算出实际的地址,参见各种汇编教材)。这样,对整个1MB的物理内存空间寻址是没有问题了。可是,用这种方式,最大可以寻址到10FFEF这个地址。这超出了20根地址线的地址的FFEF大小的空间,就可以说是8086的虚拟内存了,所以可以说8086的虚拟内存地址空间可以达到10FFEF。^_^,具体怎么使用和看待这段内存,还取决于A20线的选通与否了,这是另外的话题了。同样的道理,386以上的CPU,由于在保护模式下使用了GDT和LDT,将段的定义放到了内存中,从而可以使用16位的段地址和32位的偏移地址。这样算来,386以上的CPU的虚拟内存地址空间就可以达到64TB了。真是大的惊人,看来,这么大的地址空间,一时还不能被软件的发展淘汰。

    3、零碎的叫法。

    零碎的叫法常常来自与相对感觉深奥诙涩的虚拟内存概念。物理的东西,人们大多不去碰它,毕竟是实实在在存在的。而虚拟内存就经常有别冒名顶替的。“一个进程有4个GB的虚拟内存”这样的说法屡见不鲜,其实,这是混淆了4GB的进程地址空间和虚拟内存这两个概念。^_^,也算令一种解释吧,毕竟那4个GB也是见不着影的,也是虚拟的。

  • 靠,受不了了。让我写日报,还要详细写测了哪里,发现了什么bug。TNND,我好几天都没开XXXX(软件名)了。测什么测!测了也是那么多bug!哪有win版的开机上来就占100%资源的啊?XX(公司名)是地主,你做的软件也是地主啊?偶电脑可不伺候,每次都重启服务,它才老实!测测测,啥也没有还测。没有设计文档,没有目的,测试用例都是在没有设计文档情况下堆砌的,怎么测?测,项目都被砍掉了还测!没活就不行学点啥呀?测了也没人买,JJYY的,做了10年的产品到头来是用的开源的内核,你可身不可身啊?在说了,当初招老子来是做开发的,丫丫的,堆了2个月的垃圾测试用例,现在别人都没啥事,还让咱继续测,测JBM啊!一个做开发的,半年了,就写了10行代码,咱都不好意思说。CTMD!就这样的XX(公司名),早晚完蛋!
     
    真是郁闷了,这两天,好不容易自己调整的挺好。想,闲就闲吧,自己学点东西,也挺好。结果跟追命似的追。成天就知道统计日报,能有点实质工作不?骂,骂,骂到爽!

    也许有同事看。看看也就算了。俺们刚出来的,就这么不懂事。也是郁闷的不得了了才找了个方式发泄。