作者: NewbieCoder

  • VirtualBox 4.1.8 简体中文语言包

    这个语言包是ldr制作的,不过在汉化新世纪那儿下到的是个安装程序,其实就是把两个文件覆盖到安装目录下的nls目录里面就好了。这儿把那两个文件提取出来了:VirtualBox_zh_CN_4.1.8。

  • 镁光的某些SSD导致假死的解决方案

    “某些SSD”包括但不限于M4、C300。

    我的M4(固件0009)已经遇到过好几次了。
    具体表现是,系统硬盘灯常亮,系统范围内无响应,半分钟或更久后恢复,在事件管理器中有“设备 \Device\Ide\iaStor0 没有在传输等待时间内响应。”的错误信息(ID=9)。
    在镁光官方论坛有人给出了解决方案:http://forum.crucial.com/t5/Solid-State-Drives-SSD/Solution-C300-Disk-Freeze-ups-in-Windows-7-solved-for-me/m-p/38766。

    导致这个问题的原因是这些SSD不能处理Intel® Rapid Storage Technology中含有的LPM(Link Power Management)特性。把下面的文本复制成.reg格式保存后导入注册表就可以关闭LPM了,然后重启就好了。

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port0]
    “LPM”=dword:00000000
    “LPMDSTATE”=dword:00000000
    “DIPM”=dword:00000000
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port1]
    “LPM”=dword:00000000
    “LPMDSTATE”=dword:00000000
    “DIPM”=dword:00000000
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port2]
    “LPM”=dword:00000000
    “LPMDSTATE”=dword:00000000
    “DIPM”=dword:00000000
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port3]
    “LPM”=dword:00000000
    “LPMDSTATE”=dword:00000000
    “DIPM”=dword:00000000
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port4]
    “LPM”=dword:00000000
    “LPMDSTATE”=dword:00000000
    “DIPM”=dword:00000000
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\iaStor\Parameters\Port5]
    “LPM”=dword:00000000
    “LPMDSTATE”=dword:00000000
    “DIPM”=dword:00000000

    您也可以从此处下载压缩后的DisableLPM.reg:DisableLPM.7z

    据作者说还会加快SSD的速度,不过我的M4貌似速度没啥变化。

  • 操作系统里面内存管理的几个概念

    活动页面:最近使用过的页面(通常通过PDE/PTE中的A位判断)。
    不活动页面:不是活动页面,也不是未使用的页面,就是不活动页面。活动页面经过一段时间的老化以后就变成了不活动页面。为了老化页面,通常不断扫描PDE/PTE中的A位来记录一个PDE/PTE的年龄。
      脏页面:页面中的内容尚未写到页面文件中的不活动页面。这种页面要是想要回收然后分配给其他进程的话代价比较大,因为需要做IO。
      干净页面(这翻译= =):就是页面中的内容已经写到页面文件了。这种页面回收的代价较小,通常只需要操作一些内存中的数据结构就可以了。
    活动页面和不活动页面都是分配出去的页面。
    未使用的页面:没有分配出去的页面。
    在分配页面的时候,一般来说首选未使用的页面,其次是干净页面,最后才是脏页面,如果还不行就去老化活动页面。

    内存抖动:通常是因为工作集大小的设置不合适(过小)导致的,当然也可能是页面调度算法本身不够完善,具体表现是刚被置换出去不久的页面又再次访问,于是就会不停的因为换入换出页面而发生IO,进而拖慢系统。

    另外说一个Windows特有的东西,是ReadyBoost。
    ReadyBoost是从Windows Vista开始引入的一个用来加速系统的概念。通过使用U盘来存储某些系统使用的数据加速系统运行速度。
    实际上,ReadyBoost应该是将U盘作为分页的外部存储设备使用的。
    按理来说U盘的连续读写远远慢于系统的主硬盘(不管多好的U盘~,当然,USB3.0+SSD的话……那你干吗不把SSD做主硬盘?= =),所以用U盘做分页的外部设备反而会更慢。
    这个主要是因为U盘的随机存取效率要远高于机械硬盘(在ReadyBoost提出的时候基本还都在用机械硬盘),而通常需要调入内存的页面不会太多——1024个页面也只有4M的大小,但是对于主硬盘来说,每次操作都会需要很长的时间(这个时间主要花费在寻道上),U盘,或者说闪存在这种情况下就要快很多,所以置换页面的时候把一些小数据放入U盘的话,再次访问它们的时候相比于放入主硬盘,要快很多,自然也可以提高系统响应速度。
    当然由于SSD的出现,ReadyBoost也只能是一个时代的产物,在Windows 8正式发布的时候有可能会被去掉。即使没有,在Windows 9(如果我们可以度过2012的话,如果微软也可以的话。)几乎是可以肯定是会被去掉的,因为SSD的随机存取效率相对于普通U盘来说是足够快的。其实在我的机子上(前一阵刚换了颗SSD——我绝对不是富二代!),ReadyBoost是被强制关闭,因为主硬盘的随机存取效率足够高了。
    (在系统内存耗尽的时候SSD相对于传统机械硬盘的效率提升非常明显,开了2个程序每个分配1.8G+的内存然后不断的将内存初始化为随机内容,系统依然可以正常响应,只有Aero的动画有些卡而已。)
    当然,如果系统主内存足够大,那么ReadyBoost几乎没有用处。

    另外有一个跟操作系统关系不是太大的内存问题,就是内存的缓存机制(内存:虽然偶常常被系统用来给磁盘之类的东西做缓存,但是其实人家也是有缓存的啦~(通常是CPU的L1、L2、L3?)),x86(以及x64?)里面分写回(Write-back)和写过(Write-through)(这俩词纯粹是我自己的翻译= =)两种。写过的意思是,遇到一次写操作同时写缓存和主内存。显然这种缓存机制对于写入操作不能加速,但是实现起来容易。另外一种,也就是写回,这种缓存机制在碰到写入操作的时候只会更新缓存中的内容,而不会去更新主内存;稍后如果有新的缓存项需要替换这条缓存项的话再(首先判断这条缓存项是不是脏的)将其写入主内存。一般认为(只是一般认为)写回机制要比写过效率高,因为写回机制对主内存的操作会少一些,但是这种缓存机制显然实现起来要困难一些。
    究竟写回和写过谁的效率更高?这个取决于当时的环境。如果系统负载很大,而且程序的局部性不明显的话,这时候缓存命中率会很低,那么写过的效率要高,这个效率提升主要提升自缓存算法,因为少了一些判断;如果系统负载不大,这种情况下缓存命中率比较高,这时候写回的效率要高,这时候的效率提升主要来自于缓存的速度,因为缓存的速度要比主内存的速度快。

  • 说一说FAT12这个文件系统

    今天忽然看到了PEPROCESS这个东西,感到好亲切啊。

    FAT的参考资料:http://en.wikipedia.org/wiki/File_Allocation_Table。

    对于一个FAT的分区/磁盘(通常来说都是分区,但是软盘上没有MBR,所以这时候就是磁盘了),一开始是一个引导扇区(DBR),里面包含了一些引导代码和BIOS参数块(BIOS Parameter Block,BPB)。
    这个DBR以及接下来的一些特殊用途的扇区(如果存在的话)都算在BPB中的NumberOfReservedSectors里面。

    接下来是FAT,FAT可能有多个副本。位于BPB的NumberOfFats。每个FAT占用的扇区数位于BPB的NumberOfSectorsPerFat。
    FAT其实是一个(元素大小为12位的)数组,这个数组的元素下标是磁盘上的簇号,每个元素都指向另外一个元素的位置(也就是另外一个下标——也就是簇号),形成一个链表。
    簇的定义是一些连续的扇区,具体有多少个取决于BPB中的NumberOfSectorsPerCluster。
    比如说有个文件在磁盘上,按顺序一次占据了簇号为5、3、10、7的四个簇(注意FAT的第0和第1个元素被留作它用(第0个是BPB的0x15处的那个媒介描述符——因为这个描述符只有8位,所以高位补1,第1个是用来标识链表结束(End of Clusterchain,EOC)的),因此不存在簇0和簇1)。
    那么Fat[5] = 3、Fat[3] = 10、Fat[10] = 7、Fat[7] = EOC。(注意Fat不是字符型,而是一种12-bit的类型)
    不过实际实现中,其实不是用第0个元素来判断EOC的,只要大于0xff0都是EOC(参考wiki)。
    如果FAT中某个元素为0,那么说明这个簇是空闲的。
    注意从簇转换到扇区号应当是(ClusterNumber – 2) * NumberOfSectorsPerCluster + 数据区起始位置(参考后文)。

    然后是根目录。根目录其实是一个元素为0x20大小的数组,元素个数取决于BPB中的RootEntries。这些元素也就是一个个的文件描述符。每个元素前11字节是8.3格式的文件名(不含点号,如果不够8/3的长度,用空格补齐。另外,长文件名(Long File Names,LFN)其实是用利用不合法的文件项实现的——一种只读、系统、隐藏的卷标型文件,然后利用项中的其他(绝大多数)域专门存文件名——这种不合法的文件项会重复多次(如果文件名很长),然后紧接着是这个LFN对应的真正的文件项),然后是文件属性(隐藏/系统/只读等),接下来是一些日期时间(创建/最后修改)等,接下来在偏移0x1a处标识了文件的第一个簇号。紧接着是文件大小。

    最后就是数据区了。(也就是前面从簇转换到扇区号所用的那个起始位置。)

  • 这才是第一篇日志

    推荐使用支持HTML5(虽然实际上博客页面是XHTML 1.1的……)的浏览器。
    推荐使用768p分辨率访问。
    为了获得更好的显示效果,建议您同时安装Segoe UI以及Microsoft YaHei字体。

    注:IE9下某些控件的字体选择存在BUG。