当前位置:文档之家› 从零开始搭建Linux驱动开发环境

从零开始搭建Linux驱动开发环境

参考:韦东山视频第10课第一节内核启动流程分析之编译体验第11课第三节构建根文件系统之busybox第11课第四节构建根文件系统之构建根文件系统韦东山书籍《嵌入式linux应用开发完全手册》其他《linux设备驱动程序》第三版平台:JZ2440、mini2440或TQ2440交叉网线和miniUSBPC机(windows系统和Vmware下的ubuntu12.04)一、交叉编译环境的选型具体的安装交叉编译工具,网上很多资料都有,我的那篇《arm-linux-gcc交叉环境相关知识》也有介绍,这里我只是想提示大家:构建跟文件系统中所用到的lib库一定要是本系统Ubuntu中的交叉编译环境arm-linux-gcc中的。

即如果电脑ubuntu中的交叉编译环境为arm-linux-二、主机、开发板和虚拟机要三者互通wIP v2.0》一文中有详细的操作步骤,不再赘述。

linux2.6.22.6_jz2440.patch组合而来,具体操作:1. 解压缩内核和其补丁包tar xjvf linux-2.6.22.6.tar.bz2 # 解压内核tar xjvf linux-2.6.22.6_jz2440.tar.bz2 # 解压补丁cd linux_2.6.22.6patch –p1 < ../linux-2.6.22.6_jz2440.patch3. 配置在内核目录下执行make2410_defconfig生成配置菜单,至于怎么配置,《嵌入式linux应用开发完全手册》有详细介绍。

4. 生成uImagemake uImage四、移植busybox在我们的根文件系统中的/bin和/sbin目录下有各种命令的应用程序,而这些程序在嵌入式系统中都是通过busybox来构建的,每一个命令实际上都是一个指向bu sybox的链接,busybox通过传入的参数来决定进行何种命令操作。

1)配置busybox解压busybox-1.7.0,然后进入该目录,使用makemenuconfig进行配置。

这里我们这配置两项一是在编译选项选择动态库编译,当然你也可以选择静态,不过那样构建的根文件系统会比动态编译的的大。

->Busybox Settings->Build Options二是在性能微调选项选择tab键补全功能。

->Busybox Settings->Busybox library Tuning->Command line editing->Tab completion其他的都是一些命令配置,如果你想使你的根文件系统具备哪些命令就选择那个命令。

我选择的是默认的配置,一般基本的命令都帮你选上了。

2)编译busybox修改Makefile,修改”ARCH ?= arm” 和”CROSS_COMPILE ?= arm-linux-“,然后使用make命令进行编译。

我在编译的过程出现如下错误:../arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h:44:error: field ‘in’ has incomplete type解决办法:修改arm-linux 交叉编译工具链在 usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h 头文件的开头添加缺少的头文件:#includ e <netinet/in.h>3)安装busybox这里我们先新建一个root_fs来构建根文件系统,[root@localhost root_fs]# ls -ltotal 12drwxr-xr-x 2 root root 4096 Oct 19 05:41 binlrwxrwxrwx 1 root root 11 Oct 22 11:17 linuxrc -> bin/busyboxdrwxr-xr-x 2 root root 4096 Oct 22 18:43 sbindrwxr-xr-x 4 root root 4096 Oct 22 16:52 usr进入bin目录,可以看出这些文件全部是指向busybox的链接(除了busybox本身)。

[root@localhost root_fs]# ls bin -ltotal 0lrwxrwxrwx 1 root root 7 Oct 22 11:17 addgroup -> busyboxlrwxrwxrwx 1 root root 7 Oct 22 11:17 adduser -> busyboxlrwxrwxrwx 1 root root 7 Oct 22 11:17 ash -> busybox-rwxr-xr-x 1 root root 0 Oct 23 13:20 busyboxlrwxrwxrwx 1 root root 7 Oct 22 11:17 cat -> busyboxlrwxrwxrwx 1 root root 7 Oct 22 11:17 catv -> busybox五、安装glibc库在root_fs下新建lib目录,再把arm-linux-交叉编译链下的lib文件拷贝到我们root_fs下的lib目录下。

我使用六、构建/etc,/dev,proc目录/etc和/dev是一个根文件系统必须的。

/etc文件需包含init进程启动所需的配置文件inittab.dev目录下需包含init进程启动需要的两个设备文件console 和null。

proc 目录要进来挂载内核的虚拟proc文件系统。

这样对进程的一些命令如ps才会有效。

1) 在dev目录下执行mkdir etc dev proc2) 在etc下新建文件inittab我们在里面写入两行配置信息。

::sysinit:/etc/init.d/rcS::askfirst:/bin/sh第一行是用来启动脚本文件rcS,之所以这样做,是因为我们可以利用这个文件来引导系统启动时为我们做一个工作比如说挂载文件系统或者启动一些其他的应用程序的。

第二个是启动shell解释器sh3)配置脚本文件rcS在etc下新建init.d目录,然后在init.d目录下新建rcS文件,再给rcS文件加上可执行权限。

#!bin/shmount –a在rcS里面执行mount –a命令,于是该命令就会根据etc下fstab文件来挂载相应的目录。

4)配置fstab文件在etc目录下新建fstab文件,然后在该文件内写入# device mount-point type options dump fsck orderproc /proc proc defaults 0 0第一个参数是设备,第二个是挂载点,第三个是设置。

其余的写两个0。

5)构建dev目录下的设备文件。

由于console和null设备是init进程启动所必须的,所以要建立这两个设备文件,进入dev目录,然后执行mknod console c 5 1mknod null c 1 3如果这两个设备文件没有手工mknod创建就在内核启动时会出现错误:Warning: unable to open an initial console.注意一定是在dev下创建这两个设备文件。

我因为一时糊涂在etc目录下创建了这两个文件,调了大半天才找到原因。

还有在cd etc或者cd完成了上述步骤,将根文件系统制作成yaffs2镜像烧到flash就能正常启动了。

七、配置mdev来支持热插拔busybox使用sbin目录下的一个mdev来支持热插拔,什么叫做支持热插拔?就是你linux系统启动时插入一个设备,则mdev会在dev目录下自动给你创建设备文件。

在/busybox源码中的mdev.txt有介绍。

我截取部分如下Mdev has two primary uses: initial population and dynamic updates. Bothrequire sysfs support in the kernel and have it mounted at /sys. For dynamic updates, you also need to have hotplugging enabled in your kernel.Here's a typical code snippet from the init script:[1] mount -t sysfs sysfs /sys[2] echo /bin/mdev > /proc/sys/kernel/hotplug[3] mdev -sOf course, a more "full" setup would entail executing this before the previouscode snippet:[4] mount -t tmpfs mdev /dev[5] mkdir /dev/pts[6] mount -t devpts devpts /dev/ptsThe simple explanation here is that [1] you need to have /sys mounted beforea device is added or removed so that the device node can be created or destroyed. Then you [3] seed /dev with all the device nodes that were created while the system was booting.For the "full" setup, you want to [4] make sure /dev is a tmpfs filesystem (assuming you're running out of flash). Then you want to [5] create the/dev/pts mount point and finally [6] mount the devpts filesystem on it.当我们在flash中使用使,则只需要前面[1][2][3]步就行了。

即[1] mount -t sysfs sysfs /sys[2] echo /bin/mdev > /proc/sys/kernel/hotplug[3] mdev -s于是我们在etc/init.d/rcS文件改为mount –aecho /bin/mdev > /proc/sys/kernel/hotplugmdev -s将ect/fstab文件改为# device mount-point type options dump fsck orderproc /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0再在root_fs下新建一个sys目录。

相关主题