LINUX内核配置与编译

移植LINUX内核,就是为了让LINUX系统在自己的硬件平台上运行起来,能正常工作。其中最重要的还是驱动的移植,只有驱动程序能驱动硬件设备,上层的应用程序才能正常运行。

目前,LINUX支持内核的系列主要有以下,解压linux-3.5-20131028.tgz文件,进入到文件夹里面,

除了arch文件夹里面,都是大多数平台相同的文件:

在kernel文件夹里面,包含着一些内核的文件;

在arch文件里面是支持的各种平台文件,里面是一些芯片公司支持的一些驱动程序;

一般来说,LINUX系统剪裁都分为以下几步:

第一步:解压   linux-3.5-20131028.tgz  linux源码包,进入linux-3.5文件夹,

第二步:配置 .config文件,这里,直接使用的是   tiny4412_linux_defconfig

cp  tiny4412_linux_defconfig  .config

第三步:选择生成模块,这一步,可以选择需要那些模块编译进镜像文件,因为,考虑到各种功耗的问题,有些linux模块的      功 能是没有必要编进内核

      make menuconfig  进入选择模块编译

第四步:make 生成   zImage  镜像,这个就类似于装windos系统的.iso文件之类的。之前,在配置交叉编译环境的时候就是用的这个文件镜像。

第五步:dnw到板子,把板子的linux系统跑起来,到这里,linux系统是在板子上成功运行:

接下来,是内核模块的编写部分:

  先贴代码:

1 #include <linux/init.h>
  2 #include <linux/module.h>
  3
  4 MODULE_LICENSE("GPL");
  5 MODULE_AUTHOR("bunfly");
  6
  7 int test_init()
  8 {
  9     printk("hahahhahahahah\n");
 10
 11     return 0;
 12 }
 13
 14 void test_exit()
 15 {
 16     printk("exit\n");
 17 }
 18
 19 module_init(test_init);
 20 module_exit(test_exit);
 21 

因为是在内核层,所以没有以前的include<stdio.h>之类的头文件,这里换成了两个linux/init。和linux/module头文件

7 int test_init()
  8 {
  9     printk("hahahhahahahah\n");
 10
 11     return 0;
 12 }

在这里写了一个函数,打印一句话,

而在 19 module_init(test_init)行,这里用了一个回调函数来调用test.init函数,这个回调函数是加载到内核的时候,执行的函数;

那么,module_exit(); 就是从内核卸载时执行的函数;

4 MODULE_LICENSE("GPL");///声明开发模块遵循的的开源协议
5 MODULE_AUTHOR("bunfly"); //申明模块的开发者
这两行在如果不申明的话将会出现警告:

  1
  2 ha:
  3     make -C /home/bunfly/source_code/linux-3.5 M=/home/kernel/arm/ram/520/1st
  4
  5 clean:
  6     make -C /home/bunfly/source_code/linux-3.5 M=/home/kernel/arm/ram/520/1st cle    an
  7
  8
  9 obj-m += test.o
 10

 以上是makefile文件

make生成.ko文件, 在板子上加载到内核模块:

接下来的一个程序,打印出任务的名字:

  2 #include <linux/thread_info.h>
  3 #include <linux/module.h>
  4 #include <linux/sched.h>
  5
  6 MODULE_LICENSE("GPL");
  7 MODULE_AUTHOR("bunfly");
  8
  9 int test_init()
 10 {
 11     int i = 0;
 12     struct task_struct *t;
 13     struct thread_info *info;//线程信息
 14
 15     unsigned long addr = (unsigned long)&i;
 16     unsigned long base = addr & ~0x1fff;//以8K的字节对齐
 17     info = (struct thread_info *)base;//找到线程的地址
 18     t = info->task;//获得任务信息
 19     printk("%s\n", t->comm);//打印出任务的名字
 20
 21     return 0;
 22 }
 23
 24 void test_exit()
 25 {
 26     printk("exit\n");
 27 }
 28
 29 module_init(test_init);
 30 module_exit(test_exit);
 31

makefile:

  1
  2 ha:
  3     make -C /home/bunfly/source_code/linux-3.5 M=`pwd`
  4
  5 clean:
  6     make -C /home/bunfly/source_code/linux-3.5 M=`pwd` clean
  7
  8 obj-m += test.o
  9
~
~   

    make

    在ARM板子上运行:

  

  总结:本次通过自己适当剪裁,生成一个在zImage镜像文件,而且,自己写了一个简单的内核模块,在ARM板子上,插入内核模块,运行。

  在这里,有些固定的方式:例如,内核代码的Makefile文件,以后需要编译内核模块都是固定的方法:

而在第二个文件中的,通过使用以对齐的方式找到地址;获得固定结构体task里的名字参数comm的做法,应该深入理解,并且灵活运用:

   补充一下建立索引来搜索文件里的小知识,对于查找文件关键字很有用  ctags

    首先到需要搜索的目录下面:建立索引文件:ctags   -R .   ..

                  随便打开任意文件:vim hong

                  查找关键字:ta   xxxx

                  如果要继续查找某一关键字,只需要将光标移动到上面按下:ctrl+ ]

                  返回刚才查找的结果       ctrl  +   o

    

      

下面是LINUX内核开发的工作流程

时间: 2024-10-23 15:24:11

LINUX内核配置与编译的相关文章

[国嵌攻略][099][Linux内核配置与编译]

为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make menuconfig配置方法 1.菜单项的分类 processor type and features   处理器类型 networking support            网络协议支持 device drivers                设备驱动支持 file systems     

Linux内核配置、编译及Makefile简述

Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核.这里我用到的是linux.2.22.6版本的内核.在Linux下命令行通过tar xjf linux.2.22.6.tar.bz2解压内核.然后,如果你需要对这个内核打补丁的话,用patch命令:patch -px <../linux.2.22.6.patch.这里的px指的是忽略掉补丁文件中描述的

Linux 内核配置和编译

一.配置内核 (1). 为什么要配置内核 1. 硬件需求 2. 软件需求 选出需要的,去掉不要的 (2). 如何配置内核 1. make  config 基于文本模式的交互式配置 2. make  menuconfig 基于文本模式的菜单式配置  优点:直观,简单,高效 <  > 不选择该功能  <m> 内核模块 不是随时随刻要使用的  B.o文件存到硬盘中,需要才添加到内存里面.节省内存  <*>B.O文件存到内存中,随时随地可使用的. (3). 内核配置结果 ls

嵌入式 Linux开发Kernel移植(二)——kernel内核配置和编译

嵌入式 Linux开发Kernel移植(二)--kernel内核配置和编译 本文选择linux 2.6.35.7版本kernel进行实践. 一.linux kernel源码目录分析 Kbuild,Kernel Build,管理内核编译的文件 Makefile,kernel工程的Makefile. arch,体系架构,arch目录下的子目录存放的是不同种类的架构 block,块设备,一般是存储设备,存放的块设备管理的相关代码 crypto,加密相关,存放加密算法实现代码 Documentation

linux内核裁剪及编译可加载模块

一:linux内核裁剪: (1):编译内核源码: 在邦飞的课程学习已经接近尾声:这周的重点内容是内核驱动的编写,在编写驱动之前首先的了解linux内核源码,linux主要是由五个子系统组成:进程调度,内存管理,文件系统,网络接口以及进程间通信:下面是解压的linux内核源码文件: 下面对linux内核里面的文件进行简单的说明: arch目录中包含于体系结构有关的子目录和文件,arm的相关平台信息在arch/arm目录下. scripts目录中存放着对核心配置的脚本文件. crypto目录中包含着

内核配置与编译,内核移植

内核配置与编译 一.内核清除 当我们拿到内核第一步需要做的就是先对内核进行清理,防止别人配置编译生成的中间文件对我们产生影响: 1.配置过程生成的 .config 2.编译生成 bzImage 中间文件(.o)和生成.ko 文件的中间文件(.o) make clean 清除.o 文件 make distlean 清除.config 文件 二.内核配置 1. make config:基于文本模式的交互式配置. 2. make menuconfig:基于文本模式的菜单型配置. 一般来说我选择第二种方

【华为云技术分享】Linux内核的分布式编译(1)

上一期中我们介绍了Linux内核模块依赖图的绘制方法,这一期中我们将介绍Linux内核的分布式编译方法和分布式编译工具distcc的安装过程. 一.Linux内核的分布式编译 分布式编译是指将源程序通过网络中的多台计算机的协同编译过程编译成目标程序的技术.分布式编译一般通过TCP或SSH等协议将编译任务分配至网络中不同的计算机上,使这些计算机协同完成编译工作.Linux内核可以使用distcc[1]进行分布式编译. distcc是一个通过网络中的多台计算机对C.C++.Objective C或O

linux内核配置 kbuild

Linux 内核配置机制 http://blog.csdn.net/dianhuiren/article/details/6917132 linux kbuild文档 http://blog.chinaunix.net/uid-10221131-id-2943265.html

Linux内核配置浅析

1.Linux Kernel Kconfig系统的基本结构 Linux内核的配置系统由三个部分组成,分别是: 1>.Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则: 2>.Kconfig:分布在 Linux 内核源代码根目录及各层目录中,给用户提供配置选择的功能: 3>..config:保存了配置选项结果: 4>.配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面.基于 Ncurs