[关闭]
@Lxjeng 2016-03-23T13:29:43.000000Z 字数 2121 阅读 1750

Linux内核编译实验报告


  • 姓名:梁晓静 学号:1405010530 班级:计算机5班
  • 报告提交日期:2016.3.25 报告提交截止日期:2016.3.25

一、实验题目

  • Linux内核的编译和安装

二、实验目的

  • 1、完成Linux内核的配置、编译、安装及验证和测试
  • 2、生成Makefile文件、添加和移除内核模块

三、实验内容

  • 下载源码linux-3.12.56.tar.xz,在Linux环境下配置、编译、安装内核,并完成验证和测试。

四、实验平台

  • 虚拟机Linuxmint-17.2、源码linux-3.12.56.tar.xz、automake和autoconf工具(用于Makefile文件的生成)

五、实验步骤

1、准备阶段

  • 在www.kernel.org下载源码linux-3.12.56.tar.xz,建立内核编译环境,将源码解压到/usr/src,建立到/usr/src/linux的符号链接。
  • # tar xvf linux-3.12.56.tar.xz
  • # ln -sv /usr/src/linux-3.12.56 /usr/src/linux

此处输入图片的描述

2、配置内核

  • # make menuconfig:打开一个文件窗口选择菜单
    在此之前遇到没有规则创建目标的错误,因此安装了相关工具,解决如图:

此处输入图片的描述

开始正式配置内核:
此处输入图片的描述
此处输入图片的描述

3、编译内核

  • # make -j2

此处输入图片的描述
4、安装模块和内核

  • # make modules_install
  • # make install

此处输入图片的描述

5、验证并测试

  • # cat/boot/grub/grub.conf

此处输入图片的描述

此时已经编译好自己的内核了:
此处输入图片的描述

6、生成Makefile文件

  • ①在/home/lxj下新建文档编写mian.c、fib.c、fib.h文件
  1. #include<stdio.h>
  2. #include"fib.h"
  3. int main()
  4. {
  5. int n=0;
  6. printf("input n=\n");
  7. scanf("%d",&n);
  8. printf("fib(%d)=%dn",n,fib(n));
  9. return 0;
  10. } //main.c
  1. int fib(int n);//fib.h
  1. #include"fib.h"
  2. int fib(int n)
  3. {
  4. if(n ==0)
  5. return 0;
  6. if(n==1||n==2)
  7. { return 1;
  8. return fib(n-1)+fib(n-2);
  9. }}//fib.c

如图:
此处输入图片的描述

  • ②新建Makefile.am文件
  1. AUTOMAKE_OPTIONS=foreign
  2. bin_PROGRAMS=fib
  3. fib_SOURCES= fib.c fib.h main.c

此处输入图片的描述

  • ③# aclocal:成功后会在目录下产生aclocal.m4和autom4te.cache文件
    # autoheader:成功后会在目录下产生config.h.in文件
    # autoconf:成功后会在目录下产生configure文件
    # automake --add-missing:成功后会在目录下产生depcomp、install-sh 、missing和Makefile.in文件
    # ./configure:自动生成Makefile文件

此处输入图片的描述

注:在编写Makefile.am时居然将OPTIONS少写了一个字母,所以导致了各种错误!

7、添加和删除内核模块

  • ①新建hello.c和Makefile(输出Hello,World)
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. static int hello_init(void)
  5. {
  6. printk(KERN_ALERT "Hello World!/n");
  7. return 0;
  8. }
  9. static void hello_exit(void)
  10. {
  11. printk(KERN_ALERT "Bye World!/n");
  12. }
  13. module_init(hello_init);
  14. module_exit(hello_exit);
  15. MODULE_LICENSE("GPL");
  16. MODULE_AUTHOR("WFJ");//hello.c

此处输入图片的描述

  • ②# make

此处输入图片的描述
注:这些错误又由于粗心,没有注意格式,在编写Makefile时make前应加Tab键。

  • ③添加模块并查看其情况
    # insmod ./hello.ko
    # tail /var/log/kern.log

此处输入图片的描述

  • ④删除模块并查看其情况
    # rmmod hello
    # tail /var/log/kern.log

此处输入图片的描述

六、实验体会

  • ①通过本次编译内核的实验,我了解了一个内核从准备阶段、配置、编译、安装及验证和测试的大概过程,Linux内核的体积结构虽然是单内核的,具有模块化,耦合度高的特点,但其在管理系统的进程、内存、设备驱动程序、文件和网络等方面更高效稳定。
    ②实验过程中遇到了很多棘手的问题,比如没有相关规则和环境找到目标之类,但在同学的帮助下,一一将有用的东西安装好,才能一步步往下进行。之前从未接触过内核编译的我,一开始遇到错误根本不知道原因何在,但经过同学远程控制的帮助下,将繁琐的问题解决,也让我学会了很多相关知识。
    ③为时三天左右的时间,可能由于我的电脑配置不高,老是卡住,而且一打开虚拟机,鼠标就用不了,影响了实验的进度。当然,这种情况也让我认识到耐心和坚韧的重要性,学习计算机是一件痛并快乐着的事情!
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注