4.9内核 交叉编译linux
2018-01-19 14:00:35 u012134296 阅读数 1155

我使用执行make menuconfig配置内核。使用之前,先执行make mrproper,该命令会删除内核源代码中的./config文件和.o文件保证源代码的干净。

在执行make menuconfig时,这里面会涉及到几个文件夹:

Linux内核根目录下的scripts文件夹

arch/$ARCH/Kconfig文件、各层目录下的Kconfig文件

Linux内核根目录下的makefile文件、各层目录下的makefile文件


Linux内核根目录下的的.config文件、arm/$ARCH/下的config文件


Linux内核根目录下的 include/generated/autoconf.h文件

其中,scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件,无需关心。

分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。在内核编译时,主Makefile调用这个.config,就知道了用户对内核的配置情况。Kconfig就是对应着内核的配置菜单。内核源码中,了解了Kconfig、Makefile和config,就大致了解了内核代码的整个框架。

在根目录下执行make menuconfig时,系统会读取arch/$ARCH目录下的Kconfig文件生成整个配置界面选项,其中$ARCH值可有Makefile文件获得:

SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
                                  -e s/arm.*/arm/ -e s/sa110/arm/ \
                                  -e s/s390x/s390/ -e s/parisc64/parisc/ \
                                  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
                                  -e s/sh[234].*/sh/ )

所以,在服务器中进行交叉编译时,需要显式设定ARCH的值,否则ARCH会使用SUBARCH的值。

交叉编译时,需要准备好交叉编译工具链和内核的源码。我使用的是迅为的IMX6开发板,在开发板中烧写Ubuntu系统。

首先,迅为的资料中已经包含了内核源码和工具链。进入kernel-imx目录,如下图所示:


直接运行build_qt_kernel.sh脚本,即可编译内核。脚本中的内容如下:


在kernel_imx/arch/arm/boot目录下生成内核镜像。

生成的zImage和uImage都是生成的可执行内核镜像文件,2者在u-boot中启动的方式分别为go addr与bootm addr来实现启动过程(未实验过,我使用的是uImage,用的是bootm)。

 对于Linux内核,编译可以生成不同格式的映像文件,例如:
# make zImage
# make uImage

    zImage是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。另外,Linux2.4内核不支持uImage,Linux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置。

使用hexdump命令,查看uImage和zImage,如下:




2011-03-03 17:03:00 samantha_sun 阅读数 647

http://my.chinaunix.net/space.php?uid=24319701&do=blog&id=148066

 

 

 

 

  本文主要介绍适合ARM 处理器S3C2440目标板的最新版本linux 内核 linux-2.6.37.1的交叉编译。环境为:Fedora14,编译器arm-linux-4.3.2

 

1linux内核的编译过程

首先必须获得最新版本的内核,可以在ftp.kernel.org上下载我们需要的2.6.37.1版本的内核。获得相应内核包后,解压:

对于 Linux-2.6.37.1.tar.gz
tar  zxvf  Linux-2.6.37.1.tar.gz

对于 Linux-2.6.37.1.tar.bz2
tar  xjvf  Linux-2.6.37.1.tar.bz2

之后进入Linux-2.6.37.1文件夹内。:

cd linux-2.6.37.1

 

准备工作结束后,我们开始配置内核。在本机编译内核时,我们可以直接make menuconfig之类,就可根据我们机器当前内核的配置生产.config文件。但对于嵌入式当然就很困难。幸亏Linux支持上百种平台。对于不同平台都有默认的配置文件,对于我们使用的arm,可以在/arch/arm/configs文件夹下看到,我们要根据自己所使用的平台来选择。如S3C2440目标板,可以选择s3c2410_defconfig。之后只要运行
make ARCH
arm CROSS_COMPILE=arm-linux-  menuconfig

对于我们使用的两个宏ARCHCROSS_COMPILE,分别是指我们选择的体系结构(Linux在内核代码树arch文件夹中列出支持的体系结构)和交叉编译器的前缀。(当然也可以直接修改MakefileARCHCROSS_COMPILE参数)。

这里我们通过配置界面中“Load an Alternate Configuration File”加载/arch/arm/configs/s3c2410_defconfig

然后我们根据平台的特性进行相应的配置,配置完毕保存成默认配置(.config)。

之后就是编译了,对于嵌入式大多是编译成镜像文件,这里编译成zImage
make ARCH
arm CROSS_COMPILE=arm-linux-

一般而言编译好的镜像文件zImage是在 Linux-2.6.26/arch/$ARCH/boot里,本次当然是在 Linux-2.6.26/arch/arm/boot找到他了,一看居然有1.7兆这么大。怎么变小呢?关键就是在make menucnfig阶段了,这阶段才是技术要求所在。

2 、编译适应S3C2440目标板的linux内核

1)、首先linux启动过程中需要校验machine ID,因此我们修改linux内核的文件arch/arm/tools/mach-types中:

s3c2440      ARCH_S3C2440    S3C2440       1008 //1008,uboot中一致

说明:不建议直接修改arch/arm/kernel/head.S文件通过R1寄存器直接传递machine ID给内核。

修改内核文件arch/arm/plat-s3c24xx/common-smdk.c文件中Nand Flash分区。这里只创建四个分区,其他多余的分区屏蔽掉(这里的分区需要和u-boot中的分区信息一致)

static struct mtd_partition smdk_default_nand_part[] = {

   [0] = {

       .name  = "bootloader",

       .size  = 0x30000,

       .offset    = 0,

   },

   [1] = {

       .name  = "params",

       .offset = 0x30000,

       .size  = 0x10000,

   },

   [2] = {

       .name  = "kernel",

       .offset = 0x50000,

       .size  = SZ_2M,

   },

   [3] = {

       .name  = "root",

       .offset    = 0x250000,

       .size  = (0x4000000-0x2500000),

   },

};

 2)、配置内核模块的功能,有几种方式可以进行界面选择:

make menuconfig(文本选单的配置方式,在有字符终端下才能使用)

make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用)

make oldconfig(文本配置方式,在原内核配置的基础修改时使用)

这里使用make menuconfig命令。

1> [*]Enable loadable module support--->

[*]Forced module loading

[*]Module unloading

2> System Type--->

S3C2410 Machines--->

[*]SMDK2410/A9M2410选上 其余不选

S3C2440 Machines--->

[*]SMDK2440

[*]SMDK2440 with S3C2440 CPU module,其余不选

其余的Machines下选项全部不选(如2400241224422443

3> Kernel Features--->

[*]Use the ARM EABI to compile the kernel

注:如果所使用的的交叉编译arm-linux-gcc-4.3.2是符合EABI标准交叉编译器,对于浮点运行会预设硬浮点运算FPA(Float Point Architecture),而没有FPACPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制,使用EABI(Embedded Application Binary Interface)则可以对此改善处理,ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。

4> Boot options-

noinitrd root=/dev/mtdblock3 init=/linuxrc  console=ttySAC0

5> Userspace binary formats--->

[*]Kernel support for ELF binaries

其它的可以全部不选。

6> 选择支持yaffs2文件系统

Filesystem--->

Miscellaneous filesystems--->

<*>YAFFS2 file system support

[*] Lets Yaffs do its own ECC

Native language support

<*> Codepage 437 (United States,Canada)

<*>Simplified Chinese charset(GB2312)

<*>Traditional Chinese charset(Big5)

<*>NLS ISO 8859-1(Latin1:Western European Languages)

<*>NLS UTF-8

配置完成以后,我们就可以通过make ARCHarm CROSS_COMPILE=arm-linux- 命令生成我们需要的zImage镜像文件了,然后再通过mkimage工具生成可以由u-boot直接引导的uImage镜像文件了。

说明:原始的linux内核是不支持Yaffs2文件系统的,关于文件系统的支持和制作参见本博其他文章。

2016-03-29 15:31:34 sjgfmqj 阅读数 249

本文以三星S5PC100芯片为例,采用codesourcery公司出品的ARM平台交叉编译工具链,编译最新的内核源代码2.6.33。
1. 交叉编译工具链
1) 访问codesourcery官方网站下载最新的ARM交叉编译工具链,当前最新版本是arm-2009q3:
http://www.codesourcery.com/sgpp/lite/arm/portal/package5383/public/arm-none-linux-gnueabi/arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
2) 解压缩后,将其中的bin目录加入PATH环境变量
解压缩至/arm-2009q3:
# tar jxvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /
 
看看都提供了哪些工具链:
# ls -1 /arm-2009q3/bin/
arm-none-linux-gnueabi-addr2line
arm-none-linux-gnueabi-ar
arm-none-linux-gnueabi-as
arm-none-linux-gnueabi-c++
arm-none-linux-gnueabi-c++filt
arm-none-linux-gnueabi-cpp
arm-none-linux-gnueabi-g++
arm-none-linux-gnueabi-gcc
arm-none-linux-gnueabi-gcc-4.4.1
arm-none-linux-gnueabi-gcov
arm-none-linux-gnueabi-gdb
arm-none-linux-gnueabi-gdbtui
arm-none-linux-gnueabi-gprof
arm-none-linux-gnueabi-ld
arm-none-linux-gnueabi-nm
arm-none-linux-gnueabi-objcopy
arm-none-linux-gnueabi-objdump
arm-none-linux-gnueabi-ranlib
arm-none-linux-gnueabi-readelf
arm-none-linux-gnueabi-size
arm-none-linux-gnueabi-sprite
arm-none-linux-gnueabi-strings
arm-none-linux-gnueabi-strip
 
将bin目录加入环境变量:
# export PATH=/arm-2009q3/bin:$PATH
 
2. 内核源代码
1) 下载最新的内核源代码
可以到kernel.org下载已经打包的内核源码文件,我这里是通过git下载的:
# git clone http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
 
2) 修改源码根目录下的Makefile:
针对ARM交叉编译,需要修改两个变量:
ARCH            ?= arm
CROSS_COMPILE   ?= arm-none-linux-gnueabi-
 
3) 查看下目录结构
# ls -1 /linux-2.6/arch/arm/
Kconfig
Kconfig-nommu
Makefile
boot/
common/
configs/
include/
kernel/
lib/
......
mach-s3c6410/
mach-s5pc100/
mach-s5pv210/
......
mm/
plat-s3c64xx/
plat-s5pc1xx/
......

这里面包含了流行的ARM芯片支持,其中的“mach-s5pc100”就是我们需要编译的目标平台。
目录“configs”包含了各个ARM芯片的默认config文件:
# ls -1 /linux-2.6/arch/arm/configs/
......
s3c2410_defconfig
s3c6400_defconfig
s5pc100_defconfig
s5pc110_defconfig
s5pv210_defconfig
......
 
3. 编译过程
1) 准备.config文件
# cp -f /linux-2.6/arch/arm/configs/s5pc110_defconfig /linux-2.6/.config
 
2) 配置选项
# cd /linux-2.6/
# make menuconfig
 
3) 开始编译
# make
......
LD      arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready  #zImage就是压缩过的内核。
 
# file arch/arm/boot/compressed/vmlinux
vmlinux: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
 
4. 安装新内核
# cp vmlinux ${TESTROOTFS}/boot/vmlinux-2.6.33
# cp System.map ${TESTROOTFS}/boot/System.map-2.6.33
# cp .config ${TESTROOTFS}/boot/config-2.6.33
# make INSTALL_MOD_PATH=${TESTROOTFS} modules_install
 
5. 驱动编译
demo.c:
#include 
#include 
static int demo_init(void){
 printk("demo init\n");
 return 0;
}
static void demo_exit(void){
 printk("demo exit\n");
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("Dual BSD/GPL");
 
Makefile:
.PHONY: clean
obj-m := mod_template.o
#KDIR  := /lib/modules/$(shell uname -r)/build
KDIR  := /linux-2.6
PWD   := $(shell pwd)
default:
 $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
 rm -rf *.ko *.o *.mod.* .H* .tm* .*cmd Module.symvers
 
6. 本文链接
http://blog.chinaunix.net/uid-105044-id-2952232.html
http://blog.chinaunix.net/uid-8698570-id-1763149.html
2013-08-21 13:43:25 bugouyonggan 阅读数 700

Linux 2.6.37.1内核的交叉编译

转自

http://my.chinaunix.net/space.php?uid=24319701&do=blog&id=148066

本文主要介绍适合ARM 处理器S3C2440目标板的最新版本linux 内核 linux-2.6.37.1的交叉编译。环境为:Fedora14,编译器arm-linux-4.3.2

 

1、linux内核的编译过程

首先必须获得最新版本的内核,可以在ftp.kernel.org上下载我们需要的2.6.37.1版本的内核。获得相应内核包后,解压:

对于 Linux-2.6.37.1.tar.gz为
tar  zxvf  Linux-2.6.37.1.tar.gz 

对于 Linux-2.6.37.1.tar.bz2为
tar  xjvf  Linux-2.6.37.1.tar.bz2 

之后进入Linux-2.6.37.1文件夹内。:

cd linux-2.6.37.1

 

准备工作结束后,我们开始配置内核。在本机编译内核时,我们可以直接make menuconfig之类,就可根据我们机器当前内核的配置生产.config文件。但对于嵌入式当然就很困难。幸亏Linux支持上百种平台。对于不同平台都有默认的配置文件,对于我们使用的arm,可以在/arch/arm/configs文件夹下看到,我们要根据自己所使用的平台来选择。如S3C2440目标板,可以选择s3c2410_defconfig。之后只要运行
make ARCH=arm CROSS_COMPILE=arm-linux-  menuconfig

对于我们使用的两个宏ARCH和CROSS_COMPILE,分别是指我们选择的体系结构(Linux在内核代码树arch文件夹中列出支持的体系结构)和交叉编译器的前缀。(当然也可以直接修改Makefile中ARCH和CROSS_COMPILE参数)。

这里我们通过配置界面中“Load an Alternate Configuration File”加载/arch/arm/configs/s3c2410_defconfig

然后我们根据平台的特性进行相应的配置,配置完毕保存成默认配置(.config)。

之后就是编译了,对于嵌入式大多是编译成镜像文件,这里编译成zImage
make ARCH=arm CROSS_COMPILE=arm-linux-

一般而言编译好的镜像文件zImage是在 Linux-2.6.26/arch/$ARCH/boot里,本次当然是在 Linux-2.6.26/arch/arm/boot找到他了,一看居然有1.7兆这么大。怎么变小呢?关键就是在make menucnfig阶段了,这阶段才是技术要求所在。 

、编译适应S3C2440目标板的linux内核

1)、首先linux启动过程中需要校验machine ID,因此我们修改linux内核的文件arch/arm/tools/mach-types中:

s3c2440      ARCH_S3C2440    S3C2440       1008 //1008,与uboot中一致

说明:不建议直接修改arch/arm/kernel/head.S文件通过R1寄存器直接传递machine ID给内核。

修改内核文件arch/arm/plat-s3c24xx/common-smdk.c文件中Nand Flash分区。这里只创建四个分区,其他多余的分区屏蔽掉(这里的分区需要和u-boot中的分区信息一致)

static struct mtd_partition smdk_default_nand_part[] = {

   [0] = {

       .name  = "bootloader",

       .size  = 0x30000,

       .offset    = 0,

   },

   [1] = {

       .name  = "params",

       .offset = 0x30000,

       .size  = 0x10000,

   },

   [2] = {

       .name  = "kernel",

       .offset = 0x50000,

       .size  = SZ_2M,

   },

   [3] = {

       .name  = "root",

       .offset    = 0x250000,

       .size  = (0x4000000-0x2500000),

   },

};

 2)、配置内核模块的功能,有几种方式可以进行界面选择:

make menuconfig(文本选单的配置方式,在有字符终端下才能使用)

make xconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用)

make oldconfig(文本配置方式,在原内核配置的基础修改时使用)

这里使用make menuconfig命令。

 

1> [*]Enable loadable module support--->

[*]Forced module loading

[*]Module unloading

2> System Type--->

S3C2410 Machines--->

[*]SMDK2410/A9M2410选上 其余不选

S3C2440 Machines--->

[*]SMDK2440

[*]SMDK2440 with S3C2440 CPU module,其余不选

其余的Machines下选项全部不选(如2400,2412,2442,2443)

3> Kernel Features--->

[*]Use the ARM EABI to compile the kernel

注:如果所使用的的交叉编译arm-linux-gcc-4.3.2是符合EABI标准交叉编译器,对于浮点运行会预设硬浮点运算FPA(Float Point Architecture),而没有FPA的CPU,比如SAMSUNG S3C2410/S3C2440,会使用FPE(Float Point Emulation 即软浮点),这样在速度上就会遇到极大的限制,使用EABI(Embedded Application Binary Interface)则可以对此改善处理,ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序。

4> Boot options-

noinitrd root=/dev/mtdblock3 init=/linuxrc  console=ttySAC0

5> Userspace binary formats--->

[*]Kernel support for ELF binaries

其它的可以全部不选。

6> 选择支持yaffs2文件系统

Filesystem--->

Miscellaneous filesystems--->

<*>YAFFS2 file system support

[*] Lets Yaffs do its own ECC

Native language support

<*> Codepage 437 (United States,Canada)

<*>Simplified Chinese charset(GB2312)

<*>Traditional Chinese charset(Big5)

<*>NLS ISO 8859-1(Latin1:Western European Languages)

<*>NLS UTF-8

配置完成以后,我们就可以通过make ARCH=arm CROSS_COMPILE=arm-linux- 命令生成我们需要的zImage镜像文件了,然后再通过mkimage工具生成可以由u-boot直接引导的uImage镜像文件了。

说明:原始的linux内核是不支持Yaffs2文件系统的,关于文件系统的支持和制作参见本博其他文章。


1.从Kernel.org下载Linux最新版内存,我下载的是 2.6.35.7 。

 

首先是要构建.config文件,因为是交叉编译用于ARM的内核,所以先加载默认.config文件

$make at91sam9260ek_defconfig #加载默认的.config

 

然后进入menuconfig,修改设置 General steup  --->  Cross-compiler tool prefix 值为: (arm-linux-)

注:括号内的值

 

双击ESC退出,注意保存。

 

$make  #编译


2011-12-11 00:01:06 junllee 阅读数 5650
交叉编译Linux内核for ARM
本文以三星S5PC100芯片为例,采用codesourcery公司出品的ARM平台交叉编译工具链,编译最新的内核源代码2.6.33。
1. 交叉编译工具链
1) 访问codesourcery官方网站下载最新的ARM交叉编译工具链,当前最新版本是arm-2009q3:
http://www.codesourcery.com/sgpp/lite/arm/portal/package5383/public/arm-none-linux-gnueabi/arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
2) 解压缩后,将其中的bin目录加入PATH环境变量
解压缩至/arm-2009q3:
# tar jxvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /
 
看看都提供了哪些工具链:
# ls -1 /arm-2009q3/bin/
arm-none-linux-gnueabi-addr2line
arm-none-linux-gnueabi-ar
arm-none-linux-gnueabi-as
arm-none-linux-gnueabi-c++
arm-none-linux-gnueabi-c++filt
arm-none-linux-gnueabi-cpp
arm-none-linux-gnueabi-g++
arm-none-linux-gnueabi-gcc
arm-none-linux-gnueabi-gcc-4.4.1
arm-none-linux-gnueabi-gcov
arm-none-linux-gnueabi-gdb
arm-none-linux-gnueabi-gdbtui
arm-none-linux-gnueabi-gprof
arm-none-linux-gnueabi-ld
arm-none-linux-gnueabi-nm
arm-none-linux-gnueabi-objcopy
arm-none-linux-gnueabi-objdump
arm-none-linux-gnueabi-ranlib
arm-none-linux-gnueabi-readelf
arm-none-linux-gnueabi-size
arm-none-linux-gnueabi-sprite
arm-none-linux-gnueabi-strings
arm-none-linux-gnueabi-strip
 
将bin目录加入环境变量:
# export PATH=/arm-2009q3/bin:$PATH
 
2. 内核源代码
1) 下载最新的内核源代码
可以到kernel.org下载已经打包的内核源码文件,我这里是通过git下载的:
# git clone http://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
 
2) 修改源码根目录下的Makefile:
针对ARM交叉编译,需要修改两个变量:
ARCH            ?= arm
CROSS_COMPILE   ?= arm-none-linux-gnueabi-
 
3) 查看下目录结构
# ls -1 /linux-2.6/arch/arm/
Kconfig
Kconfig-nommu
Makefile
boot/
common/
configs/
include/
kernel/
lib/
......
mach-s3c6410/
mach-s5pc100/
mach-s5pv210/
......
mm/
plat-s3c64xx/
plat-s5pc1xx/
......

这里面包含了流行的ARM芯片支持,其中的“mach-s5pc100”就是我们需要编译的目标平台。
目录“configs”包含了各个ARM芯片的默认config文件:
# ls -1 /linux-2.6/arch/arm/configs/
......
s3c2410_defconfig
s3c6400_defconfig
s5pc100_defconfig
s5pc110_defconfig
s5pv210_defconfig
......
 
3. 编译过程
1) 准备.config文件
# cp -f /linux-2.6/arch/arm/configs/s5pc110_defconfig /linux-2.6/.config
 
2) 配置选项
# cd /linux-2.6/
# make menuconfig
 
3) 开始编译
# make
......
LD      arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready  #zImage就是压缩过的内核。
 
# file arch/arm/boot/compressed/vmlinux
vmlinux: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
 
4. 安装新内核
# cp vmlinux ${TESTROOTFS}/boot/vmlinux-2.6.33
# cp System.map ${TESTROOTFS}/boot/System.map-2.6.33
# cp .config ${TESTROOTFS}/boot/config-2.6.33
# make INSTALL_MOD_PATH=${TESTROOTFS} modules_install
 
5. 驱动编译
demo.c:
#include <linux/kernel.h>
#include <linux/module.h>
static int demo_init(void){
 printk("demo init\n");
 return 0;
}
static void demo_exit(void){
 printk("demo exit\n");
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("Dual BSD/GPL");
 
Makefile:
.PHONY: clean
obj-m := mod_template.o
#KDIR  := /lib/modules/$(shell uname -r)/build
KDIR  := /linux-2.6
PWD   := $(shell pwd)
default:
 $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
 rm -rf *.ko *.o *.mod.* .H* .tm* .*cmd Module.symvers
 
6. 本文链接
没有更多推荐了,返回首页