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

 
学习嵌入式 Linux 的笔记和体会
 
整理: Ackarlix
 
一个典型的桌面 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 等,对相应的硬件平台 ( 目标机 ) 进行软件编写编译,调试成功后,将内核及应用程序写入到目标机的存储器中,从而完成整个应用。 (T113) 式机会选这项。
 
< > Toshiba Laptop support
 
< > Dell laptop support
 
< > /dev/cpu/microcode - Intel IA32 CPU microcode support
 
< > /dev/cpu/*/msr - Model-specific register support
 
< > /dev/cpu/*/cpuid - CPU information support
 
Firmware Drivers --->
 
< > BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL)
 
High Memory Support (4GB) --->
 
[ ] Allocate 3rd-level pagetables from highmem
 
[ ] Math emulation
 
[*] MTRR (Memory Type Range Register) support
 
[ ] Boot from EFI support (EXPERIMENTAL)
 
[*] Enable kernel irq balancing
 
[ ] Use register arguments (EXPERIMENTAL)
 
 
 
电源管理:
 
Power management options (ACPI, APM) --->
 
[*] Power Management support
 
[ ] Power Management Debug Support
 
[ ] Software Suspend (EXPERIMENTAL)
 
ACPI (Advanced Configuration and Power Interface) Support --->
 
APM (Advanced Power Management) BIOS Support --->
 
CPU Frequency scaling --->
 
 
ACPI (Advanced Configuration and Power Interface) Support --->
 
[*] ACPI Support
 
这是一种电源管理方式,你可以看看你的 BIOS 是否支持。如果支持的话建议你选上这项
 
[ ] Sleep States (EXPERIMENTAL)
 
< > AC Adapter
 
< > Battery
 
<*> Button 捕获 Power Sleep Lid (我也不知道这是什么按钮)等按钮是否按下,并做相应的动作
 
<*> Video 集成在板上的显卡的 ACPI 支持,对有些板卡可能不起作用
 
< > Fan
 
<*> Processor
 
<*> Thermal Zone
 
< > ASUS/Medion Laptop Extras
 
< > IBM ThinkPad Laptop Extras
 
< > Toshiba Laptop Extras
 
(0) Disable ACPI for systems before Jan 1st this year
 
[ ] Debug Statements
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值