【Linux基础】Linux内核配置(上)

来源:互联网 发布:专业摩托车导航软件 编辑:程序博客网 时间:2024/06/04 01:07

 

阅读本文章的读书,请先了解什么是Linux内核,那么什么是Linux内核
一、通用的Linux系统包括以下目录:
(1)/arch包含了所有硬件结构特定的内核代码。
①boot: 包括启动内核所使用的部分或全部平台特有代码。
②kernel: 存放高速体系结构特有的(如信号处理和SMP)特征的实现。
③lib: 存放高速体系结构特有的(如strlen和memcpy)通用函数的实现。
④mm: 存放体系结构特有的内存管理程序的实现。
⑤math-emu: 模拟FPU的代码。对于ARM处理器来说,此目录用mach-xxx代替。
(2)/drivers包含了内核中所有的设备驱动程序。
(3)/fs包含了Linux支持的所有的文件系统。
(4)/include包含了建立内核代码时所需的大部分头文件,该目录也包含了不同平台需要的头文件。比如,asm-arm是ARM平台需要的头文件。
(5)/init包含了内核的初始化代码及main(),内核从此处工作。
(6)/ipc包含了内核进程间的通信代码。
(7)/kernel包含了主内核代码,如进程管理和调度。
(8)/mm包含了所有内存管理代码,即虚存管理。
(9)/net包含了各种不同网卡和网络规程的驱动代码。
内核需要在PC上先编译好了才移植到板子上,即需要使用交叉编译器:代码在宿主机上编译,编译好的程序移植到目标机上运行。GEC2440支持的内核是Linux2.6.30.4,指定用的交叉编译器是arm-linux-gcc.4.1.2。
二、配置内核
linux-2.6 内核已经支持 S3C2440 处理器的多种硬件板,由于 S3C2410 S3C2440 同属于 ARM920T 系列芯片,且寄存器等硬件电路基本一致,我们可以参考 SMDK2410 参考板来移植 2440 开发板
下面开始视频点播系统的内核配置:
一、准备工作
建立工作目录,下载内核源码:linux-2.6.30.4.tar.bz2。步骤如下:
#mkdir /root/build_kernel
#cd /root/build_kernel
#tar jxvf linux-2.6.30.4.tar.gz
解压后会在当前目录下生成一个 linux-2.6.30.4 的内核源码目录
二、修改内核源码顶层 Makefile
修改内核目录树根下的的 Makefile,指明体系结构是 arm,交叉编译工具是 arm-linux-。
#vi Makefile
找到 ARCH 和 CROSS_COMPILE,修改
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/4.1.2/bin/arm-linux-
//建议用arm-angstrom-linux-gnueabi-代替arm-linux-,因软链接,都可以用
保存退出。
三、修改机器码
在u-boot-2009.11 的/board/samsun/gec2440/gec2440.c 设置了 MACH_TYPE 的类型为 MACH_TYPE_SMDK2410,查看 u-boot 里的 include/asm-arm/mach-types.h 文件,有下面定义:
#define MACH_TYPE_SMDK2410 193
//针对 2440 的 MACH_TYPE 码的值定义为 193
而 linux 内核源码的 arch/arm/tools/mach-types 文件有如下定义:
smdk2440 MACH_SMDK2440 SMDK2410 193
即 u-boot 和 linux 内核的同样类型的机器码都为 193。
那么我们就修改 kernel 的 MACH_TYPE 代码引用部分,确定 kernel 的 MACH_TYPE。 如下:
修改#vim arch/arm/mach-s3c2440/mach-smdk2440.c : //修改文件最后面 将
MACHINE_START(S3C2440, "SMDK2440")
修改为:
MACHINE_START(SMDK2410, "SMDK2440")
修改#vim arch/arm/kernel/head.S //在ENTRY(stext)下添加如下代码
ENTRY(stext)
mov r0, #0
mov r1, #0xc1 // MACH_TYPE_SMDK2410值193换成十六进制就是 0xc1
ldr r2, =0x30000100 //Linux kernel parameter
四、设置 flash 分区
1、修改分区信息(默认 8 个分区,具体分区数目可以根据项目而定,本项目初设置为 3 个)
#vim arch/arm/plat-s3c24xx/common-smdk.c
修改内核分区信息(本示例分设四个分区)。
意义:要让内核知道 nand flash 的分区信息,设置成跟 bootloader 一致。修改如下:
static struct mtd_partition smdk_default_nand_part[] =
{ [0] = {
.name = "U-Boot",
.size = 16*SZ_16K, //分区大小256k
.offset = 0, // 本分区起始地址 0x0
},
[1] = {
.name = "Kernel",
.offset = 16*SZ_16K, // 本分区起始地址 0x40000
.size =3*SZ_1M, // 分区大小 3M
},
[2] = {
.name = "Rootfs",
.offset = MTDPART_OFS_APPEND, //紧接上一分区地址
// 本区起始地址 0x340000
.size = MTDPART_SIZ_FULL, //使用剩余全部空间
} //本分区大0x3cc0000
}// 62208K
name: 代表分区名字
size: 代表 flash 分区大小(单位:字节)
offset: 代表 flash 分区的起始地址(相对于 0x0 的偏移)
另外在该文件中修改smdk_nand_info如下:
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls =0, //default is 20 参数设置需参看 datasheet,Linux教学平台上有描述
.twrph0 =30, //default is 60
.twrph1 =0, //defualt is 20
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
保存退出。
3.2.修改时钟(终端输出若有乱码则需修改)
arch/arm/mach-s3c2440/mach-smdk2440.c中修改
smdk2440_map_io
#vimarch/arm/mach-s3c2440/mach-smdk2440.c
如下
static void init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));s3c24xx_init_clocks(12000000);//default is 0
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
3.3 修改nand Flash 的校验方式,去掉ECC 验,否则上电启动会提示ECC 错误或 者 I/O读取错误。
#vimdrivers/mtd/nand/s3c2410.c
chip->ecc.mode = NAND_ECC_SOFT;
改为chip->ecc.mode = NAND_ECC_NONE;
Linux教学平台为您推荐:Linux内核配置(下)
本文转载于唯C教育,http://www.weicedu.com/forum.php?mod=viewthread&tid=275652
原创粉丝点击