基于ZLG/BOOT的linux2.6内核移植(s3c2410)

2023-05-16

 
基于ZLG/BOOT的linux2.6内核移植(s3c2410)   
ZLG/BOOT是广州致远arm实验箱自带的bootloader.我用的这款实验箱自带的linux内核还是2.4版本的,有点儿老了,所

以想移植个2.6上去.由于bootloder的移植烧写也是比较麻烦的事,我决定暂时先用实验箱自带的ZLG/BOOT.
实际上使用ZLG/BOOT对于linux内核的移植是比较方便的, ZLG/BOOT的运行机制是这样的:启动或复位硬件

后,ZLG/BOOT会识别nandflsh上创建的启动目录,你只需通过ftp将内核及根文件系统下载到nandflash中指定目录

(a:\boot\)下.当你选择启动linux的选项,ZLG/BOOT会自动将该目录下的linux内核(zImag)和根文件系(init.img)以及

linux启动参数文件(param.bin)拷贝到内存(ram)中指定的地址,并跳至linux内核的首地址,开始运行linux.
在nandfllash的a:\boot\目录下还有两个重要文件zlg_boot.init和param.bin,其中前者是可编辑文件,可以通过

ftp上传到主机(PC)后进行编辑修改,之后再下载下去,但是后者是二进制文件,只能通过实验箱带的专门修改此文件的

软件来修改关键参数.实际移植过程中也可以不对这两个文件进行修改,但有几需要注意的地方:
1,在zlg_boot.init中有这样一段代码:
load 0x30008000 a:\boot\zImag
load 0x30000100 a:\boot\parm.bin
load 0x33C00000 a:\boot\init.img
其作用是分别将liunx内核,启动参数以及根文件系统等几个文件拷贝到ram中相应的地址.这里要注意的是这几

个文件名要与你实际下载到a:\boot\目录下的文件名一致,否则加载时找不到相应文件.所以,移植过程中如果不修改

zlg_boot.init文件,那么你在制作内核和根文件系统是一定要把文件名定义为zImag(一般没什么问题)和init.img.
2,在parm.bin中可修改的参数如下:
root=/dev/ram rw ramdisk=4096 console=tty0 console=ttyS0,115200N8
以上是实验箱原来自带的参数,实际这些都是linux命令,用于告诉linux以下信息:根文件系统的加载地址,读写

属性,文件系统大小和控制台信息--tty0表示控制台为液晶显示器,ttyS0表示控制台为串口0.这里要注意的是在2.6内

核中对串口0的表示已改成ttySAC0,如果移植2.6内核后继续使用ttyS0,当linux启动时就会在串口终端出现:
Uncompressing Linux.................................................................. done,

booting .
然后就卡住不动了.
其实上面param.bin中这些命令和linux内核配置时boot option选项中第三行的内容是同一个东西,在实际中是

raram.bin中的内容把boot option中的内容覆盖了,使得boot option中的内容不起作用.所以在移植过程中要么修改

param.bin,要么在内核中把param.bin屏蔽掉,使得boot option内容生效,并修改其内容.
网上大多数介绍inux2.6到s3c2410的移植过程对2.6内核主要有两个方面的修改,一是修改nandflash分区以及

nand设备启动代码的添加,用来引导内核以及根文件系统的启动;二是添加支持devfs的相关内容(有关devfs引用网友原

话"linux-2.6.13以前的内核都支持devfs,而之后版本的内核就把devfs这块去掉了,虽然还能在内核源码中找到对应

的源码,你也可以把它加进内核"). 根据上面的介绍,基于ZLG/BOOT的内核移植可以简单到不用对2.6内核源码做任何

修改,配置编译后用ZLG/BOOT直接下载到指定目录替代原来的2.4内核,就可启动运行2.6内核了.不用对nanflsh进行分

区设置是因为,内核及根文件系统的引导完全由ZLG/BOOT完成. 当然为了能在串口终端正常显示linux启动信息,要对

启动参数文件parm.bin进行修改,即把ttyS0改为ttySAC0.这样linux内核虽然启动了,但是还存在两个小小的问题:
1,启动信息中会出现4000多行的:Bad eraseblock at 0x*****,(2.6.22和2.6.20都有这现象),这可能是由于

ZLG/BOOT已经对nandflsh分区并写保护了,当linux按自己的分区方式再次对nandflash进行擦除和分区时就出现了这种

情况.解决办法是,在linux内核源码中取消对nandflash设备的启动.网上说出现Bad eraseblock是因为没去掉没去掉

nand的ECC校验,我试着修改过此处,并没好使,所以真正原因应该就是我上面说的那样.
2,linux启动并输出大量输出信息后会卡在这条信息上;Warning: unable to open an initial console.这是由

于原来2.4内核及其使用的文件系统都支持devfs,而现在的2.6内核不支持.解决办法有两个,一是换一个不支持devfs的

根文件系统(具体制作方法下节会讲),二是修改内核代码及配置使之支持devfs.
下面我说一下详细步骤:一些通用步骤援引了网友原文,关键步骤我会具体说明.
我在移植时用的是linux-2.6.22内核,写这篇文档时我又移植了linux-2.6.20来做验证,下面将以linux-2.6.20为


平台信息:目标板           s3c2410
主机操作系统     redhat9.0
交叉编译器      arm-linux-gcc3.4.1
1.   将Linux2.6.20内核源码放到工作目录下,并解压。
#tar xzvf linux2.6.20.tar.gz
# cd linux2.6.20

    2.   修改内核源码根目录下的Makefile文件
#vi Makefile
......
#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
#                  -e s/arm.*/arm/ -e s/sa110/arm/ \
#                  -e s/s390x/s390/ -e s/parisc64/parisc/ \
#                  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
......
#ARCH        ?= $(SUBARCH)
#CROSS_COMPILE    ?=
ARCH        = arm
CROSS_COMPILE    = /usr/local/arm/3.4.1/bin/arm-linux-
注:CROSS_COMPILE根据自己所使用的交叉编译器路径设置。
**3.修改arch/arm/mach-s3c2410/common-smdk.c文件,(linux2.6.22.19中的目录为arch/arm/plat-

s3c24xx/common-smdk.c)
找到如下数据结构
static struct platform_device __initdata *smdk_devs[] = {
// &s3c_device_nand,   注释掉或者删除该语句,防止linux对nandflash进行二次擦除和分区.
&smdk_led4,
&smdk_led5,
&smdk_led6,
&smdk_led7,
};

4. 如果想使你的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统。可以

编辑fs/Kconfig:
在menu "Pseudo filesystems"下面添加如下代码:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y     //注意t和y之间有个空格,否则执行make menuconfig 后会报错:unexpected T_WORD
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS

注意:如果继续使用原来2.4版本用的ramdisk文件系统,这第4步是必需得做的,同时还需要在文件系统dev/目录

下创建如下节点:
mknod -m 660 null c 1 3
mknod -m 660 console c 5 1
如果重新制作新ramdisk根文件系统,根文件系统可以和linux2.6内核同时都配置devfs或者都不配置,都

不配置时第4步就不用添加了.(建议重新制作,具体方法见下节内容)
5.解决串口0控制台信息输出问题,(否则会在此卡

住:UncompressingLinux.................................................................. done, booting

.) 以下两种方法可以任选其一:
(1)修改内核代码屏蔽掉ZLG/BOOT中设定启动参数,并在配置时修改启动参数.具体如下:
将内核中的arch/arm/kernel/setup.c文件中的parse_tag_cmdline()函数中的内容注释掉,禁止使用默认

的参数。这样你只要在配置内核Boot options选项的时候正确配置 也就OK了。而且还很方便,哪天你要引导2.4内核

了就可以直接把console=ttySAC0,115200改为console=ttyS0,115200就可以了,很是简单!
(2)修该ZLG/BOOT中的param.bin文件将其中的ttyS0改为ttySAC0,要通过专门修改param.bin的软件来完成.(

建议用方法(1))

     6. 配置内核
在配置内核前,先拷贝s3c2410开发板的默认配置到内核根目录下,以简化配置过程。
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig

   以下是在 s3c2410_defconfig 基础上要配置的选项
General setup --->
[*] Configure standard kernel features (for small systems) --->
选上这项,否则文件系统中的一些选项不会出现

System Type --->     
S3C2410 Machines --->
[*] SMDK2410/A9M2410    留下这项就够了,其他全部“N”掉
“N”掉 S3C2412 Machines ---> 、 S3C2440 Machines ---> 和 S3C2443 Machines ---> 里的所有选项,都是和

2410无关的选项。
Boot options --->
将 (root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string
改成   (root=/dev/ram rw ramdisk=4096 console=tty0 console=ttyS0,115200N8) Default kernel command

string 注:很重要,具体功能上面有解释.

Userspace binary formats --->
< > Kernel support for a.out and ECOFF binaries (去除该选项,a.out和ECOFF是两种可执行文件的格式,

在ARM-Linux下一般都用ELF,所以这两种基本用不上。)

Networking --->
Networking options --->
<*> Packet socket
[*]   Packet socket: mmapped IO
Device Drivers --->
“N”掉   Parallel port support ---> 里的所有选项。
Plug and Play support --->里的所有选项一定要“N”掉,不然编译会出错!!!!!!!!
Network device support --->
Ethernet (10 or 100Mbit) --->
“N”掉< > DM9000 support和< >   Generic Media Independent Interface device support
“N”掉 [ ]   Ethernet (1000 Mbit) --->和 [ ]   Ethernet (10000 Mbit) --->
Wireless LAN --->
[*] Wireless LAN (pre-802.11)
[*] Wireless LAN (IEEE 802.11)
USB Network Adapters --->
<*> Multi-purpose USB Networking Framework
<*> MMC/SD card support --->
Real Time Clock --->
“N”掉 [ ]   Set system time from RTC on startup and resume
#接下来做的是针对文件系统的设置,我实验时目标箱上要挂的根文件系统是ramdisk故做如下配置
File systems -->
<*> Second extended fs support     #注意ext2相关的几项一定要选上,因为我们使用的ramdisk文件系统属于

ext2格式,很多移植后使用cramfs的内核在配置时都把这项N掉了.                             
[*]   Ext2 extended attributes                                  
[*]     Ext2 POSIX Access Control Lists                         
[*]     Ext2 Security Labels                                    
[*]   Ext2 execute in place support  
<*> Ext3 journalling file system support
<*> Kernel automounter support
<*> Kernel automounter version 4 support (also supports v3)
<*> Filesystem in Userspace support
Pseudo filesystems -->
[*] Virtual memory file system support (former shm fs)
<*> Userspace-driven configuration filesystem (EXPERIMENTAL)
Miscellaneous filesystems -->
<*> YAFFS2 file system support
“N”掉[ ]Autoselect yaffs2 format 和
[ ]Cache short names in RAM ,因为这是给每页大于1024B的NAND Flash设计的
<*> Journalling Flash File System v2 (JFFS2) support
(0)   JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
[*]   JFFS2 write-buffering support
[ ]   JFFS2 summary support (EXPERIMENTAL)
[ ]   JFFS2 XATTR support (EXPERIMENTAL)
[*]   Advanced compression options for JFFS2
[*]     JFFS2 ZLIB compression support
[*]     JFFS2 RTIME compression support
[*]     JFFS2 RUBIN compression support
JFFS2 default compression mode (priority) --->
Network File Systems -->
<*> NFS file system support
--以下最好选上,因为在挂载NFS时可能出现protocol不支持的情况--
[*]Provide NFSv3 client support
[*]Provide client support for the NFSv3 ACL protocol extension
[*]   Provide NFSv4 client support (EXPERIMENTAL)
[*]   Allow direct I/O on NFS files
-------------------------------------------------------------------------
<*> NFS server support
[*]   Provide NFSv3 server support
[*]Provide server support for the NFSv3 ACL protocol extension   
[*]     Provide NFSv4 server support (EXPERIMENTAL)       
---   Provide NFS server over TCP support                 
[*] Root file system on NFS

    保存退出,产生.config文件。
7.编译内核
#make zImage   

从本质上讲,基于ZLG/BOOT完成一个最简单的linux2.6内核移植只需把内核代码注释掉两句话,然而我在做的过程

中是饶了很大圈子的,刚上来也是按网上的说明对nandflash进行分区,而ZLG/BOOT源码中对nandflash的分区部分只给

了二进制文件,所以二者一直对应不起来,遇到了很多网上常见的问题,然而他们的解决方法却很多不适合我,直到弄清

了ZLG/BOOT的工作机制,问题才迎刃而解.
过程中得到了网上不少资料的帮助,尤其是下面这个链接,在此表示感谢!  
参考文献 : http://hi.baidu.com/operationsystem/blog/item/b96528c63e6db6d4d0006060.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于ZLG/BOOT的linux2.6内核移植(s3c2410) 的相关文章

随机推荐

  • 修改python pip安装第三方包的安装路径

    由于某种原因将pip的安装路径设置到了C盘用户目录下面 xff0c 导致每次清理垃圾时就顺带把安装的第三方包给清理掉了 xff0c 因此需要更改pip第三方包的安装路径 首先找到python的安装路径 where python 在pytho
  • 树莓派3b终端命令行播放器omxplayer,通过HDMI屏幕播放视频

    omxplayer是一款可以使用命令行控制的播放器 xff0c 图像通过 HDMI显示到屏幕上 树莓派可以运行omxplayer xff0c 在终端使用命令行播放视频 1 安装omxplayer sudo apt get install o
  • stm32单片机OLED取字模软件使用 PCtoLCD2002

    PCtoLCD2002 xff0c 适用单色屏取字模制作字库 xff0c 进行位图转换 xff0c 还可自行描点 xff0c 使用非常简单方便 1 取字模 xff0c 制作字库 打开PCtoLCD2002 单片机OLED或者其他单色屏 xf
  • Linux 下编译并安装配置 Qt 全过程

    1 获得源代码 src 官网下载地址 xff1a ftp ftp qt nokia com qt source 2009 年 10 月 1 日发布的 qt x11 opensource src 4 5 3 tar gz xff0c 大小 1
  • CentOS8使用gmssl搭建demoCA及配置OCSP服务

    本文档以CentOS8 43 GmSSL2 5 4版本为例 1 GmSSL搭建CA 1 1 安装GmSSL 我们知道 xff0c Linux下默认只有openssl的发行版 xff0c 并没有默认安装GmSSL xff0c 所以需要手动下载
  • 二、Linux SSH远程连接Windows

    1 关闭防火墙 2 允许远程访问 3 安装SSH服务器并启动 4 打开Linux查看防火墙状态 xff0c 未关闭则用system stop firwall暂时关闭防火墙 5 测试网络连通性 xff0c 不通则检查网卡 xff0c 保证网络
  • Linux qt6安装

    首先qt目前正常安装的话 xff0c 需要先在官网注册一个账号 xff0c 邮箱激活下 xff0c 记住账号密码就好 xff0c 这个是目前qt安装必须的 目前安装的方式有两种 xff0c 推荐大家使用在线联网安装 xff08 官网已不提供
  • Shell系统学习之如何执行Shell程序

    系列文章目录 Shell系统学习之什么是Shell Shell系统学习之创建一个Shell程序 Shell系统学习之向Shell脚本传递参数 Shell系统学习之如何执行Shell程序 Shell系统学习之Shell变量和引用 Shell系
  • 个人Obsidian同步和分享方案:AList+rclone+PicHoro

    Obsidian同步方案 最近尝试了下Obsidian这款笔记工具 xff0c 整体体验还是不错的 xff0c 但obsidian的同步确实是个大问题 我的主要需求是windows编辑加安卓端的查看 xff0c 偶尔可能需要编辑一下 xff
  • MySQL之limit用法

    SELECT FROM table LIMIT offset rows rows OFFSET offset 意思就是说 xff1a 可以这样子 xff1a SELECT FROM table LIMIT offset rows 或者这样子
  • 安卓定时器每5分钟执行一次方法

    import android os Handler 定时任务实现 private Handler handler 61 new Handler Runnable runnable 61 new Runnable 64 Override pu
  • 文件操作汇总

    为方便复习 xff0c 汇总一下以前相关笔记的索引 linux操作总结汇总 xff1a 进程内存通信 C语言 详解C中的系统调用open close read write C中文件操作复习 最近有关linux文件操作的总结
  • Anaconda安装及基本使用

    1 linux安装 conda可以创建多种语言环境 xff0c 支持的语言有 xff0c 可以创建多种复杂环境 xff0c 如果只需要python环境 xff0c pycharm自带的应该可以满足需求 Python R Ruby Lua S
  • Ubuntu18.04安装过程中界面卡死,完美解决办法

    让我们开始吧 在网上搜了资料 xff0c 总结如下 xff1a 1 u盘启动过程中 xff0c 会出现选择界面 xff0c try ubuntu install ubuntu等 xff0c 此时点 e 键 xff0c 会出现一个黑框 xff
  • 打包成jar文件后运行出现Invalid or corrupt jarfile 解决

    Invalid or corrupt jarfile home WebService jar Failed to load Main Class manifest attribute from home WebService jar 打ja
  • TX2(ubuntu 18.04)更换清华镜像源

    注意 xff0c 该版本的TX2有两个特点 xff1a Arm架构和ubuntu18 04 一 备份 sudo cp etc apt sources list etc apt sources list bak 先备份原文件sources l
  • Ubuntu22.04+Nvidia RTX 3060 显卡驱动安装

    新装 Ubuntu22 04 LTS xff0c 电脑配的是Nvidia RTX 3060 xff0c 所以需要安装显卡驱动 xff0c 未安装前显卡显示如下 xff1a 1 设置阿里源 在软件和更新在第一栏Ubuntu 软件页面中 xff
  • 基于深度学习算法实现视频人脸自动打码

    前言 1 在当下的环境上 xff0c 短视频已是生活的常态 xff0c 但这是很容易就侵犯别人肖像权 xff0c 好多视频都会在后期给不相关的人打上码 xff0c 这里是基于yolov5的人脸检测实现人脸自动打码功能 2 开发环境是win1
  • 树莓派4B设置双网卡静态IP、网卡优先级、查看系统多少位

    1 设置静态IP 下面两种方法都试过 xff0c 可以永久保存 方法2更官方一些 但是 xff0c 方法 1 右上角可视化设置IP不知道为什么无法使用 xff0c 设置好后重启 xff0c 再ping局域网设备 xff0c 总是出现提示 x
  • 基于ZLG/BOOT的linux2.6内核移植(s3c2410)

    基于ZLG BOOT的linux2 6内核移植 s3c2410 ZLG BOOT是广州致远arm实验箱自带的bootloader 我用的这款实验箱自带的linux内核还是2 4版本的 有点儿老了 所 以想移植个2 6上去 由于bootlod