构建嵌入式操作系统,我们首先考虑到在一个嵌入式的应用环境下既没有多少内存也没有多少外存可用,操作系统必须存放在有限的存储器Flash中,所以我们必须根据硬件的构架来定制我们需要的Linux内核。由于ADSL接入端是基于ATM的,我们要为内核加上对PPP over ATM的patch(补丁),对于在ATM基础上支持Internet,实际上可以归结为在ATM上如何支持TCP/IP的问题,即ATM如何承载IP包的问题。在ADSL网关应用中,要共享ADSL线路接入Internet,遵循的是点到点协议,因此ADSL接入端的驱动程序实际上是一个PPP over ATM的模块,它将作为内核的一个可载入模块进行进程调用,而以太网驱动程序和WLAN_AP的驱动程序是实现在以太网和无线介质里传送IP包的,即分别用802.3和802.11的帧格式来封装IP包,这样ADSL网关的协议栈就如图3所示。
重新编译内核时去掉对硬盘,鼠标,显卡,键盘的支持,只保留一个简单的文件系统,并放在Flash上,这样可以在线升级网关操作系统。内核的核心主要是进行内存管理,启动和中断。将PPPOA模块、以太网以及WLAN驱动模块编译进内核,内核程序与网络设备接口间采用消息驱动方式,三个模块对应三个消息队列和三个通信例程,每个例程负责监听相应端口的数据(对应一个消息队列),当接受到消息时,使进程转入处理程序,进行内存刷新、加工数据帧头、发送消息等工作,消息队列如果没有消息存在,该进程就释放CPU给其它进程。由于一些寄存器(DCR,SPR等)的值和外设的I/O空间要映射到物理内存空间,所以要在TLB中锁定这些内存,在为三个PCI设备进行内存分配时,要判断分配的内存空间是否与锁定的内存空间重叠。另外我们在硬件设计上使用了串口(RS-232)作为调试接口,可以在shell中测试系统命令,运行应用程序,或用GDB对应用程序进行调试,另外shell还用于对系统进行配置。配置包括配置全局参数对网关的命令行接口,需要配置拨号PPP over ATM端口、以太网和WLAN端口。在配置前需要确认ADSL线路与DSLAM连接,要有一个静态IP地址或者由ISP负责动态IP地址分配。网关在启动时,BIOS上电自检,加载文件系统,引导网关操作系统,ADSL线路进行握手操作,初始化链路,进入SHOWTIME。