学习嵌入式Linux体系的条记和了解
发布日期:2011-05-03
一个典范的桌面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等,对相应的硬件平台(目标机)举行软件编写编译,调试告成后,将内核及应用步调写入到目标机的存储器中,从而完成整个应用。