Linux内核学习

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内核

 

Imagevmlinux经过objcopy处理,没有elf头的,只有代码数据的镜像

 

vmlinux.bin: Image相同

vmlinux.bin.gz: vmlinux.bingzip压缩格式

 

zImage,bzImage是常用的一种压缩格式的镜像文件, 它们的区别是: bzImage不是bzip2压缩,而是”big zImage”zImage,bzImage都是用gzip压缩的,它们不仅仅是一个压缩文件,还在开头部分潜入gzip解压缩的代码(linux可以执行这些代码),所以用gunzip无法解压它们。zImage解压缩内核到低端内存(第一个640K)bzImage解压到高端内存(1M以上)。如果内核较小,可以使用zimagebzimage。如果大的内核,需要使用bzImage

 

vmlinuz: 具有压缩格式的可执行的linux,它实际上等于zImagebzImage

 

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)

你可能感兴趣的:(Linux内核学习)