Monthly Archives: August 2009

Actiontec MI424WR烧写OpenWrt

最近在网上淘了一个Actiontec公司的MI424WR路由器,配置很强劲:Intel IXP420 533Mhz CPU、32M SDRAM、8M FLASH,资源足够多,跑linux绰绰有余。我主要看中了它有一个mini-PCI插槽,可以更换新的无线网卡,比如支持802.11n的ATHEROS AR5416,所以败了一个。而这篇博客的重点在于不用串口也可以刷机,而且比用串口更方便 (⊙o⊙)嗯 经过几天的努力,今天终于把开发环境搭建起来,步骤如下: 拆机机器总共有5颗螺丝,很隐蔽,四个藏在黑色的脚垫下面,第五个在底部的白色贴纸下面,用手指用力按就可以发现了。打开后,还有两个固定板子的螺丝(明明应该是4个啊??),拆掉它们,最后,拔掉无线网卡的的连接电缆就可以把板子取下来了。 串口定义靠近板子的电源部分有三个连接器,已知的是20pin的JTAG和6pin的串口。那个串口的定义如下:1脚: GND  (靠近20脚JTAG的那边)2脚: Tx3脚: Rx4脚: 未知5脚: Vcc (3.3V)6脚: 未知 这个串口需要将TTL电平转换为RS232,电路如下图所示: 但是可怜的我开始的时候用的是MAX232,但是串口怎么都不出数据,还好群里的同志及时提醒了我Vcc的问题,后来查看Datasheet才知道MAX232的Vcc最低也要在4.5V。第二天兴冲冲地跑去徐州唯一的一家电子市场,但是都没有卖MAX3232的,哎,徐州这个二级城市啊 ╮(╯_╰)╭,经过这些打击并没有打消我烧机的念头,经过在网上的搜索,找到了Open-WRT的MI424WR Wiki页… 进入机器原来的操作系统,第一次进入系统的时候会提示你输入默认的用户名(admin)和密码(password),之后会让你再设置一个管理员用户,今后再登陆这个路由器就只能用这个新用户了,除非复位。登陆后,在高级管理中打开Telenet和HTTP模式,如下图所示: 并在Loca Administration中勾选Telnet(port:23) 在Windows在安装Python http://www.python.org/ftp/python/2.5/python-2.5.msi,用默认即可。 从http://nuwiki.openwrt.org/inbox/actiontec.mi424-wr这个网页上下载jungo-image.py,机器原来使用的是Jungo’s OpenRG的固件,用这个脚本可以备份原来的固件以及刷写Redboot。刷固件有一定危险,如果变砖了请参考最后的部分,so, use at your own risk! 将网线插到MI424WR的LAN口,确保PC的网卡IP地址(192.168.1.2)和MI424WR的LAN口的IP地址(192.168.1.1)是同一个网段。 备份原固件使用CMD命令行,进入jungo-image.py所在的目录,输入:python jungo-image.py –-usr <user> … Continue reading

Posted in OpenWRT | Leave a comment

(转)MMU讲解

MMU,全称Memory Manage Unit, 中文名——存储器管理单元。      许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一个办法,这就是虚拟存储器(virtual memory).虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。比如对一个16MB的程序和一个内存只有4MB的机器,OS通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。而这个16M的程序在运行前不必由程序员进行分割。       任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T).这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址(virtual address)。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集,这里举一个最简单的例子直观地说明这两者,对于一台内存为256MB的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x000000000~0x0FFFFFFF(256MB)。      在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写。而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到内存管理单元——MMU(主角终于出现了)。他由一个或一组芯片组成,一般存在与协处理器中,其功能是把虚拟地址映射为物理地址。      大多数使用虚拟存储器的系统都使用一种称为分页(paging)。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame)。页和页框的大小必须相同。接下来配合图片我以一个例子说明页与页框之间在MMU的调度下是如何进行映射的。      在这个例子中我们有一台可以生成16位地址的机器,它的虚拟地址范围从0x0000~0xFFFF(64K),而这台机器只有32K的物理地址,因此他可以运行64K的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放64K程序的外部存储器(例如磁盘或是FLASH),以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页框大小与页相同(这点是必须保证的,内存和外围存储器之间的传输总是以页为单位的),对应64K的虚拟地址和32K的物理存储器,他们分别包含了16个页和8个页框。      我们先根据上图解释一下分页后要用到的几个术语,在上面我们已经接触了页和页框,上图中绿色部分是物理空间,其中每一格表示一个物理页框。橘黄色部分是虚拟空间,每一格表示一个页,它由两部分组成,分别是Frame Index(页框索引)和位p(present 存在位),Frame Index的意义很明显,它指出本页是往哪个物理页框进行映射的,位p的意义则是指出本页的映射是否有效,如上图,当某个页并没有被映射时(或称“映射无效”,Frame Index部分为X),该位为0,映射有效则该位为1。      我们执行下面这些指令(本例子的指令不针对任何特定机型,都是伪指令) 例1:MOVE REG,0 //将0号地址的值传递进寄存器REG.虚拟地址0将被送往MMU,MMU看到该虚地址落在页0范围内(页0范围是0到4095=4k-1),从上图我们看到页0所对应(映射)的页框为2(页框2的地址范围是8192=8k到12287=12k-1),因此MMU将该虚拟地址转化为物理地址8192,并把地址8192送到地址总线上。内存对MMU的映射一无所知,它只看到一个对地址8192的读请求并执行它。MMU从而把0到4096的虚拟地址映射到8192到12287的物理地址。例2:MOVE REG,8192(第三页)被转换为MOVE REG,24576 (第七页框)因为虚拟地址8192在页2中,而页2被映射到页框6(物理地址从24576到28671)例3:MOVE REG,20500(第六页)被转换为MOVE REG,12308(第四页框)     虚拟地址20500在虚页5(虚拟地址范围是20480到24575)距开头20个字节处,虚页5映射到页框3(页框3的地址范围是 12288到16383),于是被映射到物理地址12288+20=12308。      通过适当的设置MMU,可以把16个虚页映射到8个页框中的任何一个,但是这个方法并没有有效的解决虚拟地址空间比物理地址空间大的问题。从上图中我们可以看到,我们只有8个页框(物理地址),但我们有16个页(虚拟地址),所以我们只能把16个页中的8个进行有效的映射。我们看看例4会发生什么情况例4:MOV REG,32780    … Continue reading

Posted in 未分类 | Leave a comment