linux内核制作
来源:互联网 发布:淘宝店铺取名大全2016 编辑:程序博客网 时间:2024/05/16 23:55
1.1 Linux内核基础知识
在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起。
1.1.1 Linux版本
Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 29
EXTRAVERSION = .1
其 中的“VERSION”和“PATCHLEVEL”组成主版本号,比如2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核), 开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布 一个稳定版本。“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。
1.1.2 什么是标准内核
按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在http://www.kernel.org/维 护和获取的内核,实际上它也有平台属性的。这些linux内核并不总是适用于所有linux支持的体系结构。实际上,这些内核版本很多时候并不是为一些流 行的嵌入式linux系统开发的,也很少运行于这些嵌入式linux系统上,这个站点上的内核首先确保的是在Intel X86体系结构上可以正常运行,它是基于X86处理器的内核,如对 linux-2.4.18.tar.bz2的配置make menuconfig时就可以看到,Processor type and features--->中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、 Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III /Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 选项,而没有类似Samsun 2410等其他芯片的选择。如果需要用在其他特定的处理器平台上就需要对内核进行打补丁,形成不同的嵌入式内核。实际上,不同处理器系统的内核下载站点中 提供的也往往是补丁patch而已,故原x86平台上的内核变成了基础内核,也被称为标准内核了。
1.1.3 Linux操作系统的分类
第一层次分类:以主要功能差异和发行组织区分(基础linux系统/内核)。
1、标准linux
2、μClinux
无MMU支持的linux系统,运行在无MMU的CPU上。
3、Linux-RT
是最早在linux上实现硬实时支持的linux发行版本。
4、Linux/RTAI
支持硬实时的linux,于RT-linux最大的不同之处在于RTAI定义了RTHAL,它将RTAI需要在linux中修改的部分定义成一组API接口,RTAI只使用API接口与linux交互。
5、Embedix
由Lineo公司开发,基于PowerPC和x86平台开发的。
6、Blue Cat Linux
7、Hard Hat Linux
8、其他
第二层分类:以应用的嵌入式平台区分(嵌入式linux系统/内核,使上面第一类中的各种linux系统扩展为对特定目标硬件的支持,成为一种具体的嵌入式linux系统)
由于嵌入式系统的发展与linux内核的发展是不同步的,所以为了要找一个能够运行于目标系统上的内核,需要对内核进行选择、配置和定制。因为每一种系统都是国际上不同的内核开发小组维护的,因此选择linux内核源码的站点也不尽相同。
第 二层分类中的linux系统/内核相对于第一层分类的标准内核来说,也可以称为嵌入式linxu系统/内核。如应用在ARM平台上的嵌入式Linux系统 通常有arm-linux(常运行在arm9平台上),μClinux(常用在arm7平台上),在标准linux基础上扩展对其他的平台的支持往往通过 安装patch实现,如armlinux就是对linux安装rmk补丁(如patch-2.4.18-rmk7.bz2)形成的,只有安装了这些补丁, 内核才能顺利地移植到ARM Linux上。也有些是已经安装好补丁的内核源码包,如linux-2.4.18-rmk7.tar.bz2。
不同处理器系统的内核/内核补丁下载站点:
处理器系统 适合的内核站点 下载方式
x86 http://www.kernel.org/ ftp, http, rsync
ARM http://www.arm.linux.org.uk/developer/ ftp, rsync
PowerPC http://penguinppc.org/ ftp, http, rsync, BitKeeper
MIPS http://www.linux-mips.org/ ftp, cvs
SuperH http://linuxsh.sourceforge.net/ cvs, BitKeeper
M68K http://linux-m68k.org/ ftp, http
non-MMU CPUs http://www.uclinux.org/ ftp, http
这些站点不仅仅是linux内核站点,它们可能直接提供了针对你的目标硬件系统的linux内核版本。
1.1.4 linux内核的选择
选择内核版本是很困难的,应该与负责维护该内核的小组保持联系,方法是通过订阅一些合适的邮件列表(maillist)并查看邮件中相关的重要新闻,以及浏览一些主要站点,可以得到该内核的最新发展动态。如针对ARM的Linux内核,可以访问http://www.arm.linux.org.uk/ 并订阅该网站上提供的maillist就可以了。如果觉得查阅邮箱中的邮件列表耗费太多时间,那么至少每周访问所关心的内核网站,并阅读Kernel Traffic提供的过去一周中在内核邮件清单中发生的重要的摘要,网址为http://kt.zork.net/kernel-traffic 这样就可以得到相关Linux内核的最新信息。
并 不是Linux的每个版本都适合ARM-Linux的移植,可以加入其邮件列表(maillist)以获得内核版本所支持硬件的相关信息,表中列出的资源 可以帮助你找到哪些没有列出的功能可以被你的系统支持。ARM Linux的移植,建议使用2.4.x或2.6.x版本。Linux内核补丁可以到ARM Linux的ftp(ftp://ftp.arm.linux.org.uk )下载。
1.3 Linux内核移植
1.3.1 移植内核和根文件系统准备工作
移植内核前,保证你已经装上了Linux系统,建立好了交叉编译环境,我用的是虚拟机,装的Redhat9.0系统,交叉编译工具用的是友善之臂的arm-linux-gcc-4.3.2。
开始移植Linux内核了,下面是我我使用的内核和文件系统,以及所用到的工具及获取方法:
1、Linux系统
我是在虚拟机上安装的Redhat9.0。XP系统下虚拟机设置的共享目录是D:\share,对应的Linux系统的目录是/mnt/hgfs/share。我将下面准备的压缩包和文件都统一放到该目录下。
2、Linux内核
到www.kernel.org/主页,进入该网站中链接FTP ftp://ftp.kernel.org/pub/,在里面进入文件夹“linux->kernel->v2.6”,会出现很多版本的内核压缩包和补丁,选中Linux-2.6.29.1.tar.bz2下载。
3、交叉编译工具链
使用友善之臂提供的arm-linux-4.3.2工具链,没有的到http://www.arm9.net/下载。工具链也可以自己做,可以参考《构建嵌入式Linux系统》一书或其它资料。
4、yaffs2代码
进入http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/,点击“Download GNU tarball”,下载后出现cvs-root.tar.gz压缩包。
5、busybox-1.13.3
从http://www.busybox.net/downloads/下载busybox,这里下载的是busy busybox-1.13.3.tar.gz。
6、根文件系统制作工具
到友善之臂http://www.arm9.net/ 网站下载根文件系统制作工具mkyaffs2image.tgz。
7、友善之臂的根文件系统
在制作根文件系统时,需要用到链接库,为保证链接库能用直接用友善之臂的根文件系统root_qtopia中的链接库lib,到友善之臂网站http://www.arm9.net/ 下载root_qtopia.tgz。
这些文件都下载到D:\share中,通过虚拟机进入Redhat9.0系统,进入/mnt/hgfs/share目录便可访问这些与XP共享的文件。
8、硬件平台
友善之臂的mini2440
1.3.2 修改Linux源码中参数
1、解压内核源码
mkdir /opt/studyarm
cd /mnt/hgfs/share
tar –jxvf linux-2.6.29.1.tar.bz2 –C /opt/studyarm
2、 进入内核目录,修改makefile,并对内核进行默认配置进行修改
193行,修改
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
3、 修改平台输入时钟
找到内核源码arch/arm/mach-s3c2440/mach-smdk2440.c文件,在函数 static void __init smdk2440_map_io(void)中,修改成s3c24xx_init_clocks(12000000)。
4、 修改machine名称(可以不改)
修改文件arch/arm/mach-s3c2440/mach-smdk2440.c,在文件中找到MACHINE_START( ),修改为MACHINE_START(S3C2440, “Study-S3C2440”)。
5、 修改Nand flash分区信息
修改文件kernel.git/arch/arm/plat-s3c24xx/common-smdk.c。
第一,修改分区信息:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.offset = 0x00000000,
.size = 0x00030000,
},
[1] = {
.name = "kernel",
.offset = 0x00050000,
.size = 0x00200000,
},
[2] = {
.name = "root",
.offset = 0x00250000,
.size = 0x03dac000,
}
};
第二,再修改s3c2410_platform_nand_smdk_nand_info smdk_nand_info = {
…
.tacls = 0,
.twrph0 = 30,
.twrph1=0,
…
};
6、 修改LCD背光
修改文件/arch/arm/mach-s3c2440/mach-smdk2440.c,因为友善的3.5寸液晶的背光控制是由S3C2440的GPG4引脚来控制的,故下面的改动将开启背光。
static void __init smdk2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&smdk2440_fb_info);
platform_add_devices();
s3c2410_gpio_cfgpin(S3C2410_GPG4,S3C2410_GPG4_OUTP);
s3c2410_gpio_setpin(S3C2410_GPG4,1); smdk_machine_init();
}
6、 LCD参数修改
这里用的是NEC3.5英寸屏液晶屏,大小为320x240,需要修改修改文件arch/arm/mach-s3c2440/mach-smdk2440.c。
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata =
{
…
.right_margin = 37,
.hsync_len = 6,
.upper_margin =2,
.lower_margin = 6,
.vsync_len =2,
};
static struct s3c2410fb_mach_info smdk2440_fb_info __initdata ={
…
.default_display =0
.gpccon = 0xaa955699,
.gpccon_mask = 0xffc003cc,
.gpcup = 0x0000ffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaa95aaa1,
.gpdcon_mask = 0xffc0fff0,
.gpdup = 0x0000faff,
.gpdup_mask = 0xffffffff,
.lpcsel = 0xf82,
};
7、 给内核打yaffs2文件系统的补丁
cd /mnt/hgfs/share
tar –zxvf /mnt/hgfs/share/cvs-root.tar.gz –C /opt/studyarm
cd /opt/stdudyarm/cvs/yaffs2/
./patch-ker.sh c /opt/studyarm/linux-2.6.29.1/
上面命令完成下面三件事情:
(1) 修改内核fs/Kconfig
增加一行:source "fs/yaffs2/Kconfig"
(2) 修改内核fs/Kconfig
增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/
(3) 在内核fs/目录下创建yaffs2目录
将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;
将yaffs2 源码目录的Kconfig文件复制到内核fs/yaffs2目录下;
将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.
8、修改S3C2440的机器号
由于Bootloader传递给Linux内核的机器号为782,为与Bootloader传递参数一致,修改 arch/arm/tools/math-types文件。
s3c2440 ARCH_S3C2440 S3C2440 362
修改为:
s3c2440 ARCH_S3C2440 S3C2440 782
1、 进入Linux-2.6.29.1内核主目录,通过以下命令将2410的默认配置文件写到当前目录下的.config。S3C2410的配置和S3C2440差不多,,在这基础上进行修改。
make s3c2410_defconfig
2、 配置内核模块的功能,有几种方式可以进行界面选择:
make menuconfig(文本选单的配置方式,在有字符终端下才能使用)
make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用)
make oldconfig(文本配置方式,在原内核配置的基础修改时使用)
这里使用make menuconfig命令。
3、[*]Enable loadable module support--->
[*]Forced module loading
[*]Module unloading
4、System Type--->
S3C2410 Machines--->
[*]SMDK2410/A9M2410选上 其余不选
S3C2440 Machines--->
[*]SMDK2440
[*]SMDK2440 with S3C2440 CPU module,其余不选
其余的Machines下选项全部不选(如2400,2412,2442,2443)
5、Kernel Features--->
[*]Use the ARM EABI to compile the kernel
注: 由于所使用的的交叉编译arm-linux-gcc-4.3.2是符合EABI标准交叉编译器,对于浮点运行会预设硬浮点运算FPA(Float Point Architecture),而没有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制,使用EABI(Embedded Application Binary Interface)则可以对此改善处理,ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。
参考:http://www.hotchn.cn/bbs/viewthread.php?tid=130&extra=page%3D1
6、Boot options-
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
7、Userspace binary formats--->
[*]Kernel support for ELF binaries
其它的可以全部不选。
8、 选择支持yaffs2文件系统
Filesystem--->
Miscellaneous filesystems--->
<*>YAFFS2 file system support
[*] Lets Yaffs do its own ECC
Native language support
<*> Codepage 437 (United States,Canada)
<*>Simplified Chinese charset(GB2312)
<*>Traditional Chinese charset(Big5)
<*>NLS ISO 8859-1(Latin1:Western European Languages)
<*>NLS UTF-8
9、Device Drivers--->
Graphics support--->
<*>Support for frame buffer devices--->
[*]Enable firmware EDID
[*]Enable Video Mode Handling Helpers
<*>S3C2410 LCD framebuffer support
Console display driver support--->
<*>Framebuffer Console support
[*]Select compiled-in fonts
[*] VGA8x8 font
[*]VGA8x16 font
[*]Bootup logo--->
[*]Standard black and white Linux logo
[*]Standard 16-color Linux logo
[*]Standard 224-color Linux logo
在Bootup logo--->选择的那几项,将会在系统启动时在液晶上显示开机logo。
1.3.4、编译内核
编译内核需要遵守以下步骤:
1、make dep
make dep的意思就是说:如果你使用程序A(比如支持特殊设备),而A需用到B(比如B是A的一 个模块/子程序)。而你在做make config的时候将一个设备的驱动 由内核支持改为module,或取消支持,这将可能影响到B的一个参数的设置,需重新编译B,重新编译或连接A....如果程序数量非常多, 你是很难手工完全做好此工作的。make dep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要编译。所以,你要make dep。
2、make clean
清除一些以前留下的文件,比如以前编译生成的目标文件,这一步必须要进行。否则,即使内核配置改动过,编译内核时还是将原来生成的目标文件进行连接,而不生成改动后的文件。
3、make zImage
Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩 形成的,所以它的大小比 Image小。但为了能使用zImage,必须在它的开头加上解压缩的代码,将 zImage解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用zImage可以占用较少的存储空 间,因此牺牲一点性能上的代价也是值得的,所以一般的嵌入式系统均采用压缩内核的方式。
在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起。
1.1.1 Linux版本
Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 29
EXTRAVERSION = .1
其 中的“VERSION”和“PATCHLEVEL”组成主版本号,比如2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核), 开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布 一个稳定版本。“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。
1.1.2 什么是标准内核
按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在http://www.kernel.org/维 护和获取的内核,实际上它也有平台属性的。这些linux内核并不总是适用于所有linux支持的体系结构。实际上,这些内核版本很多时候并不是为一些流 行的嵌入式linux系统开发的,也很少运行于这些嵌入式linux系统上,这个站点上的内核首先确保的是在Intel X86体系结构上可以正常运行,它是基于X86处理器的内核,如对 linux-2.4.18.tar.bz2的配置make menuconfig时就可以看到,Processor type and features--->中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、 Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III /Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 选项,而没有类似Samsun 2410等其他芯片的选择。如果需要用在其他特定的处理器平台上就需要对内核进行打补丁,形成不同的嵌入式内核。实际上,不同处理器系统的内核下载站点中 提供的也往往是补丁patch而已,故原x86平台上的内核变成了基础内核,也被称为标准内核了。
1.1.3 Linux操作系统的分类
第一层次分类:以主要功能差异和发行组织区分(基础linux系统/内核)。
1、标准linux
2、μClinux
无MMU支持的linux系统,运行在无MMU的CPU上。
3、Linux-RT
是最早在linux上实现硬实时支持的linux发行版本。
4、Linux/RTAI
支持硬实时的linux,于RT-linux最大的不同之处在于RTAI定义了RTHAL,它将RTAI需要在linux中修改的部分定义成一组API接口,RTAI只使用API接口与linux交互。
5、Embedix
由Lineo公司开发,基于PowerPC和x86平台开发的。
6、Blue Cat Linux
7、Hard Hat Linux
8、其他
第二层分类:以应用的嵌入式平台区分(嵌入式linux系统/内核,使上面第一类中的各种linux系统扩展为对特定目标硬件的支持,成为一种具体的嵌入式linux系统)
由于嵌入式系统的发展与linux内核的发展是不同步的,所以为了要找一个能够运行于目标系统上的内核,需要对内核进行选择、配置和定制。因为每一种系统都是国际上不同的内核开发小组维护的,因此选择linux内核源码的站点也不尽相同。
第 二层分类中的linux系统/内核相对于第一层分类的标准内核来说,也可以称为嵌入式linxu系统/内核。如应用在ARM平台上的嵌入式Linux系统 通常有arm-linux(常运行在arm9平台上),μClinux(常用在arm7平台上),在标准linux基础上扩展对其他的平台的支持往往通过 安装patch实现,如armlinux就是对linux安装rmk补丁(如patch-2.4.18-rmk7.bz2)形成的,只有安装了这些补丁, 内核才能顺利地移植到ARM Linux上。也有些是已经安装好补丁的内核源码包,如linux-2.4.18-rmk7.tar.bz2。
不同处理器系统的内核/内核补丁下载站点:
处理器系统 适合的内核站点 下载方式
x86 http://www.kernel.org/ ftp, http, rsync
ARM http://www.arm.linux.org.uk/developer/ ftp, rsync
PowerPC http://penguinppc.org/ ftp, http, rsync, BitKeeper
MIPS http://www.linux-mips.org/ ftp, cvs
SuperH http://linuxsh.sourceforge.net/ cvs, BitKeeper
M68K http://linux-m68k.org/ ftp, http
non-MMU CPUs http://www.uclinux.org/ ftp, http
这些站点不仅仅是linux内核站点,它们可能直接提供了针对你的目标硬件系统的linux内核版本。
1.1.4 linux内核的选择
选择内核版本是很困难的,应该与负责维护该内核的小组保持联系,方法是通过订阅一些合适的邮件列表(maillist)并查看邮件中相关的重要新闻,以及浏览一些主要站点,可以得到该内核的最新发展动态。如针对ARM的Linux内核,可以访问http://www.arm.linux.org.uk/ 并订阅该网站上提供的maillist就可以了。如果觉得查阅邮箱中的邮件列表耗费太多时间,那么至少每周访问所关心的内核网站,并阅读Kernel Traffic提供的过去一周中在内核邮件清单中发生的重要的摘要,网址为http://kt.zork.net/kernel-traffic 这样就可以得到相关Linux内核的最新信息。
并 不是Linux的每个版本都适合ARM-Linux的移植,可以加入其邮件列表(maillist)以获得内核版本所支持硬件的相关信息,表中列出的资源 可以帮助你找到哪些没有列出的功能可以被你的系统支持。ARM Linux的移植,建议使用2.4.x或2.6.x版本。Linux内核补丁可以到ARM Linux的ftp(ftp://ftp.arm.linux.org.uk )下载。
1.3 Linux内核移植
1.3.1 移植内核和根文件系统准备工作
移植内核前,保证你已经装上了Linux系统,建立好了交叉编译环境,我用的是虚拟机,装的Redhat9.0系统,交叉编译工具用的是友善之臂的arm-linux-gcc-4.3.2。
开始移植Linux内核了,下面是我我使用的内核和文件系统,以及所用到的工具及获取方法:
1、Linux系统
我是在虚拟机上安装的Redhat9.0。XP系统下虚拟机设置的共享目录是D:\share,对应的Linux系统的目录是/mnt/hgfs/share。我将下面准备的压缩包和文件都统一放到该目录下。
2、Linux内核
到www.kernel.org/主页,进入该网站中链接FTP ftp://ftp.kernel.org/pub/,在里面进入文件夹“linux->kernel->v2.6”,会出现很多版本的内核压缩包和补丁,选中Linux-2.6.29.1.tar.bz2下载。
3、交叉编译工具链
使用友善之臂提供的arm-linux-4.3.2工具链,没有的到http://www.arm9.net/下载。工具链也可以自己做,可以参考《构建嵌入式Linux系统》一书或其它资料。
4、yaffs2代码
进入http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/,点击“Download GNU tarball”,下载后出现cvs-root.tar.gz压缩包。
5、busybox-1.13.3
从http://www.busybox.net/downloads/下载busybox,这里下载的是busy busybox-1.13.3.tar.gz。
6、根文件系统制作工具
到友善之臂http://www.arm9.net/ 网站下载根文件系统制作工具mkyaffs2image.tgz。
7、友善之臂的根文件系统
在制作根文件系统时,需要用到链接库,为保证链接库能用直接用友善之臂的根文件系统root_qtopia中的链接库lib,到友善之臂网站http://www.arm9.net/ 下载root_qtopia.tgz。
这些文件都下载到D:\share中,通过虚拟机进入Redhat9.0系统,进入/mnt/hgfs/share目录便可访问这些与XP共享的文件。
8、硬件平台
友善之臂的mini2440
1.3.2 修改Linux源码中参数
1、解压内核源码
mkdir /opt/studyarm
cd /mnt/hgfs/share
tar –jxvf linux-2.6.29.1.tar.bz2 –C /opt/studyarm
2、 进入内核目录,修改makefile,并对内核进行默认配置进行修改
193行,修改
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
3、 修改平台输入时钟
找到内核源码arch/arm/mach-s3c2440/mach-smdk2440.c文件,在函数 static void __init smdk2440_map_io(void)中,修改成s3c24xx_init_clocks(12000000)。
4、 修改machine名称(可以不改)
修改文件arch/arm/mach-s3c2440/mach-smdk2440.c,在文件中找到MACHINE_START( ),修改为MACHINE_START(S3C2440, “Study-S3C2440”)。
5、 修改Nand flash分区信息
修改文件kernel.git/arch/arm/plat-s3c24xx/common-smdk.c。
第一,修改分区信息:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.offset = 0x00000000,
.size = 0x00030000,
},
[1] = {
.name = "kernel",
.offset = 0x00050000,
.size = 0x00200000,
},
[2] = {
.name = "root",
.offset = 0x00250000,
.size = 0x03dac000,
}
};
第二,再修改s3c2410_platform_nand_smdk_nand_info smdk_nand_info = {
…
.tacls = 0,
.twrph0 = 30,
.twrph1=0,
…
};
6、 修改LCD背光
修改文件/arch/arm/mach-s3c2440/mach-smdk2440.c,因为友善的3.5寸液晶的背光控制是由S3C2440的GPG4引脚来控制的,故下面的改动将开启背光。
static void __init smdk2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&smdk2440_fb_info);
platform_add_devices();
s3c2410_gpio_cfgpin(S3C2410_GPG4,S3C2410_GPG4_OUTP);
s3c2410_gpio_setpin(S3C2410_GPG4,1); smdk_machine_init();
}
6、 LCD参数修改
这里用的是NEC3.5英寸屏液晶屏,大小为320x240,需要修改修改文件arch/arm/mach-s3c2440/mach-smdk2440.c。
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata =
{
…
.right_margin = 37,
.hsync_len = 6,
.upper_margin =2,
.lower_margin = 6,
.vsync_len =2,
};
static struct s3c2410fb_mach_info smdk2440_fb_info __initdata ={
…
.default_display =0
.gpccon = 0xaa955699,
.gpccon_mask = 0xffc003cc,
.gpcup = 0x0000ffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaa95aaa1,
.gpdcon_mask = 0xffc0fff0,
.gpdup = 0x0000faff,
.gpdup_mask = 0xffffffff,
.lpcsel = 0xf82,
};
7、 给内核打yaffs2文件系统的补丁
cd /mnt/hgfs/share
tar –zxvf /mnt/hgfs/share/cvs-root.tar.gz –C /opt/studyarm
cd /opt/stdudyarm/cvs/yaffs2/
./patch-ker.sh c /opt/studyarm/linux-2.6.29.1/
上面命令完成下面三件事情:
(1) 修改内核fs/Kconfig
增加一行:source "fs/yaffs2/Kconfig"
(2) 修改内核fs/Kconfig
增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/
(3) 在内核fs/目录下创建yaffs2目录
将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;
将yaffs2 源码目录的Kconfig文件复制到内核fs/yaffs2目录下;
将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.
8、修改S3C2440的机器号
由于Bootloader传递给Linux内核的机器号为782,为与Bootloader传递参数一致,修改 arch/arm/tools/math-types文件。
s3c2440 ARCH_S3C2440 S3C2440 362
修改为:
s3c2440 ARCH_S3C2440 S3C2440 782
另外,还可以不修改内核中的S3C2440机器号,只需修改修改Bootloader传递给内核的参数中的机器号就可以了。在VIVI中菜单中,按s,再按s,输入mach_type,回车,输入362,w,保存。
1、 进入Linux-2.6.29.1内核主目录,通过以下命令将2410的默认配置文件写到当前目录下的.config。S3C2410的配置和S3C2440差不多,,在这基础上进行修改。
make s3c2410_defconfig
2、 配置内核模块的功能,有几种方式可以进行界面选择:
make menuconfig(文本选单的配置方式,在有字符终端下才能使用)
make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用)
make oldconfig(文本配置方式,在原内核配置的基础修改时使用)
这里使用make menuconfig命令。
3、[*]Enable loadable module support--->
[*]Forced module loading
[*]Module unloading
4、System Type--->
S3C2410 Machines--->
[*]SMDK2410/A9M2410选上 其余不选
S3C2440 Machines--->
[*]SMDK2440
[*]SMDK2440 with S3C2440 CPU module,其余不选
其余的Machines下选项全部不选(如2400,2412,2442,2443)
5、Kernel Features--->
[*]Use the ARM EABI to compile the kernel
注: 由于所使用的的交叉编译arm-linux-gcc-4.3.2是符合EABI标准交叉编译器,对于浮点运行会预设硬浮点运算FPA(Float Point Architecture),而没有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制,使用EABI(Embedded Application Binary Interface)则可以对此改善处理,ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。
参考:http://www.hotchn.cn/bbs/viewthread.php?tid=130&extra=page%3D1
6、Boot options-
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
7、Userspace binary formats--->
[*]Kernel support for ELF binaries
其它的可以全部不选。
8、 选择支持yaffs2文件系统
Filesystem--->
Miscellaneous filesystems--->
<*>YAFFS2 file system support
[*] Lets Yaffs do its own ECC
Native language support
<*> Codepage 437 (United States,Canada)
<*>Simplified Chinese charset(GB2312)
<*>Traditional Chinese charset(Big5)
<*>NLS ISO 8859-1(Latin1:Western European Languages)
<*>NLS UTF-8
9、Device Drivers--->
Graphics support--->
<*>Support for frame buffer devices--->
[*]Enable firmware EDID
[*]Enable Video Mode Handling Helpers
<*>S3C2410 LCD framebuffer support
Console display driver support--->
<*>Framebuffer Console support
[*]Select compiled-in fonts
[*] VGA8x8 font
[*]VGA8x16 font
[*]Bootup logo--->
[*]Standard black and white Linux logo
[*]Standard 16-color Linux logo
[*]Standard 224-color Linux logo
在Bootup logo--->选择的那几项,将会在系统启动时在液晶上显示开机logo。
1.3.4、编译内核
编译内核需要遵守以下步骤:
1、make dep
make dep的意思就是说:如果你使用程序A(比如支持特殊设备),而A需用到B(比如B是A的一 个模块/子程序)。而你在做make config的时候将一个设备的驱动 由内核支持改为module,或取消支持,这将可能影响到B的一个参数的设置,需重新编译B,重新编译或连接A....如果程序数量非常多, 你是很难手工完全做好此工作的。make dep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要编译。所以,你要make dep。
2、make clean
清除一些以前留下的文件,比如以前编译生成的目标文件,这一步必须要进行。否则,即使内核配置改动过,编译内核时还是将原来生成的目标文件进行连接,而不生成改动后的文件。
3、make zImage
Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩 形成的,所以它的大小比 Image小。但为了能使用zImage,必须在它的开头加上解压缩的代码,将 zImage解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用zImage可以占用较少的存储空 间,因此牺牲一点性能上的代价也是值得的,所以一般的嵌入式系统均采用压缩内核的方式。
编译完成后,会在内核目录arch/arm/boot/下生成zImage内核映像文件。
内核制作
1、清除原有配置与中间文件
x86:make distclean
arm:make distclean
选择配置文件
cp config-mini2440 .config
2、配置内核
x86:make menuconfig
arm:make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-
3、编译内核
x86:make bzlmage
arm:make ulmage ARCH=arm CROSS_COMPILE=arm-linux-
生成的内核映像uImage位于arch/arm/boot下
如未生成则把u-boot源代码(编译之后)中的mkimage拷贝到/bin文件目录下
cp u-boot-2008.10/tools/mkimage /bin 再编译
- linux内核制作
- 嵌入式linux内核制作
- 嵌入式linux内核制作
- 嵌入式linux内核制作
- 嵌入式linux内核制作
- 嵌入式Linux内核制作
- 嵌入式linux内核制作
- linux内核的制作
- 嵌入式 Linux 内核制作
- Linux内核制作
- mkimage制作linux内核映像
- mkimage制作linux内核映像
- arm平台Linux内核制作
- 嵌入式linux内核制作流程
- 嵌入式Linux内核的制作
- 制作最小linux内核(1)
- 制作最小linux内核(2)
- 制作最小linux内核(3)
- 解决如何从msys直接运行git命令最简单方法
- 堆与堆排序
- 2012年手机/社交游戏行业的主要传闻与争议
- oracle的正则表达式
- NSString 的非utf-8编码(gbk,gb18030)
- linux内核制作
- efcodefirst安装不了,This package (or one of its dependencies) contains PowerShell scripts and needs to
- dz 门户调用DIY内置公告不显示,活动内置不显示解决方法
- C++ 野指针(迷途指针)
- PHP 做守护进程
- 实现800*600,1024*768两套分辨率方案
- AssetManager asset的使用
- Covariance and Contravariance in Generics(泛型中的协变和逆变)
- uIP的web服务