1. BootLoader基本原理 由于BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。依赖于CPU体系结构的代码,如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的;而stage2则通常用C语言实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。 BootLoader的stage1通常包括以下步骤(以执行的先后顺序): (1)硬件设备初始化。 (2)为加载BootLoader的stage2准备RAM空间。 (3)复制BootLoader的stage2到RAM空间 (4)设置好堆栈。 (5)跳转到stage2的C入口点。 BootLoader的stage2通常包括以下步骤(以执行的先后顺序): (1)初始化本阶段要使用到的硬件设备。 (2)检测系统内存映射(memory map)。 (3)将kernel映像和根文件系统映像从Flash上读到RAM空间从。 (4)为内核设置启动参数。 (5)调用内核。 2. Linux内核的主要子系统(1)进程调度(/linux/kernel, /linux/arch)在内核从进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和CPU寄存器)。在用户空间,通常使用进程这个术语,不过Linux实际并没区分这两个概念(进程和线程)。内核实现了一种O(1)的调度算法,因此调度多个线程所使用的时间和调度一个线程相同。(2)进程间通信支持进程间各种通信机制,包括管道、FIFO,共享内存,信号,消息队列,套接字等。(3)内存管理(/linux/mm)页式管理,交换(4)虚拟文件系统(VFS)(/linux/fs)VFS在SCI(System Call Interface)和内核所支持的文件系统之间提供了一个交换层,VFS上面是API抽象,下面是文件系统抽象。(5)网络堆栈(/linux/net)网络堆栈在设计上遵循模拟协议本身的分层体系结构。(6)设备驱动程序(/linux/drivers)(7)依赖体系结构的代码(/linux/arch) 3.Flash(闪存)Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应的存储空间内容恢复为1);因此,一般向Flash写入时,需要先擦除对应的存储空间,这种擦除是以块(block)为单位进行的。Flash上需用专用的文件系统。一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash也可以合并为一个分区,采用一个文件系统;即文件系统是针对存储器分区而言的,而非存储芯片。 4. XIP In computer
science, execute in place (XIP) is a method of executing programs
directly from long term storage rather than copying it into RAM.
It is an extension of using shared memory to
reduce the total amount of memory required. The storage requirements
are usually met by using NOR flash memory,
which can be addressed as individual words for read operations, although it is a bit slower than normal system RAM in most setups. 5.设备驱动程序 设备驱动程序是Linux内核的一部分。 不同于Windows驱动程序,Linux设备驱动程序在与硬件设备之间建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一样,通过open,close,read,write等系统调用对设备操作。 在驱动程序中是不能使用标准C库的,如打印函数只能使用内核的printk函数,包含的头文件只能是内核的头文件,如linux/module.h 驱动程序在具有特权级别的内核态下运行。 系统运行一般情况下分用户态和内核态,这两种运行态下的数据互不可见。驱动在内核态,应用在用户态。为解决无法通过指针直接将二者的数据地址进行传递的问题,系统提供了一系列函数帮助完成数据空间转换。 linux源代码的driver/staging文件夹下有许多驱动的源代码,例如vt6656的无线网卡驱动代码等。 编译驱动程序的方法(两种)如下(以编译vt6656无线网卡驱动为例,vt6656放到$(KSRC)/drivers/net/wireless/下): 5.1通过make menuconfig。 修改$(KSRC)/drivers/net/wireless/Kconfig,添加
config VT6656
tristate "VIA Technologies VT6656 support"
depends on USB && MAC80211
select WIRELESS_EXT
select WEXT_PRIV
---help---
This is a vendor-written driver for VIA VT6656. edit$(KSRC)/drivers/net/wireless/Makefile ------------------------------------ obj-$(CONFIG_VT6656) += VT6656/ ------------------------------------ edit$(KSRC)/drivers/net/Makefile ------------------------------------ obj-$(CONFIG_VT6656) += wireless/ ------------------------------------ edit$(KSRC)/drivers/net/wireless/VT6656/Makefile ------------------------------------ obj-$(CONFIG_VT6656) += vntwusb.ko ------------------------------------
然后是make menuconfig,具体请参考mini2440用户手册 make make zImage之后可以在$(KSRC)/drivers/net/wireless/VT6656中找到vntwusb.ko 5.2直接用make命令 在$(KSRC)目录 $cp config_mini6410_a70 .config && make oldconfig && make prepare && make modules_prepare 转到vt6656目录 make -C $(KSRC) M=`pwd` modules 在vt6656目录找到6. 修改开发板默认ip地址涉及到两个文件有/etc/eth0-setting,设置成如下(修改为自己需要的):IP=192.168.1.23
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1 /etc/init.d/rcS, 找到如下一行/sbin/ifconfig eth0 192.168.1.23 netmask 255.255.255.0
up 将ip修改为自己需要的。 7.在Linux中,modprobe和insmod都可以用来加载module,不过现在一般都推荐使用modprobe而不是insmod了。
modprobe和insmod的区别是什么呢?
1.modprobe可以解决load module时的依赖关系,比如load moudleA就必须先load mouduleB之类的,它是通过/lib/modules//modules.dep文件来查找依赖关系的。而insmod不能解决依赖问题。
2.modprobe默认会去/lib/modules//下面查找module,而insmod只在给它的参数中去找module(默认在当前目录找)。这样,有时insmod也有它的有用之处,举个例子吧。
有/root/my-mod.ko这个module,cd /root/,然后用insmod my-mod.ko(insmod /root/my-mod.ko)就可以insert这个module了,但是用modprobe my-mod.ko(modprobe /root/my-mod.ko)却提示"FATAL: Module my-mod.ko not found",这就是因为modprobe是到/lib/modules/`uname -r`/下去找module的,如果没找到就是这样了。