内核移植和文件系统制作(2):linux内核最小系统和initramfs文件系统

发布时间:2024-07-24  

linux内核最小系统,使用内核版本:


1,FL2440板子的基本硬件:晶振12MHZ

CPU

 型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz

SDRAM                             

 H57V2562GTR-75C  

 2片*32MB=64MB,挂载于nGCS6 (0x3000 0000)

NANDFLASH

型号:K9F2G08U0B  大小:256MB

Network Adapter  

 DM9000AEP   10/100M自适应,挂载于nGCS4 (0x2000 0000)

LED  

 5个LED(LED0~3)I/O口指示灯,LED5电源指示灯,LED9核心板3.3V指示灯

LED0~LED3分别接GPB6,GPB6,GPB8,GPB10

BEEP(蜂鸣器)       

 接在GPB0/TOUT0




2,首先说明make menuconfig,Kconfig,.config之间的关系:

1)make menuconfig首先读取顶层Kconfig文件,生成选择界面。

2)使能arch/$SRCARCH/Kconfig,最终生成.config(控制编译)

Kconfig文件:

#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"


config SRCARCH
    string
    option env="SRCARCH"


source "arch/$SRCARCH/Kconfig"


相当于使能arch/arm/Kconfig,并且递归进入各个目录Kconfig,生成选项界面。

3)当make编译,就会读出生成的.config文件,根据其中的选项编译相应模块。

若选择编译入内核中;编译成驱动模块,需要的时候加载 ;否则不编译。


3,linux-3.8内核配置

1)修改顶层Makefile 

# CROSS_COMPILE specify the prefix used for all executables used
# during compilation. Only gcc and related bin-utils executables
# are prefixed with $(CROSS_COMPILE).
# CROSS_COMPILE can be set on the command line
# make CROSS_COMPILE=ia64-linux-
# Alternatively CROSS_COMPILE can be set in the environment.
# A third alternative is to store a setting in .config so that plain
# "make" in the configured kernel build directory always uses that.
# 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        ?= arm
CROSS_COMPILE   ?= /opt/buildroot-2011.11/arm920t/usr/bin/arm-linux-

# Architecture as present in compile.h
UTS_MACHINE     := $(ARCH)
SRCARCH     := $(ARCH)


# Additional ARCH settings for x86
ifeq ($(ARCH),i386)


2)修改分区arch/arm/mach-s3c24xx/common-smdk.c,以下供参考,也可按自己想法修改。修改分区要与根文件系统指定快设备对应。

static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name   = "mtdblock0_u-Boot 1MB ",
        .size   = SZ_1M,
        .offset = 0,
    },
    [1] = {
        .name   = "mtdbolck1_kernel 15MB",
        .offset = MTDPART_OFS_NXTBLK,
        .size   = SZ_1M * 15,
    },
    [2] = {
        .name   = "mtdbolck2_ramdisk 20MB",
        .offset = MTDPART_OFS_NXTBLK,
        .size   = SZ_1M * 20,
    },
    [3] = {
        .name   = "mtdblock3_cramfs 20MB",
        .offset = MTDPART_OFS_NXTBLK,
        .size   = SZ_1M * 20,
    },

 [4] = {
        .name   = "mtdblock4_jffs2 40MB",
        .offset = MTDPART_OFS_NXTBLK,
        .size   = SZ_1M * 40,
    },
    [5] = {
        .name   = "mtdblock5_yaffs2 40MB",
        .offset = MTDPART_OFS_NXTBLK,
        .size   = SZ_1M * 40,
    },
    [6] = {
        .name   = "mtdblock6_ubifs 40MB",
        .offset = MTDPART_OFS_NXTBLK,
        .size   = SZ_1M * 40,
    },
    [7] = {
        .name   = "mtdblock7_apps 40MB",
        .offset = MTDPART_OFS_NXTBLK,
        .size   = SZ_1M * 40,
    },
    [8] = {
        .name   = "mtdblock8_data 40MB",
        .offset = MTDPART_OFS_NXTBLK,
        .size   = SZ_1M * 40,
    },
};


4)修改板子时钟参数arch/arm/mach-s3c24xx/mach-smdk2440.c

s3c24xx_init_clocks(16934400)修改为s3c24xx_init_clocks(12000000);


5)修改机器代码和u-boot相对应。有u-boot使用的是MACH_TYPE_MINI2440,

机器代码号为1999。修改arch/arm/tools/mach-types如下:

s3c2440            ARCH_S3C2440        S3C2440         1999

mini2440           MACH_MINI2440       MINI2440        362


6)修改drivers/mtd/onenand/onenand_bbt.c如下:

static struct nand_bbt_descr largepage_memorybased = {
    .options = 0,
    .offs = 0,

    .len = 1,

    .pattern = scan_ff_pattern,
 };


7) 修改串口:drivers/tty/serial/samsung.c

#define S3C24XX_SERIAL_NAME    "ttyS"


8)make menuconfig选项配置。FL2440板子使用的s3c2440的cpu与s3c2410类似,

所以选择内核中arch/arm/configs目录下的s3c2410_defconfig为模板修改。

[zhouguangfeng@localhost linux-3.8]$ cp arch/arm/configs/s3c2410_defconfig .
[zhouguangfeng@localhost linux-3.8]$ mv s3c2410_defconfig .config
[zhouguangfeng@localhost linux-3.8]$ make menuconfig





在根文件系统已经制作好的前提下,将根文件系统编译入内核:

    General setup  --->  

[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

(../../rootfs/rootfs) Initramfs source file(s)

红色字体指明根文件系统的目录。make编译。。。(机器不给力的,这时候可以喝杯咖啡。。。)


当编译结束之后,在arch/arm/boot下有一个zImage文件,它是ARM Linux常用的一种压缩

映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,

说明这个映像文件的类型、加载位置、生成时间、大小等信息。就是,直接从uImage的

0x40位置开始执行,zImage和uImage没有任何区别。由于最后是由u-boot引导启动,

需要使用u-boot编译后tools目录下mkimage工具,加上一个header。也可以将mkimage放到

/usr/bin下,这里就直接指定它的路径。

修改在Makefile

 # 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 -f arch/arm/boot/zImage . 
  ../../systools/mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040

-n "Linux Kernel" -d zImage linuxrom-s3c2440_zhou.bin
  rm -f zImage


 ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
 KBUILD_CFLAGS  += -Os

蓝色标记为mkimage路径,具体每个参数说明,参考http://blog.csdn.net/lusehu/article/details/6438512

完成之后将其拷贝到tftp目录下

[zhouguangfeng@localhost linux-3.8]$ du -h /tftp/linuxrom-s3c2440_zhou.bin
3.4M    /tftp/linuxrom-s3c2440_zhou.bin

[zhouguangfeng@localhost linux-3.8]$ mv linuxrom-s3c2440_zhou.bin /tftp


4,添加u-boot参数支持(u-boot-2010.09):

[ s3c2440@zhou]# set bkr 'tftp 30008000 linuxrom-s3c2440_zhou.bin;nanderase 100000 800000;nand write 30008000 100000 800000'

[ s3c2440@zhou]# set bootcmd_initramfs 'nand read 30008000 100000 800000;bootm 30008000'

[ s3c2440@zhou]# set bootargs 'console=ttyS0,115200 mem=64M init=/linuxrc rw loglevel=7'

[ s3c2440@zhou]# set bootcmd 'run bootcmd_initramfs'

[ s3c2440@zhou]# save

Saving Environment to NAND...

Erasing Nand...

Erasing at 0x60000 -- 100% complete.

Writing to Nand... Done


[ s3c2440@zhou ]# pri

cpu=s3c2440
bbl=tftp 30008000 u-boot-$cpu.bin;nand erase 0 100000;nand write 30008000 0 $filesize
norbbl=erase bank 1; tftp 30008000 u-boot-$cpu.bin;cp.b 30008000 0 $filesize
blx=tftp 30008000 linuxrom-$cpu.bin;nand erase 100000 F00000;nand write 30008000 100000 $filesize
bramdisk=tftp 30800000 ramdisk-$cpu.rootfs;nand erase 1000000 1400000;nand write 30800000 1000000 $filesize
bcramfs=tftp 30800000 cramfs-$cpu.rootfs;nand erase 2400000 1400000;nand write 30800000 2400000 $filesize
bubifs=tftp 30800000 ubifs-$cpu.rootfs;nand erase 8800000 2800000;nand write 30800000 8800000 $filesize
bootcmd_ramdisk=nand read 30008000 100000 F00000;nand read 30800000 1000000 1400000;bootm 30008000
tb=tftp 30008000 linuxrom-$cpu.bin;bootm 30008000 
bootargs_ramdisk=console=ttyS0,115200 root=/dev/ram0 initrd=0x30800000,16M init=/linuxrc mem=64M rw loglevel=7
bootargs_cramfs=console=ttyS0,115200 root=/dev/mtdblock3 rootfstype=cramfs init=/linuxrc mem=64M noinitrd        loglevel=7
bootargs_jffs2=console=ttyS0,115200 root=/dev/mtdblock4 rootfstype=jffs2 init=/linuxrc mem=64M rw noinitrd         loglevel=7
bootargs_ubifs=console=ttyS0,115200 ubi.mtd=6 root=ubi0:rootfs rootwait rootfstype=ubifs init=/linuxrc mem=64M     noinitrd rw loglevel=7
mtdparts=mtdparts=nand0:1m(uboot),15m(kernel),20m(ramdisk),20m(cramfs),20m(jffs2),20m(yaffs2),20m(ubifs),-(users)
baudrate=115200
ethaddr=08:08:11:18:12:27
ethact=dm9000
bootcmd_yaffs=nand read 30008000 100000 800000;bootm 30008000
bootcmd_yaffs2=nand read 30008000 100000 800000;bootm 30008000
bootdelay=1
bootcmd=run bootcmd_rootfs
bootcmd_rootfs=nand read 30008000 100000 800000;bootm 30008000
byaffs2=tftp 30008000 rootfs_yaffs2.bin;nand erase 6000000 2800000;nand write 30008000 6000000 400000
bkr=tftp 30008000 linuxrom-s3c2440_zhou.bin;nand erase 100000 f00000;nand write 30008000 100000 800000
filesize=350440
fileaddr=30008000
gatewayip=192.168.1.1
netmask=255.255.255.0
ipaddr=192.168.1.224
serverip=192.168.1.3
bootargs=console=ttyS0,115200 mem=64M rw loglevel=7 init=/linuxrc
bootargs_initramfs=console=ttyS0,115200 mem=64M rw loglevel=7 init=/linuxrc
stdin=serial
stdout=serial
stderr=serial


Environment size: 2144/131068 bytes
[ s3c2440@zhou ]# OK!

[ s3c2440@zhou ]# run bkr 
dm9000 i/o: 0x20000300, id: 0x90000a46 
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.3; our IP address is 192.168.1.224
Filename 'linuxrom-s3c2440_zhou.bin'.
Load address: 0x30008000
Loading: #################################################################
         #################################################################
         #################################################################
         ##########################################
done
Bytes transferred = 3474496 (350440 hex)


NAND erase: device 0 offset 0x100000, size 0xf00000
Erasing at 0xfe0000 -- 100% complete.
OK


NAND write: device 0 offset 0x100000, size 0x800000
 8388608 bytes written: OK
[ s3c2440@zhou ]# boot

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>