《基于ARM9的嵌入式Linux系统开发原理与实践》课件第8章_第1页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第8章_第2页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第8章_第3页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第8章_第4页
《基于ARM9的嵌入式Linux系统开发原理与实践》课件第8章_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章嵌入式Linux内核8.1Linux内核简介8.2Linux内核软件结构分析8.3Linux内核移植实例(移植Linux2.6.14.1到博创2410)本章小结

8.1Linux内核简介

Linux内核的起源可追溯到1991年芬兰大学生linustorvalds编写与第一次公布Linux的日子。尽管到目前为止,Linux内核系统早已远远发展到了torvalds编写之外的范围,但torvalds仍保持着对Linux内核的控制权,并且是Linux名称的唯一版权所有人。自发布Linux0.12版起,Linux就一直依照GPL(通用公共许可协议)自由软件许可协议进行授权。

8.2Linux内核软件结构分析

8.2.1Linux内核配置系统原理

1.配置系统的基本结构

本节对Makefile分析方法可参看第7章vivi中Makefile的详细分析,Linux内核的配置系统由三个部分组成,分别是:

① Makefile:分布在Linux内核源代码(包括子目录)中的Makefile,定义Linux内核的编译规则;②配置文件(config.in):给用户提供配置选择的功能;

③配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于Ncurses图形界面以及基于Xwindows图形界面的用户配置界面,各自对应于makeconfig、makemenuconfig和makexconfig)。这些配置工具都是使用脚本语言,如Tcl/TK、Perl编写的(也包含一些用C编写的代码)。

1) Makefile

(1) Makefile概述。

Makefile的作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码连接到一起,最终形成Linux内核二进制文件。

(2) Makefile中的变量。

顶层Makefile定义并向环境中输出了许多变量,为各个子目录下的Makefile传递一些信息。有些变量,比如SUBDIRS,不仅在顶层Makefile中定义并且赋初值,而且在arch/*/Makefile还作了扩充。

(3) Rules.make变量。

前面讲过,Rules.make是编译规则文件,所有的Makefile中都会包括Rules.make。Rules.make文件定义了许多变量,最为重要是那些编译、连接列表变量。

(4)子目录Makefile。

子目录Makefile用来控制本级目录以下源代码的编译

规则。

2)配置文件

(1)配置文件功能概述。

除了Makefile的编写,另外一个重要的工作就是把新功能加入到Linux的配置选项中,提供此项功能的说明,让用户有机会选择此项功能。所有的这些都需要在config.in文件中用配置语言来编写配置脚本。

(2)配置语言。

①顶层菜单。

mainmenu_name/prompt//prompt/是用“或”包围的字符串,“与”的区别是‘…’中可使用$引用变量的值。mainmenu_name设置最高层菜单的名字,它只在makexconfig时才会显示。②询问语句。

bool /prompt//symbol/

hex /prompt//symbol//word/

int /prompt//symbol//word/

string /prompt//symbol//word/

tristate /prompt//symbol/③定义语句。

define_bool /symbol//word/

define_hex

/symbol//word/

define_int

/symbol//word/

define_string /symbol//word/

define_tristate /symbol//word/④依赖语句。

dep_bool /prompt//symbol//dep/...

dep_mbool /prompt//symbol//dep/...

dep_hex /prompt//symbol//word//dep/...

dep_int /prompt//symbol//word//dep/...

dep_string /prompt//symbol//word//dep/...

dep_tristate /prompt//symbol//dep/...⑤选择语句。

choice/prompt//word//word/⑥ if语句。⑦菜单块(menublock)语句。

mainmenu_optionnext_comment

comment‘…’

endmenu⑧source语句。

source/word/

/word/是文件名,source的作用是调入新的文件。

(3)缺省配置。

Linux内核支持非常多的硬件平台,对于具体的硬件平台而言,有些配置是必需的,有些配置则不是必需的。另外,新增加功能的正常运行往往也需要一定的先决条件,针对新功能,必须作相应的配置。因此,特定硬件平台能够正常运行对应着一个最小的基本配置,这就是缺省配置。

(4) helpfile。

在配置Linux内核时,遇到不懂含义的配置选项,可以查看它的帮助,从中可得到选择的建议。下面介绍如何给一个配置选项增加帮助信息。

2.实例

对于一个开发者来说,将自己开发的内核代码加入到Linux内核中,需要三个步骤。首先确定把自己开发的代码放入到内核的位置;其次,把自己开发的功能增加到Linux内核的配置选项中,使用户能够选择此功能;最后,构建子目录Makefile,根据用户的选择,将相应的代码编译到最终生成的Linux内核中去。8.2.2配置Linux内核

内核配置过程比较繁琐,但是配置的适当与否和日后Linux的运行直接相关,有必要了解一些主要的且经常用到的选项的设置。图8-1xconfig配置界面图8-2menuconfig配置界面8.2.3Linux内核启动原理

在Bootloader将Linux内核映像拷贝到RAM以后,可以通过下例代码启动Linux内核:

call_linux(0,

machine_type,

kernel_params_base)。

1. Linux内核入口

Linux非压缩内核的入口位于文件 /arch/arm/kernel/head-armv.S中的stext段。该段的基地址就是压缩内核解压后的跳转地址。如果系统中加载的内核是非压缩的Image,那么bootloader将内核从Flash中拷贝到RAM后将直接跳到该地址处,从而启动Linux内核。

2. start_kernel函数

start_kernel是所有Linux平台进入系统内核初始化后的入口函数,它主要完成剩余的与硬件平台相关的初始化工作,在进行一系列与内核相关的初始化后,调用第一个用户进程init并等待用户进程的执行,这样整个Linux内核便启动完毕。

8.3Linux内核移植实例

(移植Linux2.6.14.1到博创2410)

8.3.1下载Linux内核并解压

下载linux2.6.14.1内核至/mnt/hgfs/share/mxl目录下,并进行解压。

[root@localhostmxl]#tarxjvflinux2.6.14.1.tar.gz

[root@localhostmxl]#pwd

/mnt/hgfs/share/mxl8.3.2修改Makefile

修改内核目录树根下的主Makefile,指明交叉编译器。

[root@localhostlinux2.6.14.1]#viMakefile

找到ARCH和CROSS_COMPILE,修改。

ARCH?=arm

CROSS_COMPILE?=/usr/local/arm/3.4.1/bin/arm-linux-8.3.3设置Flash分区

此处一共要修改三个文件,主要内容是:

1.指明分区信息(在arch/arm/mach-s3c2410/devs.c文件中)

在arch/arm/mach-s3c2410目录中的文件都是板级相关的,其中比较重要的是如下几个:

1)处理器和设备描述

设备描述主要由两个结构体完成:structresource和structplatform_device。

2)处理器和设备操作

①intplatform_device_register(structplatform_device*pdev);注册设备;

②voidplatform_device_unregister(structplatform_device*pdev);注销设备;

③intplatform_add_devices(structplatform_device**devs,intnum);添加设备,通过调用上面两个函数实现。

2.指定启动时初始化

kernel启动时依据我们对分区的设置进行初始配置。

3.禁止FlashECC校验

如果内核都是通过UBOOT写到NandFlash的,UBOOT通过的软件ECC算法产生ECC校验码,这与内核校验的ECC码不一样,因为内核中的ECC码是由S3C2410中NandFlash控制器产生的,所以这里选择禁止内核ECC校验。8.3.4配置内核

1.支持启动时挂载devfs

为了使内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载 /dev为devfs文件系统。

2.配置内核产生.config文件

[root@localhostlinux2.6.14.1]#cparch/arm/configs

/smdk2410_defconfig.config

[root@localhostlinux2.6.14.1]#makemenuconfig

3.编译内核

[root@localhostlinux2.6.14.1]#makezImage

成功编译的结果如图8-3所示。图8-32.6内核成功编译的结果

4.下载zImage到开发板

重启第7章成功移植的引导程序vivi,进入下载模式,运行命令:

vivi>loadflashkernelx

将新内核zImage下载到开发板中,如图8-4所示。图8-4串口下载2.6内核8.3.5测试2.6.14.1内核

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论