Linux内核3.0移植并基于Initramfs根文件系统启动

Linux内核移植与启动

 

Target borad:FL2440

 

Bootloader:U-boot-2010.09

交叉编译器:buildroot-2012.08

 

 

1.linux内核基础知识

首先,磨刀不误砍柴工。在动手进行linux内核移植之前,我们有必要对linux内核进行一定的了解。

1.1 Linux内核启动过程概述

一个嵌入式Linux系统从软件角度看可以分为四个部分: 

引导加载程序(Bootloader),Linux内核,文件系统,应用程序。

 

其中Bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux内核,linux内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(rootfs),根文件系统是linux系统的核心组成部分,也是内核启动时首先要挂载的就是根文件系统。它可以作为linux系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用程序需要的库,保证了人和内核的信息交互。应用程序则是嵌入式系统所要达到的目标,一切的准备都是为了实现程序。若是没有应用程序,硬件上再精良嵌入式系统都没有实用意义。

 Bootloader:在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。Bootloader在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。它最根本的功能就是为了启动linux内核. 为了启动内核Bootloader要依次完成

初始化RAM—初始化串口—检测处理器类型—设置Linux启动参数(bootargs)—调用Linux内核镜像

 

文件系统:Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。

1.2 编译环境交叉编译器的制作

交叉编译器本节不过多介绍。但我们必须知道若要实现人,虚拟机,开发板之间的信息传递就必须首先制作交叉编译器来帮助我们编译。在做好交叉编译器准备好编译环境之后我们就可以开始进行纯内核移植了。(在此使用的交叉编译器为buildroot-2012.08)

2.Linux内核移植与启动

 

2.1下载并解压缩linux-3.0.tar.bz2 源代码

首先到 Linux Kernel 官方网站www.kernel.org下载得到 linux-3.0-rc4.tar.bz2 文件,把它放到一个你有权限读写的文件夹,运行下面命令解压缩并进入解压后的文件夹:

$ tar -xjf linux-3.0.tar.bz2

$ cd linux-3.0

 

 

2.2配置内核编译参数

 

1. 首先修改顶层目录的Makefile文件

 $ vim  Makefile 

这里首要便是交叉编译器环境变量和选择开发平台类型

然后要将生成的zimage拷贝到当前目录,再手动增加mkimage工具来自动把Zimage生成可执行的.bin文。

注:内核编译之后会生成两个文件。一个Image,一个Zimageimage为内核映像文件,而Zimage为内核映像压缩文件。Image大约为4M,而Zimage不到2M

=============================================================================== 

@@ -192,8 +192,8 @@

 # Default value for CROSS_COMPILE is not to prefix executables

 # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile

 export KBUILD_BUILDHOST := $(SUBARCH)

- ARCH       ?= $(SUBARCH)

- CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)

+ARCH       ?= arm

+CROSS_COMPILE?= /opt/buildroot-2012.08.packet/buildroot-2012.08/arm920t/usr/bin/arm-linux-

 

 # Architecture as present in compile.h

 UTS_MACHINE    := $(ARCH)

@@ -557,6 +557,9 @@

 # This allow a user to issue only 'make' to build a kernel including modules

 # Defaults to vmlinux, but the arch makefile usually adds further targets

 all: vmlinux

+  cp arch/arm/boot/zImage . -f

+ mkimage -A arm -O linux -T kernel -C none -a 30008040 -n "Linux Kernel" -d zImage \ linuxrom-s3c2440.bin

+   rm -f zImage

 

 

ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE

 KBUILD_CFLAGS  += -Os

@@ -1201,6 +1204,7 @@

        -o -name '.*.rej' -o -size 0 \

        -o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \

        -type f -print | xargs rm -f

+       @rm -f linuxrom-s3c2440.bin


 

2.修改晶振频率

 

因为我使用的是FL2440的开发板,根据datesheet可知晶振频率为12M。所以下一步修改晶振频率。

$ vim arch/arm/mach-s3c2440/mach-smdk2440.c

 

============================================================================ 

@@ -160,7 +160,7 @@

 static void __init smdk2440_map_io(void)

 {

    s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));

--   s3c24xx_init_clocks(16934400);

+   s3c24xx_init_clocks(12000000);

    s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

 }

3. 修改驱动的串口

 vim drivers/tty/serial/samsung.c

===========================================================================

@@ -54,7 +54,7 @@

 

 /* UART name and device definitions */

 

-- #define S3C24XX_SERIAL_NAME    "ttySAC"

+ #define S3C24XX_SERIAL_NAME    "ttyS"

  #define S3C24XX_SERIAL_MAJOR   204

  #define S3C24XX_SERIAL_MINOR   64

 

 

 

参考mini2440的.config文件作为我们的默认.config文件。改好之后再

 

 

 

 

$ Make menuconfig

 

 

 

 

打开文本窗口来选定即将要编译的模块,保存后会将里面的信息保存到同时生成的.config配置文件中。

另外:make menuconfig时出来的文本窗口中的信息是通过读取在内核源代码目录下的Kconfig文件来配置的。根据Makefile文件来编译,而Makefile文件中的变量则通过.config来进行赋值操作。仅仅在Kconfig中添加选项。

 

4.修改MACHINE ID设备编号

同样因为是做FL2440的内核,所以我们选择三星SMDK2440这个开发板。因为我U-boot中使用的machine id为1999,而且我使用的是s3c2440这个板子。

将mini2440和和s3c2440的machineID对调。

 $ vim arch/arm/tools/mach-types

配置就绪之后

 

Make

 

显示成功

此时已经会生成一个linux-s3c2440.bin的可执行二进制文件。

5.对nandflash进行分区

 

=========================================================================================================

@@ -106,49 +106,39 @@

    },

 };

 

-/* NAND parititon from 2.4.18-swl5 */

+/* NAND parititon from 2.4.18-swl5,modify by Handy 2014.11.30 */

 

 static struct mtd_partition smdk_default_nand_part[] = {

    [0] = {

-       .name   = "Boot Agent",

-       .size   = SZ_16K,

+       .name   = "bootloader",

+       .size   = SZ_1M,

        .offset = 0,

    },

    [1] = {

-       .name   = "S3C2410 flash partition 1",

-       .offset = 0,

-       .size   = SZ_2M,

+       .name   = "linux",

+       .offset = MTDPART_OFS_NXTBLK,

+       .size   = SZ_1M*15,

    },

    [2] = {

-       .name   = "S3C2410 flash partition 2",

-       .offset = SZ_4M,

-       .size   = SZ_4M,

+       .name   = "rootfs",

+       .offset = MTDPART_OFS_NXTBLK,

+       .size   = SZ_1M*40,

    },

    [3] = {

-       .name   = "S3C2410 flash partition 3",

-       .offset = SZ_8M,

-       .size   = SZ_2M,

+       .name   = "apps",

+       .offset = MTDPART_OFS_NXTBLK,

+       .size   = SZ_1M*50,

    },

    [4] = {

-       .name   = "S3C2410 flash partition 4",

-       .offset = SZ_1M * 10,

-       .size   = SZ_4M,

+       .name   = "data",

+       .offset = MTDPART_OFS_NXTBLK,

+       .size   = SZ_1M*50,

    },

    [5] = {

-       .name   = "S3C2410 flash partition 5",

-       .offset = SZ_1M * 14,

-       .size   = SZ_1M * 10,

-   },

-   [6] = {

-       .name   = "S3C2410 flash partition 6",

-       .offset = SZ_1M * 24,

-       .size   = SZ_1M * 24,

-   },

-   [7] = {

-       .name   = "S3C2410 flash partition 7",

-       .offset = SZ_1M * 48,

+       .name   = "backup",

+       .offset = SZ_1M * 100,

        .size   = MTDPART_SIZ_FULL,

-   }

+   },

 };

 

板子上nandflash256M,给bootloader1M用来启动,内核15M以及40M的根文件系统。其他自由分配。

注意:此时若要再进行分区就要选择相应的文件系统。Nandflash比较常用的有yaffs2,ubifs,cramfs以及initramfs等等。

 

$  make

此时能编译成功,但是生成的linux-s3c2440.bin文件依旧不能在板子上跑起来。

因为内核启动时首先挂载的是根文件系统,我们还没有做根文件系统给予内核支持,系统会出错而退出启动。

 

3. 添加根文件系统支持

1、根文件系统简介

文件系统是对一个存储设备上的数据和元数据进行组织的机制。这种机制有利于用户和操作系统的交互。而根文件系统则是所有文件系统的根,我理解的是所有文件系统都是由根文件系统扩展开来的。而若是没有根文件系统则谈不上其他的文件系统。根文件系统它包含系统引导以及其他文件系统所能挂载的必要文件。

 

什么是根文件系统首先是一种文件系统,但是相对于普通的文件系统,它的特殊之处在于,它是内核

启动时所mount的第一个文件系统。

 而Linux又支持多种文件系统,包括ext2ext3vfatntfsiso9660jffsromfsnfs等,为了对各类文件系统 进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。

 不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为 RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。

 

2、根文件系统支持

本文主要写内核的移植与启动,所以选择了制作很简单的initramfs文件系统作为根文件系统,它能伴随内核编译时同时与内核生成一个镜像而能与之一起启动。

$ Make menuconfig

进去选择General setup编译模块

 

在下面选择Initial RAM filesystem .....即initramfs文件系统,然后选择支持initramfs的源文件系统包所处位置。这里为../../rootfs/rootfs_tree/

 

 

 

在选择保存后即可连接开发板。重新编译内核后下载到板子上便可以启动了!

 

转载于:https://www.cnblogs.com/Ph-one/p/4578814.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统上机作业--实现shell(2)(多进程)

sh2.c: 实现shell程序,要求在第1版的基础上,添加如下功能 • 实现文件重定向 • $ echo hello >log • $ cat log • Hello 实现思路: 和sh1.c相比,主要是修改了cmd函数的实现过程。通过循环找出重定向符号"&g…

当泛型方法推断,扩展方法遇到泛型类型in/out时。。。

说到泛型方法&#xff0c;这个是.net 2.0的时候引入的一个重要功能&#xff0c;c#2.0也对此作了非常好的支持&#xff0c;可以不需要显试的声明泛型类型&#xff0c;让编译器自动推断&#xff0c;例如&#xff1a; 1 void F<T>(T value){} 2 //... 3 int i 0; 4 F(i); 此…

AOP相关

实现AOP的技术&#xff0c;主要分为两大类&#xff1a;一是采用动态代理技术&#xff0c;利用截取消息的方式&#xff0c;对该消息进行装饰&#xff0c;以取代原有对象行为的执行&#xff1b;二是采用静态织入的方式&#xff0c;引入特定的语法创建“方面”&#xff0c;从而使得…

操作系统上机作业--根据莱布尼兹级数计算PI(1)(多线程)

pi1.c: 使用2个线程根据莱布尼兹级数计算PI • 莱布尼兹级数公式: 1 - 1/3 1/5 - 1/7 1/9 - ... PI/4 • 主线程创建1个辅助线程 • 主线程计算级数的前半部分 • 辅助线程计算级数的后半部分 • 主线程等待辅助线程运行結束后,将前半部分和后半部分相加实现思路&#xff1…

四种途径将HTML5 web应用变成android应用

作为下一代的网页语言&#xff0c;HTML5拥有很多让人期待已久的新特性。HTML5的优势之一在于能够实现跨平台游戏编码移植&#xff0c;现在已经有很多公司在移动设备上使用HTML5技术。随着HTML5跨平台支持的不断增强和智能手机的迅速普&#xff0c;HTML5技术有着非常好的发展前景…

操作系统上机作业--根据莱布尼兹级数计算PI(2)(多线程)

pi2.c: 使用N个线程根据莱布尼兹级数计算PI • 与上一题类似&#xff0c;但本题更加通用化&#xff0c;能适应N个核心&#xff0c;需要使用线程参数来实现 • 主线程创建N个辅助线程 • 每个辅助线程计算一部分任务&#xff0c;并将结果返回 • 主线程等待N个辅助线程…

html 16进制 转换成字符串,js 字符串和16进制的互相转换

字符串转16进制function strToHexCharCode(str) {if(str "")return "";var hexCharCode [];hexCharCode.push("0x");for(var i 0; i < str.length; i) {hexCharCode.push((str.charCodeAt(i)).toString(16));}return hexCharCode.join(&qu…

数组以及冒泡排序

数组 1、概念&#xff1a;可以帮我一次声明多个同类型的变量&#xff0c;这些变量再内存中是连续存储的。 2、声明语法&#xff1a;数据类型[] 数组名 new 数据类型[数组长度] 数组长度&#xff1a;一次要声明的同类型的变量个数。是在定义这个数组的时候就确定了&#xf…

jQuery触发a标签的点击事件无效

1 <a id"workFrame" href"pages/work.html" target"FrameBox">首页</a> 2 3 $("#workFrame").tigger("click"); 上述的代码&#xff0c;其实挺正常的&#xff0c;但是怎么也触发不了a标签的cli…

操作系统上机作业--多线程排序

sort.c: 多线程排序 • 主线程创建一个辅助线程 • 主线程使用选择排序算法对数组的前半部分排序 • 辅助线程使用选择排序算法对数组的后半部分排序 • 主线程等待辅助线程运行結束后,使用归并排序算法归并数组的前半部分和后半部分 实现思路&#xff1a; ARRAY_CO…

jdk5下载链接

查看jdk版本 java -versionJDK下载 最新版本http://www.oracle.com/technetwork/java/javase/downloads/index.htmlJDK下载 版本1.5.22http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase5-419410.html#jdk-1.5.0_22-oth-JPR JDK…

html的细节优化,网站页面优化细节详解

原标题&#xff1a;网站页面优化细节详解SEO页面优化是继SEO结构优化之后&#xff0c;另一个重要优化地方;页面标题在每个页面中的关键位置&#xff0c;出现目标关键词&#xff0c;这是我们做页面优化的基础思路&#xff0c;关键词位置&#xff0c;都有哪些呢?第一个是关键位置…

突击优化算法!

Matlab语言可以与C/C语言转换或调用。 Matlab语句&#xff1a;load name 把name中文件的所有变量载入到工作空间中。save name 保存工作空间的变量到name.mat中。 cholesky分解把一个正定矩阵分为一个下三角矩阵和它转置矩阵的乘积。 两种创立符号函数的方法&#xff1a;sym函数…

操作系统上机作业--使用条件变量解决生产者、计算者、消费者问题(多线程)

pc1.c: 使用条件变量解决生产者、计算者、消费者问题 /* • 系统中有3个线程&#xff1a;生产者、计算者、消费者 • 系统中有2个容量为4的缓冲区&#xff1a;buffer1、buffer2 • 生产者生产a、b、c、‘d、e、f、g、h八个字符&#xff0c;放入到buffer1 • 计算者从b…

淘宝代码和html区别,taobao.html

taobao主题市场女装 /男装 /内衣 >鞋靴 /箱包 /配件 >童装玩具 /孕产 /用品 >家电 /数码 /手机 >女装 /男装 /内衣 >鞋靴 /箱包 /配件 >童装玩具 /孕产 /用品 >家电 /数码 /手机 >女装 /男装 /内衣 >鞋靴 /箱包 /配件 >童装玩具 /孕产 /用品 >…

程序各个段text,data,bss,stack,heap

网上找了一堆资料学习一下,了解这些, 有助于规化程序结构,优化代码; 使用gcc编译出来的程序,用size可以查看程序结构和大小, 如 1: #size hello 2: Text data bss dec hex filename 3: 778 200 4 982 3D6 hello 所以一个可执行的程序文件,结构分三部分: .text 代码段,用来存…

让 keil MDK 支持C99

打开options fot target-> C/C 在 Misc Controls 中添加 --c99. 转载于:https://www.cnblogs.com/svchao/p/4585034.html

html从日期格式中获取年,js转换日期格式(Js获取年月日及时间转换)

1、获取年、月、日和将时间戳转换成日期格式// 简单的一句代码var date new Date(时间戳); //获取一个时间对象/**1. 下面是获取时间日期的方法&#xff0c;需要什么样的格式自己拼接起来就好了2. 更多好用的方法可以在这查到 -> http://www.w3school.com.cn/jsref/jsref_o…

月半小夜曲

转载于:https://www.cnblogs.com/yesihoang/p/4588319.html

操作系统上机作业-- 使用信号量解决生产者、计算者、消费者问题(多线程)

pc2.c: 使用信号量解决生产者、计算者、消费者问题 • 功能和前面的实验相同&#xff0c;使用信号量解决 实现思路: 生产者、计算者、消费者三者之间的关系和上一个编程任务一样&#xff0c;不一样的是&#xff0c;将互斥量、条件变量封装起来作为信号量&#xff0c;处理方…