搜档网
当前位置:搜档网 › u_boot移植(九)之引导Linux 内核

u_boot移植(九)之引导Linux 内核

u_boot移植(九)之引导Linux 内核
u_boot移植(九)之引导Linux 内核

u_boot移植(九)之引导Linux 内核

通过前面几节的学习,我们已经将uboot成功的移植到了开发板。在这里我们思考一个问题 : "我们移植uboot的目的是什么呢?"

嗯,我们移植uboot的终极目的是用来引导Linux 内核的,接下来我们就来了解一下,uboot是如何引导Linux 内核?

一、uboot 和 Linux 内核之间的参数传递

我们知道,uboot启动后已经完成了基本的硬件初始化(如:内存、串口等),接下来它的主要任务就是加载Linux 内核到开发板的内存,然后跳转到Linux 内核所在的地址运行。

可能有人会问"如何跳转呢?",做法很简单,直接修改PC寄存器的值为Linux 内核所在的地址,这样CPU就会从Linux 内核所在的地址去取指令,从而执行内核代码。

需要注意的是,在执行Linux 内核代码前,uboot必须做好以下几件事情: (1)CPU 寄存器的设置

<1>R0 = 0

<2>R1 = 机器类型ID

<3>R2= 传递给Linux 内核参数所在内存中的起始地址

(2)CPU 工作模式设置

<1>必须禁止中断(IRQs 和 FIQs)

<2>CPU 必须为SVC模式

(3)Cache 和 MMU 的设置

<1>MMU 必须关闭

<2>指令Cache 可以打开也可以关闭

<3>数据Cache必须关闭

在ARM课程学习的过程中,我们讲解过函数间参数的APTCS标准,标准规

定函数的第[一、二、三、四]个参数分别用r0-r3来传递,这样大家应该就明白上面的第一步CPU寄存器的设置,实际上是给Linux 内核传递参数。

为什么要给Linux 内核传递参数呢?

因为Linux 内核启动的时候,需要一些参数。uboot启动的时候,完成了开发板上硬件的初始化,uboot可以自豪的说"这块开发板我是支持的",但是Linux 内核就很无语了,它是直接被加载内存中运行的,它对当前开发板的环境是一无所知的。所以,Linux 内核启动的时候就规定了,你uboot跳到我这里来运行的时候,必须告诉我一些信息,我要通过这些信息来判断是否支持当前开发板。

所以了,uboot就把机器ID写到CPU的R1中,Linux 内核运行的时候首先就从R1中读取机器ID来判断是否支持当前机器。

这个机器ID实际上就是开发板的ID,每个厂家生产出一款开发板的时候都会给它指定一个唯一的ID,大家可以到uboot源码的

include/asm-arm/mach-types.h文件中去查看。

嗯,我们明白了为什么要传递机器ID,那R2的值又是什么意思呢?

R2中存放的是块内存的基地址,这块内存中存放的是uboot 给Linux 内核的其他参数。这些参数有内存的起始地址、内存大小、Linux 内核启动后挂载文件系统的方式等信息。

很明显,参数有多个,不同的参数有不同的内容,为了让Linux 内核能精确的解析出这些参数,双方在传递参数的时候要求参数在存放的时候需要按照双方规定的格式存放。

在Linux 内核2.6以前,双方传递参数的格式用 struct param_struct结构

体描述,Linux 内核2.6以后双方传递的参数用tag 列表的形式描述。虽然目前的Linux 内核两种格式都支持,但是Linux 内核更喜欢用tag列表的方式传递参数,这里我们只介绍以tag列表的方式传递参数。

嗯,还是先来看看以tag列表方式传递参数涉及到一些数据结构:

从上面可以看出struct tag 结构体由 结构体struct tag_header + 联合体u构成。结构体struct tag_header用来描述每个tag的头部信息,如tag 的类型,tag 大小。 联合体u 用来描述每个传递给Linux 内核的参数信息。

下面以传递内存标记、命令行参数标记为例来说明参数的传递。

(1)设置开始标记ATAG_CORE

涉及到结构体定义如下:

tag_size 和 tag_next 定义如下:

(2)设置内存标记

相关结构体定义如下:

(3)设置命令行参数标记

命令行参数就是一个字符串,一般用它来告诉内核挂载根文件系统的方式。由uboot的bootargs环境变量提供,它的内容有以下两种格式: <1>root=nfs nfsroot=192.168.1.100:/source/rootfs

ip=192.168.1.200 init=/linuxrc console=ttySAC0,115200

<2>root=/dev/mtdblock2 ip=192.168.1.200 init=/linuxrc console=ttySAC0,115200

root 告诉Linux 内核挂载根文件系统的方式,nfs 表示以NFS服务的方式挂载根文件系统,/dev/mtdblock2 表示根文件系统在M TD设置的第二个分区上。

nfsro ot 告诉Linux 内核,以NFS方式挂载根文件系统时,根文件系统所在主机的IP地址和路径

ip 告诉Linux 内核,启动后它的ip地址

init告诉Linux 内核, 启动的第一个应用程序是根目录下的linuxrc 程序

conso

告诉Linux 内核,控制台为ttySAC0,波特率为115200 le

相关结构体定义如下:

(4)设置结束标记ATAG_NONE

我们简单总结一下,上面设置的tag内容,总结如下:

嗯,我们明白了运行Linux 内核的时候,uboot需要给内核的传递的参数,接下来我们就来看看如何从uboot中跳到

Linux 内核。

二、uboot 跳转到Linux 内核

在uboot中有两个命令可以用来跳转到指定的地址去执行,分别是go 和 bootm。 这两个命令的区别如下:

(1)go 命令仅仅修改pc的值到指定的地址,用法如下:

go 内存地址

(2)bootm命令uboot专门用来启动uImage格式的Linux 内核 ,它在修改

pc的值到指定地址之前,会设置传递给Linux 内核的参数,用法如下:

bootm 内存地址

还是先来说说Linux 内核镜像常用的格式,当Linux 源代码编译好后,可以产生vmlinux、Image、zImage、bzImage、uImage等格式。

<1>vmlinux

vmlinuz是可引导的、可压缩的内核镜像,vm代表Virtual Memory.Linux支持虚拟内存,因此得名vm.它是由用户对内核源码编译得到,实质是elf格式的文件。也就是说,vmlinux是编译出来的最原始的内核文件,未压缩。

<2>Image

Image是经过objcopy处理的只包含二进制数据的内核代码,它已经不是elf 格式了,但这种格式的内核镜像还没有经过压缩.

<3>zImage

zImage是ARM linux常用的一种压缩镜像文件,它是由vmlinux加上解压代码经gzip压缩而成。

<3>bzImage

bz表示big zImage,其格式与zImage类似,但采用了不同的压缩算法,注意,bzImage的压缩率更高。

<4>uImage

uImage是uboot专用的镜像文件,它是在zImage之前加上一个长度为

0x40的头信息(tag),在头信息内说明了该镜像文件的类型、加载位置、生成时间、大小等信息.换句话说,若直接从uImage的0x40位置开始执行,则zImage和uImage没有任何区别。

通过上面的介绍我们知道,如果通过bootm来启动Linux 内核,Linux 内核必须为uImage格式。关于如何生成uImage格式Linux 内核镜像,我们在移植Linux 内核的时候在说,接下来我们来看看go命令和bootm命令的实现。

1. uboot 中bootm命令实现

bootm命令在uboot源码common/cmd_bootm.c文件中实现,关于它的实现比较复杂,大家只需要知道它的功能就可以了。它的功能如下:

(1) 读取uImage头部,把内核拷贝到合适的地方

(2) 把参数给内核准备好,并告诉内核参数的首地址

(3) 引导内核

在这里我们分析一下(2)、(3)的实现过程,bootm命令从uImage头中读取信息后,发现是 Linux 内核,就会调用do_boot_linux()函数,这个函数在

uboot源码的lib_arm/bootm.c文件中实现,内容如下:

2.uboot 中go命令的实现

go命令在uboot源码common/cmd_boot.c文件中实现,内容如下:

可以看到go命令在实现的时候,并没有设置参数,只是简单的跳转到指定的地址去运行。

大家注意看上面我框起来的地方,do_go_exec函数用__attribute__((weak))修饰,表示这个函数时一个弱符号,这个知识点我们在前面说过哦!

为了让go命令也可以引导Linux 内核,我需要重写do_go_exec()函数。写什么东西呢?就是Linux 内核要求的那些东西呀!

我们在lib_arm/bootm.c文件中,添加如下代码:

很简单吧,do_bootm_linux()函数中已经把我们需要做的事情做好了,我们只需要调用它就可以了。

通过上面的分析我们知道,我们需要在uboot中设置bootargs这个环境变量值的,它最终作为命令行参数传递给Linux 内核的。接下来我们就来看看uboot中命令行参数的设置。

四、在uboot中添加自己的命令行参数

我们先来启动开发板,看看我们的uboot启动的时候,默认设置了哪些环境变量。

开发板启动信息如下:

输入print命令,输出如下:

可以看到,我们的uboot中默认设置的参数都是针对onenand的,不符合我们的要求。而且我们还会发现,我们的开发板启动的时候还输出了警告信息,告诉我们用CRC算法校验环境变量时候出错,最后选择了默认的环境变量。

我们先来看看,uboot中默认的环境变量是如何定义的。uboot默认的环境变量在common/env_common.c文件中定义,定义如下:

可以看到,默认的环境变量值都是通过相应的宏来设置的,接下来我们设置一下我们自己的环境变量,去掉uboot中默认的环境变量。修改include/configs/fsc100.h文件如下:

(1)注释掉一下内容

(2)添加如下宏

修改完毕后,重新编译uboot,然后烧写到nand flash,烧写步骤如下:

<1>将编译好的uboot.bin拷贝到tftp服务器的工作目录下

<2>启动开发板通过tftp 20008000 u-boot.bin命令,下载u-boot.bin到内存地址20008000

<3>通过nand erase 命令擦除Nand Flash 设备

<4>通过nand write 20008000 0 100000 命令,将内存地址20008000的uboot.bin写到Nand Flash的0地址

重新启动开发板,效果如下:

输入print命令,效果如下:

可以看到我们设置的默认环境变量,但是开发板启动的时候依然有警告说CRC校验错误,使用默认的环境变量。原因在于uboot启动的时候会先从Nand Flash中读取环境变量的内容,然后做一个CRC校验,如果校验错误就输出了警告信息。需要知道的是我们并没有在Nand Flash中保存环境变量,所以开发板启动的时候做CRC校验的时候就错误了。

怎么解决这个问题呢?

做法很简单,我们只需要输入save命令将当前默认的环境变量保存到Nand Flash即可。做法如下:

可以看到uboot默认将环境变量保存在Nand Flash的0x40000起始地址。需要注意的是,你的uboot大小一定不能超过0x40000

即256Byte,否则在save保存环境变量的时候,就会把uboot的内容破坏掉,最后出现的效果就是你在uboot中输入任何命令都无法识别。

如果想修改环境变量的值怎么办呢?

通过命令"setenv 环境变量名 内容"进行设置就可以了,设置成功之后用save命令保存一下就可以了。

貌似到目前为止,我们都没有用uboot启动内核,接下来我们就用我们的uboot来启动内核。

五、uboot 引导 Linux 内核的两种方式

1. uboot 通过网络引导Linux 内核

从上图可以看到,uboot 运行起来后,通过网络服务将Linux 内核从PC机上下载到开发板的内存中,然后在跳到内核所在的内存地址去执行。 做法如下:

<1>通过 tftp 20008000 zImage 命令下载内核镜像zImage到内存地址20008000

<2>通过go 20008000命令跳到20008000地址运行Linux 内核。

需要注意的是,我们的go命令已经做过修改了哦,如果没有做过修改是不能正常引导Linux 内核的,原因你懂得。

效果如下:

通过网络的方式引导Linux 内核,多用于开发调试阶段,这样我们只需要将编译好的Linux 内核拷贝到PC主机的TFTP服务的工作目录中,然后在开发板那边用tftp命令下载到开发板的内存中运行就可以测试 Linux 内核是否OK。

2.uboot 从Nand Flash 中引导Linux 内核

从上面我们可以看到,我们已经将嵌入式系统完全烧写到 Nand Flash 中,当开发板一上电启动的时候,uboot 会先运行起来,接着uboot 会用nand read 命令从Nand Flash中将Linux 内核读到内存的某个地址,然后跳到Linux 内核所在的地址去运行。

我们先将Linux 内核烧写到Nand Flash ,做法如下:

<1>tftp 20008000 zImage

<2>nand erase 20000000 300000

<3>nand write 20008000 20000000 300000

效果如下:

Linux内核修改与编译图文教程

Linux 内核修改与编译图文教程 1

1、实验目的 针对Ubuntu10.04中,通过下载新的内核版本,并且修改新版本内核中的系统调用看,然后,在其系统中编译,加载新内核。 2、任务概述 2.1 下载新内核 https://www.sodocs.net/doc/e511039083.html,/ 2.2 修改新内核系统调用 添加新的系统调用函数,用来判断输入数据的奇偶性。 2.3 进行新内核编译 通过修改新版内核后,进行加载编译。最后通过编写测试程序进行测试 3、实验步骤 3.1 准备工作 查看系统先前内核版本: (终端下)使用命令:uname -r 2

3.2 下载最新内核 我这里使用的内核版本是 3.3 解压新版内核 将新版内核复制到“/usr/src”目录下 在终端下用命令:cd /usr/src进入到该文件目录 解压内核:linux-2.6.36.tar.bz2,在终端进入cd /usr/src目录输入一下命令: bzip2 -d linux-2.6.36.tar.bz2 tar -xvf linux-2.6.36.tar 文件将解压到/usr/src/linux目录中 3

使用命令: ln -s linux-2.6.36 linux 在终端下输入一下命令: sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot sudo aptitude install libqt3-headers libqt3-mt-dev libqt3-compat-headers libqt3-mt 4

实验四Linux内核移植实验

合肥学院 嵌入式系统设计实验报告 (2013- 2014第二学期) 专业: 实验项目:实验四 Linux内核移植实验 实验时间: 2014 年 5 月 12 实验成员: _____ 指导老师:干开峰 电子信息与电气工程系 2014年4月制

一、实验目的 1、熟悉嵌入式Linux的内核相关代码分布情况。 2、掌握Linux内核移植过程。 3、学会编译和测试Linux内核。 二、实验内容 本实验了解Linux2.6.32代码结构,基于S3C2440处理器,完成Linux2.6.32内核移植,并完成编译和在目标开发板上测试通过。 三、实验步骤 1、使用光盘自带源码默认配置Linux内核 ⑴在光盘linux文件夹中找到linux-2.6.32.2-mini2440.tar.gz源码文件。 输入命令:#tar –jxvf linux-2.6.32.2-mini2440-20110413.tar对其进行解压。 ⑵执行以下命令来使用缺省配置文件config_x35 输入命令#cp config_mini2440_x35 .config;(注意:x35后面有个空格,然后有个“.”开头的 config ) 然后执行“make menuconfig”命令,但是会出现出现缺少ncurses libraries的错误,如下图所示: 解决办法:输入sudo apt-get install libncurses5-dev 命令进行在线安装ncurses libraries服务。

安装好之后在make menuconfig一下就会出现如下图所示。 ⑶配置内核界面,不用做任何更改,在主菜单里选择退出,并选“Yes”保存设置返回到刚命令行界面,生成相应配置的头文件。 编译内核: #make clean #make zImage 在执行#make zImage命令时会出现如下错误: 错误:arch/arm/mach-s3c2440/mach-mini2440.c:156: error: unknown field 'sets' specified in initializer 通过网上查找资料 于是在自己的mach-mini2440.c中加入 #include

如何自行编译一个Linux内核的详细资料概述

如何自行编译一个Linux内核的详细资料概述 曾经有一段时间,升级Linux 内核让很多用户打心里有所畏惧。在那个时候,升级内核包含了很多步骤,也需要很多时间。现在,内核的安装可以轻易地通过像 apt 这样的包管理器来处理。通过添加特定的仓库,你能很轻易地安装实验版本的或者指定版本的内核(比如针对音频产品的实时内核)。 考虑一下,既然升级内核如此容易,为什么你不愿意自行编译一个呢?这里列举一些可能的原因: 你想要简单了解编译内核的过程 你需要启用或者禁用内核中特定的选项,因为它们没有出现在标准选项里 你想要启用标准内核中可能没有添加的硬件支持 你使用的发行版需要你编译内核 你是一个学生,而编译内核是你的任务 不管出于什么原因,懂得如何编译内核是非常有用的,而且可以被视作一个通行权。当我第一次编译一个新的Linux 内核(那是很久以前了),然后尝试从它启动,我从中(系统马上就崩溃了,然后不断地尝试和失败)感受到一种特定的兴奋。 既然这样,让我们来实验一下编译内核的过程。我将使用Ubuntu 16.04 Server 来进行演示。在运行了一次常规的 sudo apt upgrade 之后,当前安装的内核版本是 4.4.0-121。我想要升级内核版本到 4.17,让我们小心地开始吧。 有一个警告:强烈建议你在虚拟机里实验这个过程。基于虚拟机,你总能创建一个快照,然后轻松地从任何问题中回退出来。不要在产品机器上使用这种方式升级内核,除非你知道你在做什么。 下载内核 我们要做的第一件事是下载内核源码。在 Kernel 找到你要下载的所需内核的URL。找到URL 之后,使用如下命令(我以 4.17 RC2 内核为例)来下载源码文件: wget https://git.kernel/torvalds/t/linux-4.17-rc2.tar.gz

linux操作系统内核实验报告

linux操作系统内核实验报告 篇一:linux操作系统实验报告 LINUX操作系统实验报告 姓名班级学号指导教师 XX 年 05月 16 日 实验一在LINUX下获取帮助、Shell实用功能实验目的: 1、掌握字符界面下关机及重启的命令。 2、掌握LINUX下获取帮助信息的命令:man、help。 3、掌握LINUX中Shell的实用功能,命令行自动补全,命令历史记录,命令的排列、替 换与别名,管道及输入输出重定向。 实验内容: 1、使用shutdown命令设定在30分钟之后关闭计算机。 2、使用命令“cat /etc/cron.daliy”设置为别名named,然后再取消别名。 3、使用echo命令和输出重定向创建文本文件/root/nn,内容是hello,然后再使用追加重定向输入内容为word。 4、使用管道方式分页显示/var目录下的内容。 5、使用cat显示文件/etc/passwd和/etc/shadow,只有正确显示第一个文件时才显示第二个文件。 实验步骤及结果:

1. 用shutdown命令安全关闭系统,先开机在图形界面中右击鼠标选中新建终端选项中输入 命令 Shutdown -h 30 2、使用命令alias将/etc/cron.daliy文件设置为别名named,左边是要设置的名称右边是要更改的文件。查看目录下的内容,只要在终端输入命令即可。取消更改的名称用命令unalias命令:在命令后输入要取消的名称,再输入名称。 3.输入命令将文件内容HELLO重定向创建文本文件/root/nn,然后用然后再使用追加重定向输入内容为word。步骤与输入内容HELLO一样,然后用命令显示文件的全部内容。 4.使用命令ls /etc显示/etc目录下的内容,命令是分页显示。“|”是管道符号,它可以将多个命令输出信息当作某个命令的输入。 5 实验二文件和目录操作命令 实验目的: 1、掌握LINUX下文件和目录的操作命令,如pwd、cd、ls、touch、mkdir、rmdir、cp、 mv、rm等。

嵌入式Linux内核移植详解(顶嵌)

内核移植阶段 内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。 内核和用户界面共同为用户提供了操作计算机的方便方式。也就是我们在windows下看到的操作系统了。由于内核的源码提供了非常广泛的硬件支持,通用性很好,所以移植起来就方便了许多,我们需要做的就是针对我们要移植的对象,对内核源码进行相应的配置,如果出现内核源码中不支持的硬件这时就需要我们自己添加相应的驱动程序了。 一.移植准备 1. 目标板 我们还是选用之前bootloader移植选用的开发板参数请参考上文的地址: https://www.sodocs.net/doc/e511039083.html,/thread-80832-5-1.html。bootloader移植准备。 2. 内核源码 这里我们选用比较新的内核源码版本linux-2.6.25.8,他的下载地址是 ftp://https://www.sodocs.net/doc/e511039083.html,/pub/linux/kernel/v2.6/linux-2.6.25.8.tar.bz2。 3. 烧写工具 我们选用网口进行烧写这就需要内核在才裁剪的时候要对网卡进行支持 4. 知识储备 要进行内核裁剪不可缺少的是要对内核源码的目录结构有一定的了解这里进 行简单介绍。 (1)arch/: arch子目录包括了所有和体系结构相关的核心代码。它的每一个子 目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体 系结构的子目录。PC机一般都基于此目录。 (2)block/:部分块设备驱动程序。 (3)crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验 算法。 (4) documentation/:文档目录,没有内核代码,只是一套有用的文档。 (5) drivers/:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目 录:如,/block 下为块设备驱动程序,比如ide(ide.c)。 (6)fs/:所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持 一个文件系统, 例如fat和ext2。

嵌入式Linux系统内核的配置、编译和烧写

实验二 嵌入式Linux系统内核的配置、编译和烧写 1.实验目的 1)掌握交叉编译的基本概念; 2)掌握配置和编译嵌入式Linux操作系统内核的方法; 3)掌握嵌入式系统的基本架构。 2.实验环境 1)装有Windows系统的计算机; 2)计算机上装有Linux虚拟机软件; 3)嵌入式系统实验箱及相关软硬件(各种线缆、交叉编译工具链等等)。 3.预备知识 1)嵌入式Linux内核的配置和裁剪方法; 2)交叉编译的基本概念及编译嵌入式Linux内核的方法; 3)嵌入式系统的基本架构。 4.实验内容和步骤 4.1 内核的配置和编译——配置内核的MMC支持 1)由于建立交叉编译器的过程很复杂,且涉及汇编等复杂的指令,在这里 我们提供一个制作好的编译器。建立好交叉编译器之后,我们需要完成 内核的编译,首先我们要有一个完整的Linux内核源文件包,目前流行 的源代码版本有Linux 2.4和Linux 2.6内核,我们使用的是Linux 2.6内核; 2)实验步骤: [1]以root用户登录Linux虚拟机,建立一个自己的工作路径(如用命令 “mkdir ‐p /home/user/build”建立工作路径,以下均采用工作路径 /home/user/build),然后将“cross‐3.3.2.tar.bz2、dma‐linux‐2.6.9.tar.gz、 dma‐rootfs.tar.gz”拷贝到工作路径中(利用Windows与虚拟机Linux 之间的共享目录作为中转),并进入工作目录; [2]解压cross‐3.3.2.tar.bz2到当前路径:“tar ‐jxvf cross‐3.3.2.tar.bz2”; [3]解压完成后,把刚刚解压后在当前路径下生成的“3.3.2”文件夹移 动到“/usr/local/arm/”路径下,如果在“/usr/local/”目录下没有“arm” 文件夹,用户创建即可; [4]解压“dma‐linux‐2.6.9.tar.gz”到当前路径下:

linux内核编译和生成makefile文件实验报告

操作系统实验报告 姓名:学号: 一、实验题目 1.编译linux内核 2.使用autoconf和automake工具为project工程自动生成Makefile,并测试 3.在内核中添加一个模块 二、实验目的 1.了解一些命令提示符,也里了解一些linux系统的操作。 2.练习使用autoconf和automake工具自动生成Makefile,使同学们了解Makefile的生成原理,熟悉linux编程开发环境 三、实验要求 1使用静态库编译链接swap.c,同时使用动态库编译链接myadd.c。可运行程序生成在src/main目录下。 2要求独立完成,按时提交 四、设计思路和流程图(如:包括主要数据结构及其说明、测试数据的设计及测试结果分析) 1.Makefile的流程图: 2.内核的编译基本操作 1.在ubuntu环境下获取内核源码 2.解压内核源码用命令符:tar xvf linux- 3.18.12.tar.xz 3.配置内核特性:make allnoconfig 4.编译内核:make 5.安装内核:make install

6.测试:cat/boot/grub/grub.conf 7.重启系统:sudo reboot,看是否成功的安装上了内核 8.详情及结构见附录 3.生成makefile文件: 1.用老师给的projec里的main.c函数。 2.需要使用automake和autoconf两个工具,所以用命令符:sudo apt-get install autoconf 进行安装。 3.进入主函数所在目录执行命令:autoscan,这时会在目录下生成两个文件 autoscan.log和configure.scan,将configure.Scan改名为configure.ac,同时用gedit打开,打开后文件修改后的如下: # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([main.c]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE(main,1.0) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile) 4.新建Makefile文件,如下: AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=main first_SOURCES=main.c 5.运行命令aclocal 命令成功之后,在目录下会产生aclocal.m4和autom4te.cache两个文件。 6.运行命令autoheader 命令成功之后,会在目录下产生config.h.in这个新文件。 7.运行命令autoconf 命令成功之后,会在目录下产生configure这个新文件。 8.运行命令automake --add-missing输出结果为: Configure.ac:11:installing./compile’ Configure.ac:8:installing ‘.install-sh’ Configure.ac:8:installing ‘./missing’ Makefile.am:installing ‘./decomp’ 9. 命令成功之后,会在目录下产生depcomp,install-sh和missing这三个新文件和执行下一步的Makefile.in文件。 10.运行命令./configure就可以自动生成Makefile。 4.添加内核模块

02--基于ARM9的Linux2.6内核移植

基于ARM9的Linux2.6内核移植 姓名 系别、专业 导师姓名、职称 完成时间

目录 摘要................................................... I ABSTARCT................................................ II 1 绪论.. (1) 1.1课题研究的背景、目的和意义 (1) 1.2嵌入式系统现状及发展趋势 (1) 1.3论文的主要工作 (4) 2 嵌入式 Linux系统构成和软件开发环境 (5) 2.1嵌入式Linux系统的体系结构 (5) 2.2嵌入式Linux系统硬件平台 (5) 2.3嵌入式Linux开发软件平台建立 (7) 2.4本章小结 (11) 3 嵌入式Linux的引导BootLoader程序 (12) 3.1 BootLoader概述 (12) 3.2 NAND Flash和NOR Flash的区别 (13) 3.3本章小结 (19) 4 Linux内核的编译、移植 (20) 4.1 Linux2.6内核的新特性简介 (20) 4.2 Linux内核启动流程 (20) 4.3内核移植的实现 (21) 4.4 MTD内核分区 (23) 4.5配置、编译内核 (24) 4.6本章小结 (26) 5 文件系统制作 (27) 5.1 yaffs文件系统简介 (27) 5.2 内核支持YAFFS文件系统 (27) 5.3本章小结 (30) 6测试 (31) 6.1简单测试方法的介绍 (31) 6.2编写简单C程序测试移植的系统 (31) 6.3在开发板执行测试程序 (32)

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转) linux是如何组成的? 答:linux是由用户空间和内核空间组成的 为什么要划分用户空间和内核空间? 答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的 安全性,比如X86可以有4种模式RING0~RING3 RING0特权模式给LINUX内核空间RING3给用户空间 linux内核是如何组成的? 答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、 VFS(Virtual File Systerm)虚拟文件系统、NS(Network Stack)网络协议栈、DD(Device Drivers)设备驱动 linux 内核源代码 linux内核源代码是如何组成或目录结构? 答:arc目录存放一些与CPU体系结构相关的代码其中第个CPU子目录以分解boot,mm,kerner等子目录 block目录部分块设备驱动代码 crypto目录加密、压缩、CRC校验算法 documentation 内核文档 drivers 设备驱动 fs 存放各种文件系统的实现代码 include 内核所需要的头文件。与平台无关的头文件入在include/linux子目录下,与平台相关的头文件则放在相应的子目录中 init 内核初始化代码 ipc 进程间通信的实现代码 kernel Linux大多数关键的核心功能者是在这个目录实现(程序调度,进程控制,模块化) lib 库文件代码 mm 与平台无关的内存管理,与平台相关的放在相应的arch/CPU目录net 各种网络协议的实现代码,注意而不是驱动 samples 内核编程的范例 scripts 配置内核的脚本 security SElinux的模块 sound 音频设备的驱动程序 usr cpip命令实现程序 virt 内核虚拟机 内核配置与编译 一、清除 make clean 删除编译文件但保留配置文件

Linux内核移植开发手册

江苏中科龙梦科技有限公司 Linux内核移植开发手册 修 订 记 录 项 次 修订日期 版 本修订內容修订者审 核 1 2009‐02‐04 0.1 初版发行陶宏亮, 胡洪兵 2 2009‐11‐20 0.2 删除一些 多余文字 陶宏亮, 胡洪兵

DISCLAIMER THIS DOCUMENTATION IS PROVIDED FOR USE WITH LEMOTE PRODUCTS. NO LICENSE TO LEMOTE PROPERTY RIGHTS IS GRANTED. LEMOTE ASSUMES NO LIABILITY, PROVIDES NO WARRANTY EITHER EXPRESSED OR IMPLIED RELATING TO THE USAGE, OR INTELLECTUAL PROPERTY RIGHT INFRINGEMENT EXCEPT AS PROVIDED FOR BY LEMOTE TERMS AND CONDITIONS OF SALE. LEMOTE PRODUCTS ARE NOT DESIGNED FOR AND SHOULD NOT BE USED IN ANY MEDICAL OR LIFE SUSTAINING OR SUPPORTING EQUIPMENT. ALL INFORMATION IN THIS DOCUMENT SHOULD BE TREATED AS PRELIMINARY. LEMOTE MAY MAKE CHANGES TO THIS DOCUMENT WITHOUT NOTICE. ANYONE RELYING ON THIS DOCUMENTATION SHOULD CONTACT LEMOTE FOR THE CURRENT DOCUMENTATION AND ERRATA. JIANGSU LEMOTE TECHNOLOGY CORPORATION LIMITED MENGLAN INDUSTRIAL PARK,YUSHAN,CHANGSHU CITY,JIANGSU PROVINCE,CHINA Tel: 0512‐52308661 Fax: 0512‐52308688 Http: //https://www.sodocs.net/doc/e511039083.html,

基于Linux内核编程的实验报告(Linux内核分析实验报告)

基于Linux内核编程的实验报告(Linux内核分析实验 报告) 以下是为大家整理的基于Linux内核编程的实验报告(Linux内核分析实验报告)的相关范文,本文关键词为基于,Linux,内核,编程,实验,报告,分析,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。 Linux内核分析实验报告

实验题目:文件系统实验 实验目的:linux文件系统使用虚拟文件系统VFs作为内核文件子系统。可以安装多种 不同形式的文件系统在其中共存并协同工作。VFs对用户提供了统一的文件访问接口。本实验的要求是 (1)编写一个get_FAT_boot函数,通过系统调用或动态模块调用它可以提 取和显示出FAT文件系统盘的引导扇区信息。这些信息的格式定义在内核文件的fat_boot_sector结构体中。函数可通过系统调用或动态模块调用。 (2)编写一个get_FAT_dir函数,通过系统调用或动态模块调用它可以 返回FAT文件系统的当 前目录表,从中找出和统计空闲的目录项(文件名以0x00打头的为从未使用过目录项,以0xe5打头的为已删除的目录项),将这些空闲的目录项集中调整到目录表的前部。这些信息的格式定义在内核文件的msdos_dir_entry结构体中。 硬件环境:内存1g以上 软件环境:Linux(ubuntu)2-6实验步骤: 一:实验原理: 以实验4为蓝本,在优盘中编译并加载模块,启动测试程序,查

/proc/mydir/myfile的文件内容。从优盘得到fat文件系统的内容存在msdos_sb_info结构中,然后得到msdos_sb_info结构相应的属性值,得到实验一的数据。实验二中,得到fat文件系统第一个扇区的十六个文件信息。然后按照文件名头文字的比较方法,应用归并排序的方法,将头文件是0x00和0xe5的文件调到前面,其他的文件调到后面 二:主要数据结构说明: (1)超级块对象: 数据结构说明:一个已经安装的文件系统的安装点由超级块对象代表。 structsuper_block{... conststructsuper_operations*s_op;} (2)索引i节点对象 数据结构说明:索引i节点对象包含了内核要操作的文件的全部控制信息,对应着打开文件的i节点表。structinode{ conststructinode_operations*i_op;...} (3)目录项对象 数据结构说明:录项对象代表了文件路径名的各个部分,目录文件名和普 通文件名都属于目录项对象。structdentry{

linux实验报告(编译内核)

湖北大学 学生实验报告 实验课程网络实用技术 开课学院计算机与信息工程学院 任课教师徐婕 学生姓名骆婧 学生学号20112211042100 70 专业班级计科一班 学生年级2011级 2013-2014 学年第二学期

一.实验目的 通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。 二.实验内容 1.Linux环境下的C或者C++编译和调试工具的使用 2.向Linux内核增加新的系统调用,系统调用的功能为打印出自己的学号和 姓名信息。 3.Linux新内核的编译、安装和配置。 4.编写应用程序以测试新的系统调用并输出测试结果。 三、实验步骤 第一步:解压文件 1.下载linux-3.13.3.tar.xz压缩包。 2.在Ubantu系统下,解压该文件,解压之后得到linux- 3.13.3文件包 # tar –xf linux-3.13.3.tar.xz 3.将解压后的文件包复制到/usr/src # cp linux3.13.3 /usr/src 第二步:修改源程序,增加系统调用 1.gedit /usr/src/linux-3-13.3/kernel/sys.c (增加系统调用,使用面向内核的 打印函数printk打印姓名学号) 使用gedit命令,可以直接在文档编辑器中直接修改。修改好后按保存关闭文档编辑器。 在开头加入头文件: #include 在末尾加入函数 asmlinkage int sys_mycall(void) { printk(KERN_ALERT "My name is XXXX!My studentid is XXXXXXX\n"); return 1; } 2.gedit /usr/src/linux-3-1 3.3/arch/x86/include/asm/syscalls.h 在倒数第二行后插入 asmlinkage int sys_mycall(void);

linux2.6内核的编译步骤及模块的动态加载-内核源码学习-linux论坛

[原创]linux2.6内核的编译步骤及模块的动态加载-内核源码 学习-linux论坛 05年本科毕业设计做的是Linux下驱动的剖析,当时就买了一本《Linux设备驱动程序(第二版)》,但是没有实现将最简单的helloworld程 序编译成模块,加载到kernel里。不过,现在自己确实打算做一款芯片的Linux的驱动,因此,又开始看了《Linux设备驱动程序》这本书,不过已 经是第三版了。第二版讲的是2.4的内核,第三版讲的是2.6的内核。两个内核版本之间关于编译内核以及加载模块的方法都有所变化。本文是基于2.6的内核,也建议各位可以先看一下《Linux内核设计与实现(第二版)》作为一个基础知识的铺垫。当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块。个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.20-1-686.第一步,下载Linux内核的源代码,即构建LDD3(Linux Device Drivers 3rd)上面所说的内核树。 如过安装的Linux系统中已经自带了源代码的话,应该在/usr/src目录下。如果该目录为空的话,则需要自己手动下载源代码。下载代码的方法和链接很多,也可以在CU上通过

https://www.sodocs.net/doc/e511039083.html,/search/?key=&;q=kernel&a mp;frmid=53去下载。不过,下载的内核版本最好和所运行的Linux系统的内核版本一致。当然,也可以比Linux系统内核的版本低,但高的话应该不行(个人尚未实践)。 Debian下可以很方便的通过Debian源下载: 首先查找一下可下载的内核源代码: # apt-cache search linux-source 其中显示的有:linux-source-2.6.20,没有和我的内核版本完全匹配,不过也没关系,直接下载就可以了: # apt-get install linux-source-2.6.20 下载完成后,安装在/usr/src下,文件名为: linux-source-2.6.20.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码: # tar jxvf linux-source-2.6.20.tar.bz2

我来说linux移植过程

我对linux移植过程的整体理解 首先,要开始移植一个操作系统,我们要明白为什么要移植。因为我们要在另外一个平台上用到操作系统,为什么要用操作系统,不用行不行?这个问题的答案不是行或不行来回答。单片机,ARM7都没有操作系统,我们直接对寄存器进行操作进而实现我们需要的功能也是可以。但是,一些大型的项目设计牵涉很多到工程的创建,单纯对裸机进行操作会显得杂乱庞大这时候需要一个操作系统。 操作系统的功能能。我们用到操作系统,一方面可以控制我们的硬件和维护我们的硬件,另一方面可以为我们得应用程序提供服务。呵呵,这样说还是很抽象,具体到项目中就可以感受到操作系统的好处。 Linux操作系统的移植说白了总共三大部分:一,内核的重新编译。二,bootloader的重新编译。三,文件系统的制作。在这里要解释这些名词也很不好说的明白,首先,一个完整的操作系统是包括这三大部分的,内核、Bootloader、文件系统。我们知道Linux有很多版本,不同的版本只是文件系统不一样而内核的本质都是一样的。 那么,我们开始进行移植。首先是内核。1.我们需要下载一个内核源码,这个在网上很好下载,下载后,保存下。2.把这个压缩包复制到ubuntu(我用的版本)里,一般复制到/home/dong/SoftEmbed(我的目录,呵呵),然后呢,我们需要对这个内核进行修改重新编译,为什么要这样做,因为我们要让内核为我们的ARM服务,所以需要修改一些东西的。至于具体如何修改,我已经写在另外一个文档里了。3.修改的内容主要是 Makefile(设置体系架构为arm,设置交叉编译器)、时钟频率(我们板子的频率)、内核配置(进入内核配置主要是设置一些选项以适合我们的开发板)。具体设置步骤我会另加说明。4.设置好后我们需要重新编译内核,用的是make zImage命令。编译后就生成了我们自己编译好的内核,呵呵。 接下来,进行文件系统的移植。我们需要一个Yaffs2文件系统压缩包。1.复制这个压缩包到/home/dong/SoftEmede(我自己在ubuntu里建的目录,呵呵),2.解压,会生成一个文件夹。3.给内核打补丁,通过执行 ./patsh-ker.sh c /内核目录。呵呵4.进入 make menuconfig中配置选项,要选择对yaffs2的支持,具体怎么设置我写在另一个文档。 接下来,我们进行根文件制作,需要一个制作工具 mkyaffs2image.taz.还是复制到我自己的目录下,解压,安装。接着,我们需要对Busybox的移植、配置,具体移植、配置步骤我另写,呵呵。最后是构建我们自己的文件系统,到此我们已经完成了内核移植和文件系统的制作。准备移植,呵呵。今天先写到这里,累了。

Linux kernel内核升级全过程,教你一次成功

序言 由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。没想到这一弄就花了两天时间( 反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。 网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多 文章在转载过程中命令行都有错误。刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。 现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统 ,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享 ~~! 一、准备工作 首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。 启动Linux系统,并用根用户登录,进入终端模式下。 1、查看Linux内核版本 # uname -a 如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是 2.4.x,那恭喜你,闯关通过,赶快进行下一步。 2、下载2.6内核源码 下载地址:https://www.sodocs.net/doc/e511039083.html,/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 3、下载内核升级工具 (1)下载module-init-tools-3.2.tar.bz2 https://www.sodocs.net/doc/e511039083.html,/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2 (2)下载mkinitrd-4.1.18-2.i386.rpm https://www.sodocs.net/doc/e511039083.html,/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm (3)下载lvm2-2.00.25-1.01.i386.rpm https://www.sodocs.net/doc/e511039083.html,/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm (4)下载device-mapper-1.00.19-2.i386.rpm https://www.sodocs.net/doc/e511039083.html,/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm (2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到https://www.sodocs.net/doc/e511039083.html,/guestbook留下你的邮箱,我给你发过去)

嵌入式Linux内核移植试验

07秋嵌入式实验 1. 实验设备的连接 1. 参看《JXARM9-2410-1用户手册》中第一章,熟悉目标设备硬件,进行硬件检测。 2. 参看《JXARM9-2410-1用户手册》中第二章,安装好实验设备:电源,并口等。 3. 参看《JXARM9-2410-1用户手册》中第三章,了解目标设备硬件资源。 2. 软件安装与设置 参看《JXARM9-2410-1用户手册》中第四章,在主机Windows环境下安装实验环境:ADT,而DNW(一种超级终端软件)和tftp可以直接运行。 3. ADT IDE 开发流程 参看《JXARM9-2410-1用户手册》中第五章,通过并口线连接目标机的简易仿真口(ARM9SIMPLE),进行无操作系统实验:(实验教材P38) (1)对于包含ADT 1000仿真器的用户,请选择ARM9LPT,对于简易调试器的用户,请选择ARM9SIMPLE,本实验选择ARM9SIMPLE。 (2)导入examples目录中的工作区文件“examples.aws”,调试运行leddemo、stepper 等程序 (3)注意:要运行的工程需设置为当前工程 4. Uboot基本实验 参看《JXARM9-2410-1用户手册》中第七章的“7.2 Windows环境下使用u-boot”:(实验教材P186) (1)将连接目标机简易仿真口的并口线去掉,连接好UART0串口线,网线。 (2)在宿主机打开远程登陆软件DNW(或者超级终端),选择115200,COM1,建立与目标机的连接 (3)重新启动目标机,在DNW中会看到与目标机LCD相同的信息,表示连接成功! (4)在超级终端中使用Uboot命令行接口,练习Uboot的基本命令:help、flinfo、bdinfo、md、dmp、printenv、setenv、saveenv、run等

实验6 ——Linux 内核移植实验

实验 6 Linux-2.6.28移植实验 【实验目的】 熟悉Linux-2.6.28移植过程。 【实验步骤】 第一步:从https://www.sodocs.net/doc/e511039083.html,/pub/linux/kernel/v2.6下载linux-2.6.28.tar.bz2压缩文件(或光盘中提供); 【图5-3-1】 第二步:将linux-2.6.28.tar.bz2压缩文件复制到Linux工作目录; 第三步:在Linux下利用tar jxvf linux-2.6.28.tar.bz2命令解压linux-2.6.28.tar.bz2压缩文件。 第四步:进入解压后的linux-2.6.28目录下,利用vi编辑工具修改linux-2.6.28目录下的顶层Makefile文件。 第五步:修改linux-2.6.28目录下的顶层Makefile文件,设置编译linux操作系统的CPU体系架构变量ARCH 和所使用的交叉编译工具链变量CROSS_COMPILE(注:实验使用arm-linux交叉编译工具链 4.2.1版本,可从https://www.sodocs.net/doc/e511039083.html,/pub/snapgear/tools/arm-linux/下载arm-linux-tools-20070808.tar.gz压缩文件,解压到/OPT目录下)。 改为 ARCH ?= arm CROSS_COMPILE ?=/opt/usr/local/bin/arm-linux-

【图5-3-2】 第六步:将linux-2.6.28目录下的arch/arm/configs/mainstone_defconfig文件复制为xsbase270_defconfig文件。 第七步:在linux-2.6.28/arch/arm/mach-pxa目录下增加一个xsbase270.c文件(实际上从该目录下的mainstone.c复制而来.也可以直接复制实验代码中的文件),然后根据实际平台进行修改。 第八步:修改linux-2.6.28\arch\arm\mach-pxa目录下的Makefile文件,增加编译xsbase270.c 的编译选项,即:obj-$(CONFIG_MACH_XSBASE270) += xsbase270.o。 第九步:修改linux-2.6.28\arch\arm\mach-pxa目录下的Kconfig文件,增加在裁剪内核时支持对EELiod/Liod平台的选择 【图5-3-3】 第十步:linux-2.6.28/drivers/mtd/maps文件夹中增加一个xsbase270-flash.c文件(注:xsbase270-flash.c从该目录下的mainstone-flash.c修改而来, 也可以直接复制实验代码中的文件)。 第十一步:修改linux-2.6.28\drivers\mtd\maps目录下的Makefile文件,增加编译xsbase270-flash.c的编译选项, 即:obj-$ (CONGIG_MTD_XSBASE270 ) += xsbase270-flash.o。

基于ARM的嵌入式linux内核的裁剪与移植.

基于ARM的嵌入式linux内核的裁剪与 移植 0引言微处理器的产生为价格低廉、结构小巧的CPU和外设的连接提供了稳定可靠的硬件架构,这样,限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,已经陆续出现了一些嵌入式操作系统(比较著名的有Vxwork、pSOS、Neculeus和WindowsCE)。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。而Linux的开放性,使得许多人都认为Linu 0 引言 微处理器的产生为价格低廉、结构小巧的CPU和外设的连接提供了稳定可靠的硬件架构,这样,限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,已经陆续出现了一些嵌入式操作系统(比较著名的有Vxwork、pSOS、Nec uleus和Windows CE)。但这些专用操作系统都是商业化产品,其高昂的价格使许多低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。而Linux的开放性,使得许多人都认为Linux 非常适合多数Intemet设备。Linux操作系统可以支持不同的设备和不同的配置。Linux对厂商不偏不倚,而且成本极低,因而很快成为用于各种设备的操作系统。嵌入式linux是大势所趋,其巨大的市场潜力与酝酿的无限商机必然会吸引众多的厂商进入这一领域。 1 嵌入式linux操作系统 Linux为嵌入操作系统提供了一个极有吸引力的选择,它是个和Unix 相似、以核心为基础、全内存保护、多任务、多进程的操作系统。可以支持广泛的计算机硬件,包括X86、Alpha、Sparc、MIPS、PPC、ARM、NEC、MOTOROLA 等现有的大部分芯片。Linux的程序源码全部公开,任何人都可以根据自己的需要裁剪内核,以适应自己的系统。文章以将linux移植到ARM920T内核的 s3c2410处理器芯片为例,介绍了嵌入式linux内核的裁剪以及移植过程,文中介绍的基本原理与方法技巧也可用于其它芯片。 2 内核移植过程 2.1 建立交叉编译环境 交叉编译的任务主要是在一个平台上生成可以在另一个平台上执行的程序代码。不同的CPU需要有不同的编译器,交叉编译如同翻译一样,它可以把相同的程序代码翻译成不同的CPU对应语言。 交叉编译器完整的安装涉及到多个软件安装,最重要的有binutils、gcc、glibc三个。其中,binutils主要用于生成一些辅助工具;gcc则用来生成交叉编译器,主要生成arm—linux—gcc交叉编译工具;glibc主要是提供用户程序所使用的一些基本的函数库。 自行搭建交叉编译环境通常比较复杂,而且很容易出错。本文使用的是

相关主题