嵌入式Linux笔记

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 scienceexecute 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的,如果没找到就是这样了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值