linux内核移植过程问题总结
移植内核:2.6.30.4
内核根目录下的.config为当前配置内核的且已经配置好的内核配置。make zImage以此为依据
配置内核的过程:
cd linux-2.6.30.4(进入Linux根目录)
cp arch/arm/configs/s3c2410_defconfig /linux-2.6.30.4(作为配置参考,考到根目录下)
mv s3c2410_defconfig .config(改名为.config)
make menuconfig ARCH=arm(ARCH=arm不能少)
配置过程
退出时记得选yes保存为.config(确保该配置是你已经配置且保存的配置,就算不改动也要保存。否则不能生成.config)
make zImage ARCH=arm CROSS_COMPILE=arm-linux-(ARCH=arm不可少)
或者
Makefile中定于ARCH=arm CROSS_COMPILE=arm-linux-
1,make s3c2410_defconfig(生成.config)
2,make zImage 即可生成压缩内核印象
uboot引导内核,入口点必须为0x30008000
zImage:go 0x30008000
uImage:bootm 0x30008000
busybox下载地址:
http://busybox.net/
linux快速修改文件夹及文件下所有文件与文件夹权限
chmod 777 * -R
uboot的tftp下载出现如下错误:
TFTP error: 'Permission denied' (0)
改正方法就是给待下载的文件加上可执行(chmod 777 文件)权限
uboot的使用:tftp下载内核,直接用交叉网线连接PC(实际上为虚拟机)和开发板即可
uboot启动之后,输入:printenv 查看
serverip是不是你的虚拟机的ip(终端ifconfig即可查看)
ipaddr要和serverip在同一个网段,即ip的前三段必须相同
ethaddr:开发板dm9000的MAC物理地址
netmast:子网掩码:255.255.255.0
serverip,ipaddr,ethaddr,netmast不符合要求的话,可以使用命令设置:(示例)
setenv serverip 169.254.209.223
setenv ipaddr 169.254.209.113
setenv netmast 255.255.255.0
setenv ethaddr 00:01:02:03:04:05
saveenv //设置完毕记得保存环境变量
uboot启动内核:uboot版本(2009.08)
条件:uboot的机器码和内核的机器码要一样
uboot部分修改:
机器码:
#gedit board/samsung/my2440/my2440.c
gd->bd->bi_arch_number = MACH_TYPE_SMDK2440
内核部分:内核版本(2.6.30.4)
#gedit arch/arm/mach-s3c2440/mach-smdk2440.c
MACHINE_START(SMDK2440, "SMDK2440")
#gedit arch/arm/kernel/head.S //在ENTRY(stext)下添加如下代码
ENTRY(stext)
mov r0, #0
mov r1, #0x3f0 //上面的MACH_TYPE值1008换成十六进制就是0x3f0
ldr r2, =0x30008000
内核中的nand分区一定要和bootloader中的一致:
#gedit arch/arm/plat-s3c24xx/common-smdk.c
offsize size
uboot : 0x00000000 0x00030000 //192kb
param : 0x00030000 0x00040000 //这个环境变量的地址范围配置的CONFIG_ENV_OFFSET一致
kernel: 0x00080000 0x00500000 //5mb
root : 0x00580000 0x0c800000 //200mb
#gedit uboot/include/cofings/mini2440.h
查看:MTDPART_DEFAULT = " " //默认分区
编译得到内核zImage
uImage的制作:
先将u-boot下的tools中的mkimage复制到主机的/usr/local/bin目录下,执行以下命令:
mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img
uboot.bin拷贝到XP,用supervivi的a命令下载,开关拨到nand启动
uImage和根文件系统,考到tftp的收发文件夹,使用tftp服务传送
在u-boot命令行下输入:(自启动的将内核读入内存)
set bootcmd 'nand read 0x30008000 内核偏移地址 内核区大小;bootm 0x30008000'
saveenv
把uImage.img用tftp下载到内存中,然后再固化到Nand Flash中,操作和执行图如下:
tftp 0x30008000 uImage.img //将uImage.img下载到内存0x30008000处
nand erase 0x80000 0x500000 //擦除nand的kernel分区(officesize ,size)
nand write 0x30008000 0x80000 0x500000 //将内存0x30008000处的内容写入到nand的kernel分区
重启开发板(reset命令),完成内核自启动
第一个分区(bootloader)对应mtdblock0
第二个分区(param参数)对应mtdblock1
第三个分区(kernel)对应mtdblock2
第四个分区(root根文件系统)对应mtdblock3
此处的命令参数取代内核配置的boot命令参数,不输入则默认内核的boot参数
内核自启动yaffs2文件系统:
uboot命令行下输入:
set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mem=64M
saveenv
把root-2.6.30.4.bin用tftp下载到内存中,然后再固化到Nand Flash中,操作和执行图如下:
tftp 0x30008000 root-2.6.30.4.bin //将root-2.6.30.4.bin下载到内存0x30008000处
nand erase 0x00580000 0x0c800000 //擦除nand处0x00380000大小0x0c800000的内容(文件系统分区)
nand write.yaffs2 0x30008000 0x00580000 rootfs的大小 //将内存0x30008000处的内容写入到nand的0x00380000处
重启开发板(reset命令),完成内核自启动yaffs2文件系统
yaffs2文件系统制作注意:
制作好的文件系统要是2112的整数倍(128MB及以上的flash用mkyaffs2image-128M工具),
【528的整数倍(64M的flash用mkyaffs2image工具)】
否则tftp下载到nand的话,会提示attempt to write error length data的错误
[MY2440] # tftp 0x30008000 root-2.6.30.4.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at unknown: 0 mode
Using dm9000 device
TFTP from server 169.254.209.223; our IP address is 169.254.209.113
Filename 'root-2.6.30.4.bin'.
Load address: 0x30008000
Loading: T T ###################################T #############T #################
######################################T ###########################
#################################################################
#########################T T ########################################
#################################################################
#################################################################
###################T #########################
done
Bytes transferred = 6359232 (6108c0 hex)
[MY2440] # nand erase 0x380000 0xc800000
NAND erase: device 0 offset 0x380000, size 0xc800000
Erasing at 0xc800000 -- 213254144% complete.
OK
[MY2440] # nand write.yaffs2 0x30008000 0x380000 0x6108c0
NAND write: device 0 offset 0x380000, size 0x6108c0
Skip the first good block 20000
Writing at 0x20000 -- 6166528 bytes written: OK
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "uboot",
.size = 0x00000000,
.offset = 0x00030000, //192KB
},
[1] = {
.name = "param",
.offset = 0x00030000,
.size = 0x00040000, //256KB
},
[2] = {
.name = "kernel",
.offset = 0x00080000,
.size = 0x00500000, //5MB
},
[3] = {
.name = "root",
.offset = 0x00580000,
.size = 0x0c800000, //200MB
}
Wrong Image Format for bootm command 出错原因:
1) 未使用uboot中mkimage 工具制作uImage,却使用bootm 启动
2) tftp 传送地址错误
3) nand write 格式和地址错误
4) nand read 格式和地址错误
linux内核移植过程问题总结相关推荐
- linux文件系统启动流程,linux 内核启动过程以及挂载android 根文件系统的过程
转载 作者:汕头大学-黄珠唐 时间:2009 年10 月29 日 主要介绍linux 内核启动过程以及挂载android 根文件系统的过程,以及介绍android 源代码中文件系统部分的浅析. 主要源 ...
- 嵌入式Linux内核移植相关代码分析(转)
本文通过整理之前研发的一个项目(ARM7TDMI +uCLinux),分析内核启动过程及需要修改的文件,以供内核移植者参考.整理过程中也同时参考了众多网友的帖子,在此谢过.由于整理过程匆忙,难免 错误 ...
- linux 内核移植和根文件系统的制作【转载】
原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...
- 【正点原子Linux连载】第三十七章 Linux内核移植 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- Linux内核移植和根文件系统制作(详细步骤精讲)
第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...
- uboot和Linux内核移植
这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文. 请发送「 uboot和Linux内核移植 」到公众号后台获取下载链接. 这篇 ...
- linux移植会话层层协议,Linux内核移植-南京林业大学毕业设计.DOC
Linux内核移植-南京林业大学毕业设计 南京林业大学 本科毕业设计(论文) 题 目:嵌入式LINUX在ARM9系统中的移植 院 (系) 信息与科学技术学院 专 业 计算机科学与技术 学 生 谢监荣 ...
- 6410 linux内核移植
linux内核移植(6410) linux内核移植一,硬件环境:友善之臂 tiny6410 开发板开发主机Linux系统:fedora 10 编译器:arm-linux-gcc-4.5.1 二,内核实 ...
- Linux内核启动过程概述
Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创造出自己的内核^_^ Linux的启动代码真的挺大,从汇 ...
- 简述arm linux内核启动流程,Linux内核启动过程和Bootloader(总述)
1.Linux内核启动过程概述 一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux 内核,文件系统,应用程序.其中 Bootloader是系统启 ...
最新文章
- c语言课程设计商品销售系统,c语言课程设计商品销售管理系统.pdf
- 轨迹系列1——一种基于路网图层的GPS轨迹优化方案
- 图解GPT-2(完整版)!
- Tomcat打包时多项目共享jar和精确指定jar版本
- 仿小黄车android定位,小黄车ofo是怎么实现自行车定位功能的?
- ASP.NET TreeView控件各个节点总是居中对齐,而不是左对齐的问题
- 创建云数据库 Hbase结果表
- X2Paddle实践之——Tensorflow版本VGG模型转化为paddle版本模型
- 在Yalmip中应用SDPT3
- linux中把程序启到前台,Linux程序前台后台切换
- 给Android手机设置的壁纸应该是多大尺寸
- 正方教务系统换数据库服务器,附:正方教务系统成绩录入操作说明- 正方教务系统成绩管理使用说明.doc...
- POJ 3265 Problem Solving
- matlab滤波实验,卡尔曼滤波实验及matlab实现
- 都在夸Vue文档简洁易懂?官方文档编写指南了解一下
- R(2)时间序列分析及应用之TSA安装(R语言)
- Electron使用electron-updater自动更新
- 新顶级域名上线,备受宠爱
- java静态数组定义_详解Java静态数组
- VMware10中安装Centos网络无法使用的处理办法