QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2266|回复: 5

学习嵌入式Linux系统的笔记和体会

[复制链接]
发表于 2005-12-6 23:53:01 | 显示全部楼层 |阅读模式
一个典型的桌面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的时候会看见屏幕打印信息。  

--
※ 来源:.天大求实BBS bbs.tju.edu.cn.[FROM: 202.113.13.188]
 楼主| 发表于 2005-12-6 23:53:50 | 显示全部楼层
入门试验,制作一个简单的应用

我们使用一张软盘启动一台假象的只有一个串口,键盘输入,显示输出的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
【 在 darksun (大个 | 受不了了,这么多弱智问题,时间啊) 的大作中提到: 】
: 一个典型的桌面Linux系统包括3个主要的软件层---linux内核、C库和应用程序代码。
: 内核是唯一可以完全控制硬件的层,内核驱动程序代表应用程序与硬件之间进行会话。内核之上是C库,负责把POSIX API转换为内核可以识别的形式,然后调用内核,从应用程序向内核传递参数。应用程序依靠驱动内核来完成特定的任务。
: 在设计嵌入式应用的时候,可以不按照这种层次,应用程序越过C库直接和内核会话,或者把应用和内核捆绑在一起,甚至可以把应用写为内核的一个线程,在内核中运行,虽然这样在移植上带来了困难,但考虑嵌入式系统对尺寸要求小的特点,是完全可行的。不过我们使用三层软件?
: 的模式来学习嵌入式linux将会是我们认识更清晰,简单可行并使应用具有弹性。
: 快速入门
: 最简单的建立嵌入式Linux应用的方法就是从我们使用的桌面Linux入手,安装一个喜爱的版本,把我们的某个应用作为初始化的一部分,框架就算完成了。
: ...................

--
※ 来源:.天大求实BBS bbs.tju.edu.cn.[FROM: 202.113.13.188]
回复

使用道具 举报

 楼主| 发表于 2005-12-6 23:55:01 | 显示全部楼层
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等,对相应的硬件平台(目标机)进行软件编写编译,调试成功后,将内核及应用程序写入到目标机的存储器中,从而完成整个应用。
【 在 darksun (大个 | 受不了了,这么多弱智问题,时间啊) 的大作中提到: 】
: 入门试验,制作一个简单的应用
: 我们使用一张软盘启动一台假象的只有一个串口,键盘输入,显示输出的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
: ...................

--
※ 来源:.天大求实BBS bbs.tju.edu.cn.[FROM: 202.113.13.188]
回复

使用道具 举报

发表于 2005-12-10 22:49:47 | 显示全部楼层
Good conclusion... Good sharing...
Thanks!
回复

使用道具 举报

发表于 2006-3-8 20:39:42 | 显示全部楼层

从零开始自学嵌入式开发,有可能吗

知道linux的系统管理,对编程不太懂,只是听说嵌入式开发前景比较广,所以想自学嵌入式开发,但看到什么开发板之类的,不太懂,是不是学这个要一定的硬件支持呢,有没有详细介绍的地方,有劳啦!
回复

使用道具 举报

发表于 2006-3-10 12:05:04 | 显示全部楼层
嵌入式Linux=bootloader+内核+rootfs。
不过真正要做的是device driver,应用软件不应该由嵌入式开发人员完成,普通的linux程序员比我们更能胜任:)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-27 08:54 , Processed in 0.059248 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表