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

### 关于韦东山嵌入式Linux笔记及相关资料 韦东山的嵌入式Linux课程以其系统性和实用性著称,在开发者社区中有较高的认可度。以下是关于其相关内容的详细介绍: #### 1. **基础学习资源** - 韦东山提供了《嵌入式Linux应用开发完全手册》作为配套教材,该书涵盖了从基础知识到实际项目开发的内容[^1]。书中以IMX6ULL-Pro开发板为例,详细讲解了如何搭建开发环境、编写应用程序以及驱动程序等内容。 - 对于初学者来说,《Linux快速入门到精通视频》是一个很好的起点,它帮助理解Linux系统的底层原理及其在嵌入式领域中的应用。 #### 2. **具体技术细节** - 在驱动开发方面,韦东山总结了一系列针对不同外设(如LED、按键等)的驱动模板,并通过设备树进行了优化[^2]。例如,`chip_demo_gpio.c` 中的关键函数 `board_demo_led_init` 和 `board_demo_led_ctl` 展现了如何初始化并控制GPIO口的状态。 - 使用文件IO操作硬件是一种常见的SYSFS方式[^3]。这种方式允许用户无需深入内核即可完成简单的硬件交互任务。例如,可以通过如下命令设置GPIO状态: ```bash echo out > /sys/class/gpio/gpioXX/direction echo 1 > /sys/class/gpio/gpioXX/value ``` #### 3. **实践案例分析** - 开发板的第一个APP实验通常涉及创建一个最简化的C语言程序运行在目标平台上[^1]。这一步骤验证了交叉编译工具链的有效性以及基本功能测试。 - LED驱动实验则进一步展示了如何将理论转化为实际代码实现[^2]。其中包含了模块加载卸载机制 (`insmod`, `rmmod`) 及字符设备注册注销过程。 #### 4. **高级主题探讨** - 构建Bootloader (U-Boot), 内核, 文件系统构成了整个项目的基石[^1]。这些组件共同决定了操作系统启动流程及后期维护升级策略。 - NFS网络共享目录与TFTP服务器配合使用可以极大简化调试工作流。前者用于实时同步主机上的修改至目标机;后者负责固件下载部署。 --- ```python def gpio_control(pin_number, state): """模拟通过SYSFS接口控制指定编号的GPIO引脚""" direction_path = f"/sys/class/gpio/gpio{pin_number}/direction" value_path = f"/sys/class/gpio/gpio{pin_number}/value" with open(direction_path, 'w') as dir_file: dir_file.write('out') with open(value_path, 'w') as val_file: val_file.write(str(state)) # 示例调用 gpio_control(18, 1) # 设置 GPIO18 输出高电平 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值