Linux 内核模块编译 Makefile

驱动编译分为静态编译动态编译;静态编译即为将驱动直接编译进内核,动态编译即为将驱动编译成模块。

而动态编译又分为两种:

a -- 内部编译

在内核源码目录内编译

b -- 外部编译

在内核源码的目录外编译

二、具体编译过程分析

注:本次编译是外部编译,使用的内核源码是Ubuntu 的源代码,而非开发板所用linux 3.14内核源码,运行平台为X86。

对于一个普通的linux设备驱动模块,以下是一个经典的makefile代码,使用下面这个makefile可以完成大部分驱动的编译,使用时只需要修改一下要编译生成的驱动名称即可。只需修改obj-m的值。

ifneq($(KERNELRELEASE),)

obj-m:=hello.o

else

KDIR:=/lib/modules/$(shelluname-r)/build

PWD:=$(shellpwd)

all:

make-C$(KDIR)M=$(PWD)modules

clean:

rm-f*.ko*.o*.symvers*.cmd*.cmd.o

endif

1、makefile 中的变量

先说明以下makefile中一些变量意义:

(1)KERNELRELEASE 在linux内核源代码中的顶层makefile中有定义

(2)shell pwd取得当前工作路径

(3)shell uname -r取得当前内核的版本号

(4)KDIR 当前内核的源代码目录。

关于linux源码的目录有两个,分别为

"/lib/modules/$(shell uname -r)/build"

"/usr/src/linux-header-$(shell uname -r)/"

但如果编译过内核就会知道,usr目录下那个源代码一般是我们自己下载后解压的,而lib目录下的则是在编译时自动copy过去的,两者的文件结构完全一样,因此有时也将内核源码目录设置成/usr/src/linux-header-$(shell uname -r)/。关于内核源码目录可以根据自己的存放位置进行修改。

(5)make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules

这就是编译模块了:

a -- 首先改变目录到-C选项指定的位置(即内核源代码目录),其中保存有内核的顶层makefile;

b -- M=选项让该makefile在构造modules目标之前返回到模块源代码目录;然后,modueles目标指向obj-m变量中设定的模块;在上面的例子中,我们将该变量设置成了hello.o。

2、make 的的执行步骤

a --第一次进来的时候,宏“KERNELRELEASE”未定义,因此进入 else;

b -- 记录内核路径,记录当前路径;

由于make 后面没有目标,所以make会在Makefile中的第一个不是以.开头的目标作为默认的目标执行。默认执行all这个规则

c -- make -C $(KDIR) M=$(PWD) modules

-C 进入到内核的目录执行Makefile ,在执行的时候KERNELRELEASE就会被赋值,M=$(PWD)表示返回当前目录,再次执行makefile,modules 编译成模块的意思

所以这里实际运行的是

make -C /lib/modules/2.6.13-study/build M=/home/fs/code/1/module/hello/ modules

d -- 再次执行该makefile,KERNELRELEASE就有值了,就会执行obj-m:=hello.o

obj-m:表示把hello.o 和其他的目标文件链接成hello.ko模块文件,编译的时候还要先把hello.c编译成hello.o文件

可以看出make在这里一共调用了3次

1)-- make
2)-- linux内核源码树的顶层makedile调用,产生。o文件
3)-- linux内核源码树makefile调用,把.o文件链接成ko文件

3、编译多文件

若有多个源文件,则采用如下方法:

obj-m := hello.o

hello-objs := file1.o file2.o file3.o

三、内部编译简单说明

如果把hello模块移动到内核源代码中。例如放到/usr/src/linux/driver/中, KERNELRELEASE就有定义了。

在/usr/src/linux/Makefile中有KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)。

这时候,hello模块也不再是单独用make编译,而是在内核中用make modules进行编译,此时驱动模块便和内核编译在一起。

默认的图形界面是很简陋的界面,可以根据需要再安装GNOME或KDE桌面环境

安装X图形界面
#可查询哪些组件是否已经安装(可用来对照组件名称)

yum grouplist

#安装X图形界面系统

yum list 列出所有可安装的软件包 可以通过 yum grouplist 来查看可能批量安装哪些列表 比如 #yum groupinstall "DNS Name Server" //安装 bind 及 bind-chroot 套件

yum groupinstall "X Window System" -y
#安装GNOME桌面环境
yum groupinstall "GNOME Desktop Environment" -y
#安装KDE桌面环境
yum groupinstall "KDE (K Desktop Environment)"


卸载
卸载GNOME桌面环境
yum groupremove GNOME Desktop Environment'
卸载KDE桌面环境
yum groupremove 'K Desktop Environment'

启动X图形界面的方法
1、startx
2、设置开机自动启动,修改/etc/inittab
id:3:initdefault: ------> id:5:initdefault:
3、init 5

默认桌面环境选择
一、设置GNOME或者KDE为默认的启动桌面环境
方法1:修改/etc/sysconfig/desktop,根据需要将“DESKTOP”后面的参数设置为KDE或GNOME。
方法2:在当前用户目录下建立“.xinitrc”这个文件,文件的内容就一行startkde或gnome-session。
二、GNOME和KDE的切换
1、如果需要切换到GNOME:
#switchdesk gnome
2、如果需要切换到KDE:
#switchdesk kde
2、如果需要切换到KDE:
#startkde

图形界面与字符界面的切换
在LINUX中是有多控制台的,其中前6个是字符界面,第七个是图形界面。
如果你需要切换到字符界面,可以使用CTRL+ALT+Fn来实现,其中Fn是F1-F6中的任何一个,
当然如果你是在字符界面之间互相切换就没必要CTRL了,直接ALT Fn

5)如果在OS启动时需要启动图形化界面,则需要编辑 /etc/inittab 文件的 level 3 换成 level 5

# vi /etc/inittab

id:3:initdefault:

6)可以在 level 3 和 level 5 之间切换

# init 3

# init 5

  1. 初次接触Linux的用户
    /
    /swap

    缺点:一旦有磁盘有任何问题,根目录将整体毁灭。

  2. 初级分配方式
    /boot = 1G
    /
    /usr
    /home
    /var
    /tmp
    /swap = 2倍内存大小(如果内存较大,swap可适当减小)

    • 提示:/boot 要放在整块硬盘的最前面!(一般分区时,安装系统会主动将其置于最前方)

    • /boot 存放系统引导文件;(由于BIOS原因,boot只能在1024柱面前,否则会找不到。一般只需要100M,但是很多时候系统升级的时候,该目录下会保存旧引导文件)

    • / 根目录;
    • /usr 最庞大的目录,几乎所有应用程序、文件都在这里;
    • /home 用户主目录;
    • /var 某些大文件溢出区、cache存放、email存放;
    • /tmp 公共的临时文件;
    • /swap 虚拟内存交换区。

几种文件类型

    1. ext2/ext3:Linux 适用的文件系统类型。由于ext3文件系统多了日志的记录, 对于系统的复原比较快速,因此建议务必要选择新的ext3不要用 ext2 了。
    2. LVM:用来弹性调整文件系统容量的一种机制, 可以让你的文件系统容量变大或变小而不改变原有的档案数据内容!
    3. RAID:利用Linux操作系统的特性,用软件仿真出磁盘阵列的功能!这东西很棒!不过目前暂时还用不到!
    4. swap:只用于操作系统虚拟内存置换,无法用于挂载。
    5. vfat:如果同时存在Windows/Linux操作系统,则可以选择vfat为虚拟内存置换区。

  • 提示:一般只需要选择ext3或者swap,ext3一般也叫标准模式。

相关推荐