1. linux 内核编译
注意:首先一定要将mkimage文件拷贝到虚拟机linux的/usr/bin下,并且权限设置为可执行文件(chmod 777 /usr/bin/mkimage),否则编译utu-linux内核时,make uImage会出现错误!!
编译linux kernel步骤如下:
##复制和解压内核源码文件##
拷贝 utu-Linux2.6.24_for_2440.tar到/home/public/linux目录
cd /home/public/linux/
tar xzf utu-Linux2.6.24_for_2440.tar
cd utu-Linux2.6.24_for_2440
##配置菜单##
1) make menuconfig (该步骤只是查看一下菜单是否进入,如果可以,则输入esc后,选择exit 退出。
如果出现 curses.h出错,则需要安装curses(sudo apt-get install libncurses5-dev
)
##编译内核##
make uImage
生成的文件为
arch/arm/boot/uImage
把uImage 放入tftp目录,单板可以在uboot命令行下升级uImage
##升级后确认##
升级完成后,查看linux启动信息(下面打印信息红色字体部分为编译时间),可以确认是否升级成功
Starting kernel ...
Uncompressing Linux................................................................................................................................ done, booting the kernel.
Linux version 2.6.24.4 (root@ubuntu) (gcc version 3.4.1) #458 Fri Jul 8 22:00:09 CST 2011
2. uImage, Image, zImage, bzImage, vmlinux, vmlinuxz, vmlinux.bin区别
vmlinux: vm表示virtual memory。它是eld格式的linux内核
Image是vmlinux经过objcopy处理,没有elf头的,只有代码数据的镜像
vmlinux.bin: 与Image相同
vmlinux.bin.gz: vmlinux.bin的gzip压缩格式
zImage,bzImage是常用的一种压缩格式的镜像文件, 它们的区别是: bzImage不是bzip2压缩,而是”big zImage”,zImage,bzImage都是用gzip压缩的,它们不仅仅是一个压缩文件,还在开头部分潜入gzip解压缩的代码(linux可以执行这些代码),所以用gunzip无法解压它们。zImage解压缩内核到低端内存(第一个640K),bzImage解压到高端内存(1M以上)。如果内核较小,可以使用zimage,bzimage。如果大的内核,需要使用bzImage。
vmlinuz: 具有压缩格式的可执行的linux,它实际上等于zImage或bzImage
uImage: uboot的专用的image,它是再zImage之前加上了一个长度为64字节的头,说明内核版本,加载位置,时间,大小,其64字节后鱼zImage没有区别
KSYM .tmp_kallsyms3.S
AS .tmp_kallsyms3.o
LD vmlinux.o
MODPOST vmlinux.o
LD vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
GZIP arch/arm/boot/compressed/piggy.gz
AS arch/arm/boot/compressed/piggy.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-2.6.24.4
Created: Fri Oct 7 13:21:40 2011
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1956216 Bytes = 1910.37 kB = 1.87 MB
Load Address: 0x30008000
Entry Point: 0x30008000
Image arch/arm/boot/uImage is ready
root@ubuntu:/home/public/linux/utu-Linux2.6.24_for_2440#
3. linux 内核配置
4. Kconfig Makefile介绍
1) .config文件
内核的配置文件
2) 子目录的Makefile,Kconfig
以drivers\char目录为例, Makefile表示字符设备驱动的makefile, Kconfig表示字符设备驱动的manuconfig 配置文件.
例如,我需要需要添加hello world字符设备在linux内核,方法如下
a) 在drivers\char\Makefile开始的地方添加
obj-$(CONFIG_LINUX_HELLOWORLD) += helloworld.o
b) 在drivers\char\Kconfig开始的地方添加
config LINUX_HELLOWORLD
bool "hello world"
default y
---help---
test linux by hello world
c) 在drivers\char 创建helloworld.c,添加如下代码
#include <linux/module.h>
static int __init sx_init(void)
{
printk("Hello world\n");
return 0;
}
static void __exit sx_exit(void)
{
}
module_init(sx_init);
module_exit(sx_exit);
5. 字符设备的led电灯
gpio.c (arch\arm\plat-s3c24xx)
#include <asm/arch/regs-gpio.h>
void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
unsigned int s3c2410_gpio_getpin(unsigned int pin)