针对初学嵌入式的广阔朋友们,以下是我在初学触摸嵌入式的进程中收拾处的一些材料信息,期望能为咱们有所协助。
一个典型的桌面 Linux 体系包括 3 个首要的软件层—linux 内核、C 库和运用程序代码。
内核是仅有能够彻底操控硬件的层,内核驱动程序代表运用程序与硬件之间进行会话。内核之上是 C 库,担任把 POSIX API 转换为内核能够辨认的方法,然后调用内核,从运用程序向内核传递参数。运用程序依托驱动内核来完结特定的使命。
在规划嵌入式运用的时分,能够不依照这种层次,运用程序跳过 C 库直接和内核会话,或许把运用和内核绑缚在一同,乃至能够把运用写为内核的一个线程,在内核中运转,尽管这样在移植上带来了困难,但考虑嵌入式体系对尺度要求小的特色,是彻底可行的。不过咱们运用三层软件结构的形式来学习嵌入式 linux将会是咱们知道更明晰,简略可行并使运用具有弹性。
快速入门
最简略的树立嵌入式 Linux 运用的办法便是从咱们运用的桌面 Linux 下手,装置一个喜欢的版别,把咱们的某个运用作为初始化的一部分,结构就算完结了。
当然,嵌入式 linux 运用远比咱们的桌面版别功用简略专注,它或许便是一个用于足彩的终端机,或是一个数码音频播放器,这些体系除了运用嵌入式 CPU外,只是再需求一个串口,网口等少数的输入输出接口就能够完结它们特定的运用了。
在软件上,它能够依照三层的概念由内核装载器,定制的内核和较少的为特定使命规划的静态衔接的运用程序组成。之所以运用静态衔接的运用程序,是由于少数的静态衔接程序所要的存储空间,比相同数量的动态衔接的程序所占的空间小,这个平衡点需求咱们在实践开发中去获取。或许你正在规划的是个 PDA,它的运用程序较多,那么你很可能就要运用动态衔接程序来削减存储空间。在你的/bin 或许/sbin 目录下,用厂列表看看 bash,ifconfig,vi…,或许只用几十K,当你运转 ldd /bin/bash 时,你会看到它们都和洽几个库文件相连。好了,这样看来,咱们得把 PC 想像成一个嵌入式硬件渠道,再从头制造一个特定功用的嵌入式 linux。
基础知识
再进行实践操作之前,先来搞清楚几个基础知识。
内核装载器 Loader,它的作用是把内核从外部存储器,移动到内存中。它只作这个作业,一旦完结了调入内核的作业,Loader 就跳转到内核方位开端履行。不同架构有不同的 Loader,在 x86 结构的 PC 上,一般运用的 loader 有LILO,GRUB,syslinux,syslinux 在嵌入式 linux 中也相同作业。其他非 x86 架构的运用中,你有必要运用专门的 loader,或许自己编写 loader 来装入内核。也有不运用 loader 的状况,体系加电今后,内核直接从烧录有映象的 Flash 上开端履行。
内核,一旦内核开端履行,它将经过驱动程序初始化一切硬件,这能够从咱们的 pc 机监视器的输出看出来,每个驱动程序都打印一些有关它的信息。初始化完结后,计算机就预备运转嵌入式运用。或许一个,或许是多个运用程序组成了嵌入式运用,但一般首要调用的是 init(经过 loader 向中心传入init=/program 能够定制首要运转的程序)。桌面 linux 中,init 会读取/etc/inittab 文件,来决议履行等级和哪些脚本和指令。嵌入式运用中,能够依据实践的状况决议是否运用规范的 init 履行方法,或许这个 init 是个静态程序,它能够完结咱们的嵌入运用的特定使命,那彻底不必考虑 inittab 了。
initrd 文件体系,initrd 以一种把内核从存储介质装入到内存的相同的机制来装入一个小型文件体系。这个文件体系最好是以紧缩的方法存储在介质上的,解紧缩到 RAM 盘上。经过运用 initrd,包括有中心驱动和发动脚本的小文件体系,就能够直接从介质上和内核一同发动起来,内核届紧缩这个文件体系,并履行这个文件体系上叫做/linuxrc 的脚本文件,这个脚本一般会把发动进程中所需求的驱动程序装入。脚本退出今后,initrd 文件体系也卸下了,发动进程进入真实初始化进程。关于嵌入式来讲,能够将需求的运用软件都运转在这个initrd 文件体系上,只需/linxrc 文件不完毕,内核发动进程的其他部分就不会持续。
做个试验:
cp /boot/initrd-2.4.20.img /tmp
cd /tmp
mv initrd-2.4.2-.img initrd.img.gz
gunzip initrd.img.gz
mount -o loop initrd.img /mnt
cd /mnt
ls
cat linuxrc 能够看到里边履行了加载了两个模块的操作,你在发动 linxu 的时分会看见屏幕打印信息。
入门试验,制造一个简略的运用
咱们运用一张软盘发动一台假象的只要一个串口,键盘输入,显现输出的x86 架构的 linux 体系,履行的特定运用便是运转 minicom,经过串口拨号。需求软件: minicom-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx 代表版别号,开端之前,在主目录树立一个目录,来开释这两个软件包:
cd
mkdir -p project/minilinux
cd project/minilinux
tar zxvf minicom-xx.src.tar.gz
tar zxvf syslinux-xx.tar.gz
1、削减 linux 内核(需求体系装置内核文件包)
装备内核的时分,咱们需求挑选这些:摸块编入内核,386 处理器、物理内存 off、支撑 ELF、规范 PC 软盘、支撑 RAM 盘(4096)、支撑 initial RAM disk(initrd)、虚你终端、虚拟终端操控台、规范串口、ext2 文件体系、操控台驱动,VGA text console、DOS FAT、MSDOS 文件体系,其他的都能够不要,这样内核编出来较小。
进程:
cd /usr/src/linux
make mrproper
make xconfig
make dep && make bzImage
得到 /usr/src/linux/arch/i386/boot/目录的内核文件 bzIamge。
2、编译一个静态的 minicom ,把它作为将来的 linuxrc
cd minicom-xx/src
vi Makefile
修正下面这行
minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES)
rm -f minicom 下面的行加上 -static,衔接为静态程序
(LINK) -static $(minicom_LDFLAGS) $(minicom_OBJECTS) $(minicom_LDADD) $(LIBS)
vi minicom.c
找到 if (real_uid==0 && dosetup==0 ) 删去这个判别条件句子,首要是用于权限判别的,由于这个嵌入运用不重视权限问题,不然会犯错。
make
得到可履行程序,用 ldd 检查一下是不是静态程序。
3、预备 initrd 紧缩文件 image.gz
dd if=/dev/zero of=image bs=1k count=4096
losetup /dev/loop0 image
mke2fs -m 0 /dev/loop0
mounmt -t ext2 /dev/loop0 /mnt/
mkdir -p /mnt/dev
mkdir -p /mnt/usr/share/terminfo/l/
cd /dev
cp -a consle null tty tty0 zero mem /mnt/dev
cp -P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux
cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc
umount /mnt
losetup -d /dev/loop0
sync
gzip -9 image
4、制造软盘引导,并复制文件 bzimage image.gz 到软盘
A.运用 grub
fdformat /dev/fd0
mke2fs /dev/fd0
mount /mnt/fd0 /mnt/floppy
mkdir -p /mnt/floppy/boot/grub
cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub
履行 grub,在软盘上创立引导
grub > root (fd0)
grub > setup (fd0)
grub > quit
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
修改 /mnt/floppy/boot/grub/grub.conf
default =0
timeout-=10
title minilinux
root (fd0)
kernel /bzImage
initrd /image.gz
卸下软盘
umount /mnt/floppy
B. 运用 syslinux
fdformat /dev/fd0
mkfs.msdos /dev/fd0
mount -t msdos /dev/fd0 /mnt/floppy
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
cp syslinux-xx/ldlinxu.sys /mnt/floppy
cat > /mnt/floppy/syslinux.cfg
LABEL linux
KERNEL bzimage
APPEND initrd=image.gz
umont /mnt/floppy
syslinux-xx/syslinux /dev/fd0
sync
5、用软盘发动计算机,假如走运,minicom 的运转画面出现在屏幕上。
到此,咱们的单运用嵌入式 linux 做好了,但它还很粗陋,没有什么实践用处,但经过这个试验,能够了解嵌入式体系的大致结构和开发进程。在进行实践的嵌入式开发时,一般要在 PC 机上凭借嵌入式 linux 开发工具包,如:uclinux,bluecat 等,对相应的硬件渠道(方针机)进行软件编写编译,调试成功后,将内核及运用程序写入到方针机的存储器中,然后完结整个运用。