首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>系统管理>内核技术>正文

一个Linux爱好者的2.6.内核编译过程

http://www.oklinux.cn  2005-01-01  来源: Linux公社  goshawk168   会员收藏  游客收藏  【 】 

一个典型的桌面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


[*] Power Management Timer Support



APM (Advanced Power Management) BIOS Support --->


< > APM (Advanced Power Management) BIOS support


高级电源管理的支持,一般来说笔记本应该选上,台式机可以不选。


[ ] Ignore USER SUSPEND


[*] Enable PM at boot time


[ ] Make CPU Idle calls when idle


[ ] Enable console blanking using APM


[ ] RTC stores time in GMT 按Unix的标准,硬件的时钟应该设为格林威治时间


[ ] Allow interrupts during APM BIOS calls


[*] Use real mode APM BIOS call to power off



[*] CPU Frequency scaling


这一选项允许改变CPU的主频,使CPU在低负荷或使用电池时降低主频,达到省电的目的。


[ ] Enable CPUfreq debugging


< > /proc/cpufreq interface (deprecated)


Default CPUFreq governor (performance) --->


--- 'performance' governor


<*> 'powersave' governor


<*> 'userspace' governor for userspace frequency scaling


[ ] /proc/sys/cpu/ interface (2.4. / OLD)


<*> 'ondemand' cpufreq policy governor自动调节主频


<*> CPU frequency table helpers 多数的CPU需要这一项来调节主频


<*> ACPI Processor P-States driver 报告处理器的状态


< > AMD Mobile K6-2/K6-3 PowerNow!


< > AMD Mobile Athlon/Duron PowerNow!


< > AMD Opteron/Athlon64 PowerNow!


< > Cyrix MediaGX/NatSemi Geode Suspend Modulation


<*> Intel Enhanced SpeedStep Intel的变频技术支持


[ ] Use ACPI tables to decode valid frequency/voltage pairs


--- Built-in tables for Banias CPUs


< > Intel Speedstep on ICH-M chipsets (ioport interface)


< > Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface)


< > Intel Pentium 4 clock modulation


< > nVidia nForce2 FSB changing


< > Transmeta LongRun


< > VIA Cyrix III Longhaul


--- shared options


[ ] /proc/acpi/processor/../performance interface (deprecated)


[ ] Relaxed speedstep capability checks



总线类型:


[*] PCI support


PCI access mode (Any) --->强列建议选Any,系统将优先使用MMConfig,然后使用BIOS,最后使用Direct检测PCI设备。


[ ] Message Signaled Interrupts (MSI and MSI-X)


[ ] Legacy /proc/pci interface


[ ] PCI device name database


[ ] ISA support


[*] EISA support


[*] Vesa Local Bus priming


[*] Generic PCI/EISA bridge


[*] EISA virtual root device


[ ] EISA device name database


[ ] MCA support


< > NatSemi SCx200 support


PCCARD (PCMCIA/CardBus) support --->


PCI Hotplug Support --->



PCCARD (PCMCIA/CardBus) support --->一般只有笔记本电脑上才会有PCMCIA插槽,如果你是台式机的话,可以不选这一项,然后跳过这一部份。



PCI Hotplug Support --->


< > Support for PCI Hotplug (EXPERIMENTAL)


一般来讲只有服务器上会有热插拔的设备,如果你使用的是台式机,你可以不选择此项并跳过这一部份。



共2页: 上一页 1 [2] 下一页

上一篇:Linux下PCI设备驱动程序开发基本框架   下一篇:谈谈GCC4.0几个值得关注的新特性


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·谈谈GCC4.0几个值得关注的新特性
·Linux下PCI设备驱动程序开发基本框架
·
·解析Linux中的VFS文件系统机制
·向Alan Cox——Linux内核的维护者致敬
·2.4和2.6上的Web服务
·Linux 2.6内核如何武装Fedora Core 2
·升级内核,感受Linux新时空
·揭秘Linux内核调试器之内幕
·Linux 2.6内核新特性比较
·开发人员眼中的Linux 2.6内核
·揭开Linux系统内核调试器的神秘面纱
·Linux系统可卸载内核模块完全指南(上)
·深入浅出 Linux设备驱动编程内核模块
·高手风范 Linux操作系统内核编码风格
·Linux操作系统的内核编译内幕详解
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·学习园地:Linux系统内核中判断大小的
·系统编译:如何给Make命令来传递参数
·Linux 2.6内核中sysfs文件系统简单概述
·Fedora 8 Linux系统的内核配置注意事项
·升级Linux内核的一般步骤方法
·Linux发行版知识普及:三个版本的CPUID
·编译安装Virtualbox驱动模块
· Linux系统的内核解读入门
·新手学堂 Linux系统的内核解读入门
·Linux系统内核中网络参数的意义及其应
·走向Linux系统高手之路 内核编译过程解
·Linux系统中安装内核的方法详细介绍
  阅读排行
· 深入理解LINUX内核中文版下载地址
·基于S3C44B0微处理器的uClinux内核引导
·Kernel command using Linux system ca
·Linux 2.6内核如何武装Fedora Core 2
·Process priority and control on AIX
·Linux操作系统的内核编译内幕详解
·推荐:Linux用户态与内核态的交互
·通过振动向Linux ThinkPad传输信息
·Linux操作系统源代码详细分析(二)
·Linux系统内核接收以太帧的处理程序
·Linux and symmetric multiprocessing
·主流嵌入式Linux系统下GUI解决方案
·揭秘Linux内核调试器之内幕
·用命令行加挂Linux的文件系统简介
·Linux内核和核心OS组件的测试与分析
网摘收藏: