当前位置:文档之家› linux下编写c源程序并编译运行

linux下编写c源程序并编译运行

linux下编写c源程序并编译运行
linux下编写c源程序并编译运行

实验二Linux基本操作

编写c源程序并用编译运行

【需求】

◆在当前目录下创建新文件t.c,用vi编辑器一段简单代码,代码要求在屏幕上输出

文字“Hello Linux!”;

◆用gcc编译t.c文件,并运行,查看输出结果,若结果错误,请根据提示修改;【系统及软件环境】

操作系统:Virtualbox,Fedora 13

【实验配置文件及命令】

1.配置文件:

2.命令:touch、rpm、gcc、./等

ls |grep gcc

可返回四个结果:

gcc-4.4.4-2.fc13.i686.rpm

gcc-c++-4.4.4-2.fc13.i686.rpm

gcc-gfortran-4.4.4-2.fc13.i686.rpm

libgcc-4.4.4-2.fc13.i686.rpm

其中“gcc-4.4.4-2.fc13.i686.rpm”就是我们所需要的安装包

(6)安装RPM包

【语法】rpm –ivh RPM包文件名称

即:rpm –ivh gcc-4.4.4-2.fc13.i686.rpm(此处可用tab键自动补全,即rpm –ivh gcc-4

★此时提示错误

cloog-ppl >=0.15 is needed by gcc-4.4.4-2.fc13.i686.rpm

cpp = 4.4.4-2.fc13 is needed by gcc-4.4.4-2.fc13.i686.rpm

glibc-devel >= 2.2.90-12 is needed by gcc-4.4.4-2.fc13.i686.rpm 【原因】RPM安装包相互之间有依赖关系,需要安装依赖软件包,一共需要6个安装包,分别是kernel-headers、glibc-headers、glibc-devel、cpp、cloog-ppl 和gcc

则实际安装顺序为:

i)rpm –ivh kernel-headers-2.6.33.3-85.fc13.i686.rpm

ii)rpm –ivh glibc-headers-2.12-1.i686.rpm

iii)rpm –ivh glibc-devel-2.12-1.i686.rpm

iv)rpm –ivh cpp-4.4.4-2.fc13.i686.rpm

v)rpm –ivh --nodeps cloog-ppl-0.15.7-1.fc12.i686.rpm

vi)rpm –ivh gcc-4.4.4-2.fc13.i686.rpm

【注意】

①安装过程中“RPM包文件名称”注意用“tab”键减少输入

②第“v”步安装cloog-ppl时,需带上参数“--nodeps”,因为安装此文

件时所需要的关联文件不必安装,所以用参数“--nodeps”可跳过关联检测,强制安装。

6 安装完成后,返回创建t.c 文件的test目录。

使用gcc t.c 命令来对文件进行编译。编译完成后利用ls -l 命令查看生成的文件a.out 或者通过参数“gcc t.c -o a”指定编译后的文件名称为a

7 执行程序:./a.out 即可看到程序执行结果。

8 此时屏幕上会显示:Hello Linux!的字样。至此,软件的安装,程序的编写,执行已经结束。

【实验故障与分析】

下面的表格中列出了在实验过程中可能会出现的故障及其解决方法。看看是不是对你的实验有所帮助?如果你在实验中还遇到了其他的问题或故障,不妨记录在表格中,通过

【启发联想】

(注:文档可能无法思考全面,请浏览后下载,供参考。可复制、编制,期待你的好评与关注)

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转) linux是如何组成的? 答:linux是由用户空间和内核空间组成的 为什么要划分用户空间和内核空间? 答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的 安全性,比如X86可以有4种模式RING0~RING3 RING0特权模式给LINUX内核空间RING3给用户空间 linux内核是如何组成的? 答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、 VFS(Virtual File Systerm)虚拟文件系统、NS(Network Stack)网络协议栈、DD(Device Drivers)设备驱动 linux 内核源代码 linux内核源代码是如何组成或目录结构? 答:arc目录存放一些与CPU体系结构相关的代码其中第个CPU子目录以分解boot,mm,kerner等子目录 block目录部分块设备驱动代码 crypto目录加密、压缩、CRC校验算法 documentation 内核文档 drivers 设备驱动 fs 存放各种文件系统的实现代码 include 内核所需要的头文件。与平台无关的头文件入在include/linux子目录下,与平台相关的头文件则放在相应的子目录中 init 内核初始化代码 ipc 进程间通信的实现代码 kernel Linux大多数关键的核心功能者是在这个目录实现(程序调度,进程控制,模块化) lib 库文件代码 mm 与平台无关的内存管理,与平台相关的放在相应的arch/CPU目录net 各种网络协议的实现代码,注意而不是驱动 samples 内核编程的范例 scripts 配置内核的脚本 security SElinux的模块 sound 音频设备的驱动程序 usr cpip命令实现程序 virt 内核虚拟机 内核配置与编译 一、清除 make clean 删除编译文件但保留配置文件

linux内核配置模块编译安装

Linux内核配置编译和加载 Linux内核模块 Linux内核结构非常庞大,包含的组件也非常多,想要把我们需要的部分添加到内核中,有两个方法:直接编译进内核和模块机制 由于直接编译进内核有两个缺点,一是生成的内核过大,二是每次修改内核中功能,就必须重新编译内核,浪费时间。因此我们一般采用模块机制,模块本身不被编译进内核映像,只有在加载之后才会成为内核的一部分,方便了修改调试,节省了编译时间。 配置内核 (1)在drivers目录下创建hello目录存放hello.c源文件 (2)在hello目录下新建Makefile文件和Kconfig文件 Makefile文件内容: obj-y += hello.o //要将hello.c编译得到的hello.o连接进内核 Kconfig文件内容: 允许编译成模块,因此使用了tristate (3)在hello目录的上级目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项 修改即driver目录下的Kconfig文件,添加

source "drivers/hello/Kconfig" //使hello目录下的Kconfig起作用 (4)在hello目录的上级目录的Makefile文件中增加对新源代码的编译条目 修改driver目录下的Makefile文件,添加 obj-$(CONFIG_HELLO_FOR_TEST) += hello/ //使能够被编译命令作用到 (5)命令行输入“make menuconfig”,找到driver device,选择select,发现test menu 已经在配置菜单界面显示出来 (6)选择test menu进入具体的配置,可以选择Y/N/M,这里我选择编译为M,即模块化 (7)保存退出后出现 (8)进入kernels目录中使用“ls -a”查看隐藏文件,发现多出.config隐藏文件,查看.config 文件

linux2.6内核的编译步骤及模块的动态加载-内核源码学习-linux论坛

[原创]linux2.6内核的编译步骤及模块的动态加载-内核源码 学习-linux论坛 05年本科毕业设计做的是Linux下驱动的剖析,当时就买了一本《Linux设备驱动程序(第二版)》,但是没有实现将最简单的helloworld程 序编译成模块,加载到kernel里。不过,现在自己确实打算做一款芯片的Linux的驱动,因此,又开始看了《Linux设备驱动程序》这本书,不过已 经是第三版了。第二版讲的是2.4的内核,第三版讲的是2.6的内核。两个内核版本之间关于编译内核以及加载模块的方法都有所变化。本文是基于2.6的内核,也建议各位可以先看一下《Linux内核设计与实现(第二版)》作为一个基础知识的铺垫。当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块。个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.20-1-686.第一步,下载Linux内核的源代码,即构建LDD3(Linux Device Drivers 3rd)上面所说的内核树。 如过安装的Linux系统中已经自带了源代码的话,应该在/usr/src目录下。如果该目录为空的话,则需要自己手动下载源代码。下载代码的方法和链接很多,也可以在CU上通过

https://www.doczj.com/doc/bd10301299.html,/search/?key=&;q=kernel&a mp;frmid=53去下载。不过,下载的内核版本最好和所运行的Linux系统的内核版本一致。当然,也可以比Linux系统内核的版本低,但高的话应该不行(个人尚未实践)。 Debian下可以很方便的通过Debian源下载: 首先查找一下可下载的内核源代码: # apt-cache search linux-source 其中显示的有:linux-source-2.6.20,没有和我的内核版本完全匹配,不过也没关系,直接下载就可以了: # apt-get install linux-source-2.6.20 下载完成后,安装在/usr/src下,文件名为: linux-source-2.6.20.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码: # tar jxvf linux-source-2.6.20.tar.bz2

linux设备驱动程序的hello模块编译过程

linux设备驱动程序的hello模块编译过程 今天把linux设备驱动程序(第三版)的第一个模块hello模块编译通过了,这个东西卡了我好长时间了,期间我又花了很多时间去看linux程序设计(第二版),终于今天机械性地完成了这个试验。 编译环境:虚拟机linux2.6.18内核,(如果内核不是2.6的,可以参考我的内核升级过程,另外一篇文章有详细记录) 源程序hello.c: ///////////////////////////////////////////////////////////////////// /////// #include #include #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) //有的上面定义的是init_modules(void)是通不过编译的 { printk(KERN_ALERT "Hello, world\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, world\n"); } module_init(hello_init); module_exit(hello_exit); ///////////////////////////////////////////////////////////////////// /// Makefile的内容: ifneq ($(KERNELRELEASE),) obj-m := hello.o else KDIR:=/lib/modules/$(shell uname -r)/build PWD:=$(shell pwd)

linux 模块编译步骤(详解)

MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "hello,I am edsionte/n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "goodbye,kernel/n"); } module_init(hello_init); module_exit(hello_exit); // 可选 MODULE_AUTHOR("Tiger-John"); MODULE_DESCRIPTION("This is a simple example!/n"); MODULE_ALIAS("A simplest example"); Tiger-John说明: 1.> 相信只要是学过 C 语言的同学对第一个程序都是没有问题的。但是也许大家看了第二个程序就有些不明白了。 可能有人会说: Tiger 哥你没疯吧,怎么会把 printf() 这么简单的函数错写成了 printk() 呢。 也有的人突然想起当年在大学学 C 编程时,老师告诉我们“一个 C 程序必须要有 main() 函数,并且系统会首先进入 main() 函数执行 " ,那么你的程序怎么没有 main() 函数呢?没有 main() 函数程序是怎么执行的呢?

可能也会有更仔细的人会发现:怎么两个程序头文件不一样呢?不是要用到输入和输出函数时,一定要用到 这个头文件,你怎么没有呢? -------------------------------------------------------------------------------------------- Tiger 哥很淡定的告诉大家其实第二个程序是正确的,现在我们就来看看到底如何来编写一个内核模块程序。 2. 内核模块编程的具体实现 第一步:首先我们来看一下程序的头文件 #include #include #include 这三个头文件是编写内核模块程序所必须的 3 个头文件。 Tiger-John 说明: 1> 由于内核编程和用户层编程所用的库函数不一样,所以它的头文件也和我们在用户层编写程序时所用的头文件也不一样。 2> 我们在来看看在 L inux 中又是在那块存放它们的头文件 a. 内核头文件的位置: /usr/src/linux-2.6.x/include/ b. 用户层头文件的位置 : /usr/include/ 现在我们就明白了。其实我们在编写内核模块程序时所用的头文件和系统函数都和用层编程时所用的头文件和系统函数是不同的。 第二步:编写内核模块时必须要有的两个函数 : 1> 加载函数: static int init_fun(void)

Linux 2.6内核 模块编译 Makefile

编译模块的make file 必须是Makefile,不能是makefile. //why? ifneq ($(KERNELRELEASE),) obj-m := mytest.o mytest-objs := file1.o file2.o file3.o else KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) M=$(PWD) modules endif 解释为: KERNELRELEASE 是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义, 所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去 解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。mytest-objs := file1.o file2.o file3.o表示mytest.o 由file1.o,file2.o与file3.o 连接生成。obj-m := mytest.o表示编译连接后将生成mytest.o模块。 ---------------------------------------------------------------------- 另外转载:

linux模块编译

linux 模块编译步骤(原) 本文将直接了当的带你进入linux的模块编译。当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂。之所以要写这篇文章,主要是因为从书本上学的话,可能要花更长的时间才能学会整个过程,因为看书的话是一个学习过程,而我这篇文章更像是一个培训。所以实践性和总结性更强。通过本文你将会学到编译一个模块和模块makefile的基本知识。以及加载(卸载)模块,查看系统消息的一些知识; 声明:本文为初学者所写,如果你已经是一个linux模块编译高手,还请指正我文章中的错误和不足,谢谢 第一步:准备源代码 首先我们还是要来编写一个符合linux格式的模块文件,这样我们才能开始我们的模块编译。假设我们有一个源文件mymod.c。它的源码如下: mymodules.c 1. #include /* 引入与模块相关的宏*/ 2. #include /* 引入module_init() module_exit()函数*/ 3. #include /* 引入module_param() */ 4 5. MODULE_AUTHOR("Yu Qiang"); 6. MODULE_LICENSE("GPL"); 7 8. static int nbr = 10; 9. module_param(nbr, int, S_IRUGO); 10. 11. static int __init yuer_init(void) 12.{ 13. int i; 14. for(i=0; i

Linux编译选项详解

linux内核编译选项详解(一):General setup 空间中有一些有关编译出错的信息 [*]Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.你应该选择它,因为有许多设备可能必需选择这个选项才能进行配置,实际上它是安全的。这个选项同样会让一些老的驱动的可用。如果你选了Y,你将会得到更多的阿尔法版本的驱动和代码的配置菜单。 ()Local version – append to kernel release 在内核版本后面加上自定义的版本字符串(小于64字符),可以用‖uname -a‖命令看到 [ ]Automatically append version information to the version string 自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。这需要Perl的支持。由于在编译的命令make-kpkg 中我们会加入- – append-to-version 选项来生成自定义版本,所以这里选N。 Kernel compression mode (Gzip) 内核压缩模式选baip2 ?gzip用于UNIX系统的文件压缩。后缀为.gz的文件。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP 编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用 GZIP压缩技术来让用户感受更快的速度。 ?bzip2是一个基于Burrows- Wheeler 变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩算法来得好。它是一款免费软件。bzip2能够进行高质量的数据 压缩。它利用先进的压缩技术,能够把普通的数据文件压缩10%至15%,压缩 的速度和解压的效率都非常高!支持现在大多数压缩格式,包括tar、gzip 等等。 ?lzma是一个Deflate和LZ77算法改良和优化后的压缩算法,开发者是Igor Pavlov,2001年被首次应用于7-Zip压缩工具中,是2001年以来得到发展的 一个数据压缩算法。它使用类似于LZ77 的字典编码机制,在一般的情况 [*] Support for paging of anonymous memory (swap) 将使你的内核支持虚拟内存。这个虚拟内存在LINUX中就是SWAP分区。除非你不想要SWAP分区,否则这里必选Y。

在linux下如何编译c程序

在linux下如何编译C++程序 一、GCC(GNUCompilerCollection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活。它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada g++是GCC中的一个工具,专门来编译C++语言的。 GCC的参数有:(也是分步实现) -E让GCC在预处理结束后停止编译g++ -E hello.cpp-ohello.i -c将hello.i编译成目标代码g++-chello.i-ohello.o 将目标文件连接成可执行文件g++ hell.o-ohello 可以一步实现g++hello.cpp-ohello 二、假如有两个以上源文件应该一下编译。 一步就实现g++foo1.cppfoo2.cpp-ofoo 也可以分步实现g++-cfoo1.cpp-ofoo1.o g++-cfoo2.cpp-ofoo2.o g++foo1.ofoo2.o-ofoo 三、GCC一些常用选项 1、产生警告信息的选项大多数以-W开头其中有-Wall g++-Wallhello.cpp-ohello 2、将所有的警告当成错误的选项-Werror g++ -Werrorhello.cpp-ohello 3、寻找头文件选项-I(linux默认路径:头文件在/usr/include/下),不在这个路径下就要用-I指定。

gccfoo.cpp-I/home/include-ofoo 4、库依赖选项-L(linux默认路径:库文件在/usr/lib/下),不在这个路径下就要用-L指定。 g++foo.cpp-L/home/lib-lfoo-ofoo 库就是将源文件编译之后生成的目标文件的集合。 库命名以lib开头。 库有静态库(通常以.a结尾)和动态库(通常以.so结尾) 默认情况下,g++以动态库形式连接。如果要静态库连接则要用-static指定(g++ foo.cpp-L/home/lib-static-lfoo-ofoo) 5、优化选项-On(n取0到3之间) 四、介绍一些GNU二进制链工具 1、ar命令(也称为工具)可以用来编译成静态库 ar[-] {操作选项} {任选项} [成员名] [count] archive files.... arrvlibtest.ahello.ohello1.o生成一个库名为test,该库中存放了hello.o和hello1.o这两个模块。 操作项:d(删除)、m(移动)、p(标准输出)、q(快速追加)、r(在库中插入模块)、t(显示库的模块清单)、x(从库中提取一个成员)。 任选项:a(成员后面添加一个新文件)、b(成员前面添加一个新文件)、c(创建一个库)、f(截短指定名字)、v(显示执行操作选项的附加信息)。澳门新濠天地https://www.doczj.com/doc/bd10301299.html,2、编译成动态库 分步完成:gcc-fPIC-cfunc.cpp-ofunc.o gcc -shared-olibfunc.sofunc.o 一步就完成:gcc -fPIC-shared -o libfunc.sofunc.cpp

内核模块编译总结

Modules在编译的时候会遇到下列问题: 1.首先是要加载内核存放的路径,同时,在编译modules之前要先区内核所在的目录下执 行make modules_prepare。 2.如果模块在编译过程中出现没有定义的变量(编译过程中显示*.*undefined!)警告时, 这样编译出来的ko在最后插入时候将报以下错误(unknown symbol,can’t insert) 3.第二个是不同的ko insmod有个先后的顺序,依赖其它模块的ko最后插入,被依赖的 模块在最前面插入。 4.最后看一下编译一个模块所用的makefile文件: INCLUDE := $(PWD)/ ifneq ($(KERNELRELEASE),) EXTRA_CFLAGS += -I$(INCLUDE) EXTRA_CFLAGS += -march=ba2 obj-m += ec_ap.o ec_ap-objs := ec_ap.o ec_ap_core.o ec_ap_diag.o else PWD := $(shell pwd) KDIR := /home/share/Develop/code/linux/kernel/linux-2.6.29 all: make -C $(KDIR) M=$(PWD) modules .PHONY clean: make -C $(KDIR) M=$(PWD) clean -rm -f *.o *.ko *.mod.c modules.order Module.symvers Endif #KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile 时,#KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。#obj-m :=ec_ap.o表示编译连接后将生成ec_ap.o模块。 #ec_ap-objs := ec_ap.o ec_ap_core.o ec_ap_diag.o表示ec_ap.o 由ec_ap.o与ec_ap_core.o ec_ap_diag.o连接生成。如果有多个依赖文件文件,需要把这一句加上 #PWD := $(shell pwd) 执行shell命令,把当前路径赋值给PWD

如何编译Linux内核

内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。本文将以RedHat Linux 6.0(kernel 2.2.5)为操作系统平台,介绍在Linux上进行内核编译的方法。 一、下载新内核的源代码 目前,在Internet上提供Linux源代码的站点有很多,读者可以选择一个速度较快的站点下载。笔者是从站点https://www.doczj.com/doc/bd10301299.html,上下载了Linux的最新开发版内核2.3.14的源代码,全部代码被压缩到一个名叫Linux-2.3.14.tar.gz的文件中。 二、释放内核源代码 由于源代码放在一个压缩文件中,因此在配置内核之前,要先将源代码释放到指定的目录下。首先以root帐号登录,然后进入/usr/src子目录。如果用户在安装Linux时,安装了内核的源代码,则会发现一个linux-2.2.5的子目录。该目录下存放着内核2.2.5的源代码。此外,还会发现一个指向该目录的链接linux。删除该连接,然后将新内核的源文件拷贝到/usr/src目录中。 (一)、用tar命令释放内核源代码 # cd /usr/src # tar zxvf Linux-2.3.14.tar.gz 文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包含了内核2.3.14的全部源代码。 (二)、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到 /usr/src/linux/include目录下的对应目录中。 # cd /usr/include # rm -Rf asm linux # ln -s /usr/src/linux/include/asm-i386 asm # ln -s /usr/src/linux/include/linux linux # ln -s /usr/src/linux/include/scsi scsi (三)、删除源代码目录中残留的.o文件和其它从属文件。

核心板linux内核及驱动模块编译步骤

核心板linux内核编译及驱动模块编译步骤 一、内核编译: 1,拷贝开发板linux系统源代码(linux-2.6.30)到ubuntu的任意位置,打开终端,进入linux-2.6.30目录,输入命令:cp arch/arm/configs/sbc6045_defconfig .config 回车 2,输入命令:make menuconfig 回车,若提示以下界面 *** Unable to find the ncurses libraries or the *** required header files. *** 'make menuconfig' requires the ncurses libraries. *** *** Install ncurses (ncurses-devel) and try again. *** 输入命令:sudo apt-get install libncurses5-dev 回车,安装ncurses 3,安装完成后,输入命令:make menuconfig 回车,进入配置选项界面,按需修改,目前未修改。 4,输入命令:make uImage 回车,若提示Can't use 'defined(@array)',修改kernel/timeconst.pl 文件中 373行,if (!defined(@val))改为if (!@val) ,重新执行make uImage命令。 二、驱动模块编译(若从未编译过内核,需要先编译内核): 1,将编写好到源文件(如:cgc-pio.c)拷贝到linux-2.6.30/drivers/char/目录 2,修改linux-2.6.30/drivers/char/目录下到Makefile文件,增加一行,内容为:obj-m += xxx.o,如:obj-m += cgc-pio.o 3,打开linux终端,进入linux-2.6.30目录,输入命令:make modules 回车,完成后在linux-2.6.30/drivers/char/目录下会产生对应到.ko文件(如:cgc-pio.ko)。

如何编译linux驱动模块

首先,我们要了解一下模块是如何别被构造的。模块的构造过程与用户空间的应用程序的构造过程有显著不同;内核是一个大的、独立的程序,对于它的各个部分如何组合在一起有详细的明确的要求。Linux2.6内核的构造过程也与以前版本的内核构造过程不同;新的构造系统用起来更加简单,并且可产生更加正确的结果,但是它看起来和先前的方法有很大不同。内核的构造系统非常复杂,我们所看到的只是它的一小部分。如果读者想了解更深入的细节,则应阅读在内核源码中的Document/kbuild目录下的文件。 在构造内核模块之前,有一些先决条件首先应该得到满足。首先,读者要保证你有适合于你的内核版本的编译器、模块工具,以及其他必要工具。在内核文档目录下的文件Documentation/Changes里列出了需要的工具版本;在开始构造内核前,读者有必要查看该文件,并确保已安装了正确的工具。如果用错误的工具版本来构造一个内核(及其模块),可能导致许多奇怪的问题。另外也要注意,使用太新版本的编译器偶尔可能也会导致问题。 一旦做好了上面的准备工作之后,其实给自己的模块创建一个makefile则非常简单。实际上,对于本章前面展示的" hello world"例子,下面一行就够了: obj-m := hello.o 如果读者熟悉make,但是对Linux2.6内核构造系统不熟悉的话,可能奇怪这个makefile如何工作。毕竟上面的这一行不是一个传统的makefile的样子。问题的答案当然是内核构造系统处理了余下的工作。上面的赋值语句(它利用了由GNU make提供的扩展语法)说明有一个模块要从目标文件hello.o构造,而从该目标文件构造的模块名称为hello.ko. 如果我们想由两个源文件(比如file1.c和file2.c )构造出一个名称为module.ko的模块,则正确的makefile可如下编写: obj-m := module.o module-objs := file1.o file2.o 为了让上面这种类型的makefile文件正常工作,必须在大的内核构造系统环境中调用他们。假设读者的内核源码数位于~/kernel-2.6目录,用来建立你的模块的make命令(在包含模块源代码和makefile的目录下键入)应该是: make -C ~/kernel-2.6 M=`pwd` modules 这个命令首先是改变目录到用-C选项指定的位置(即内核源代码目录),其中保存有内核的顶层makefile文件。这个M=选项使makefile在构造modules目标前,返回到模块源码目录。然后,modules目标指向obj-m变量中设定的模块,在上面的例子里,我们将该变量设置成了module.o。 上面这样的make命令对于多个文件的编译显得不是很方便,于是内核开发者就开发了一种makefile方式,这种方式使得内核树之外的模块构造变得更加容易。代码清单1.4展示了makefile的编写方法: 代码清单1.4 makefile ifeq ($(KERNELRELEASE),)

编译linux外部驱动模块时的基础知识

编译linux外部驱动模块时的基础知识 linux内核模块编译引言 为了清晰的编译Linux内核,内核编译系统使用Kbuild规则对编译的过程以及依赖进行规约。 在内核模块的编译中,为了保持与内核源码的兼容以及传递编译链接选项给GCC,也使用Kbuild规则。 内核模块的源代码可以在内核源码树中,也可以在内核源码树外,当使用Kbuild时,两种情 况的编译方式也大致相似。一般的内核模块在开发时,都是放在源码树外的。 本文主要是针对源码树外部的内核模块的编译。为了屏蔽内核模块编译的复杂性,开发人员需要编写额外的Makefile,最终让编译内核模块就像编译普通的应用程序一样,敲入”make”就行了。本文后面就给了一个实例。 编译外部模块 在编译外部模块之前,需要首先准备好当前内核的配置以及内核头文件,同时,当前内核的modules enable选项应该开启(编译内核时指定)。 命令行选项 使用如下命令编译外部模块: make –C M= 其中-C表明make要调用下的Makefile,该Makefile就是内核的Makefile, M为该Makefile的参数,指定外部模块源码的路径。当Makefile接收到M参数时,就默认编 译外部模块。 例如,当前目录下存放一个外部模块的源码,其编译命令如下: make –C /lib/modules/`uname -r`/build M=`pwd` 其中uname –r获取当前运行内核的版本,pwd为当前源码路径,将其展开之后为: make –C /lib/modules/ 2.6.42.9/build M=/home/user/hello 其中/lib/modules/ 2.6.42.9/build是指向内核源码目录的符号链接。 编译完成之后,要安装驱动时,调用如下命令: make –C /lib/modules/`uname -r`/build M=`pwd` modules_install 编译目标 modules 编译外部模块,默认目标就是modules modules_install 安装编译成功了的外部模块,默认的安装目录为/lib/modules//extra/,前缀 可以同过INSTALL_MOD_PATH指定。 clean 清除选项 help 列出可用的外部目标 Kbuild文件 在执行了make –C /lib/modules/`uname-r`/build M=`pwd`之后,内核源码树中的Makefile 会再次跳转到`pwd`目录下,加载Kbuild或Makefile(如果没有Kbuild文件,则加载Makefile,因此,Kbuild文件中的内容也可以放到Makefile中)。

linux内核编译详细教程

详细教程:编译Linux最新内核 一、实验目的 学习重新编译Linux内核,理解、掌握Linux内核和发行版本的区别。 二、实验内容 在Linux操作系统环境下重新编译内核。实验主要内容: A. 查找并且下载一份内核源代码,本实验使用最新的Linux内核2.6.36。 B. 配置内核。 C. 编译内核和模块。 D. 配置启动文件。 本次实验环境是Linux2.6.35内核的环境下,下载并重新编译内核源代码(2.6.36);然后,配置GNU的启动引导工具grub,成功运行编译成功的内核。 三、主要仪器设备(必填) Linux环境:utuntu10.10,linux内核2.6.35 待编译内核:linux2.6.36 四、操作方法和实验步骤 【1】下载内核源代码 从https://www.doczj.com/doc/bd10301299.html,/newlinux/files/jijiangmin网站上下载最新的Linux内核2.6.36。

【2】部署内核源代码 打开终端,更改用户权限为root。具体做法是在终端输入sudo su,然后按提示输入密码。判断是否是root用户是使用whoami命令,若输出为root则已经切换到root账户。 输入mv linux-2.6.36.tar.gz /usr/src,目的是把下载的内核源代码文件移到/usr/src目录。 输入cd /usr/src切换到该目录下。 输入tar zxvf linux-2.6.36.tar.gz,目的是解压内核包,生成的源代码放在linux-2.6.36目录下。 输入cd linux-2.6.36,切换到该目录下。 输入cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入 .config,目的是使用在boot目录下的原配置文件。//这一步可以不走 【3】配置内核 配置内核的方法很多,主要有如下几种: #make menuconfig //基于ncurse库编制的图形工具界面 #make config //基于文本命令行工具,不推荐使用 #make xconfig //基于X11图形工具界面 #make gconfig //基于gtk+的图形工具界面 由于对Linux还处在初学阶段,所以选择了简单的配置内核方法,即make menuconfi g。在终端输入make menuconfig,等待几秒后,终端变成图形化的内核配置界面。进行配置时,大部分选项使用其缺省值,只有一小部分需要根据不同的需要选择。 对每一个配置选项,用户有三种选择,它们分别代表的含义如下: <*>或[*]——将该功能编译进内核

Linux内核模块的添加

实验一:Linux内核模块的添加(一)静态加载:把组件都添加进内核文件中,在目录kongfig文件中增加新代码对应的编译选项,在Makefile文件中添加编译条目。 (二)动态加载:下载并安装Linux内核模板: make modules _install ARCH = arm CROSS _COMPILE =arm-linux,编写Makefile。 以hello word为例来实现这两种方法: 静态加载: (1)hello word.c源代码 #include #include static int hello_init(void) { printk(KERN_INFO " Hello World enter\n"); return 0; } static void hello_exit(void) { printk(KERN_INFO " Hello World exit\n "); }

module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR("Barry Song <21cnbao@https://www.doczj.com/doc/bd10301299.html,>"); MODULE_LICENSE("Dual BSD/GPL"); MODULE_DESCRIPTION("A simple Hello World Module"); MODULE_ALIAS("a simplest module"); 把所有的组件都翻译进内核文件,即生成zImage或bzImage (1)进入linux-2.6.32.2-mini2440内核 (2)进入/drivers建立Hello文件夹,在Hello文件夹里面建立hello.c,Makef ile,Kconfig Makefiel:obj-y(CONFIG_HELLO_WORD) +=hello.o Kconfig:config hello_word tristate "TEST hello word" help usually you have to make (3)在drivers里面的Makefile添加:obj-y(CONFIG_HELLO_WORD)

Linux-3.10.1内核的编译和安装

Linux-3.10.1 内核的编译和安装

目录 1.写在前面 ................................................................................................................. - 3 - 2.编译安装环境 ......................................................................................................... - 4 - 3.获取Linux-3.10.1内核 .......................................................................................... - 4 - 4.编译安装Linux-3.10.1内核 .................................................................................. - 5 - 5.配置开机启动项 ..................................................................................................... - 7 -

1.写在前面 Linux操作系统包括四个部分: (1)内核:内核是一个操作系统的核心。它负责为其他所有的程序以及服务提供运行环境,分配各种软硬件资源,管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。在操作系统中,内核的作用类似于人的大脑。 (2)Shell:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。 (3)文件系统:是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、EXT3、FAT、FAT32、VFAT和ISO9660。 (4)应用程序:例如:文本编辑器(vi、vim、gedit等)、编程语言、X Window(图形界面)、办公套件、Internet工具和数据库等。 其中, Linux的一个重要特点就是其源代码的公开性,任何人都能够在https://https://www.doczj.com/doc/bd10301299.html,/上得到任何版本的Linux内核源码。 灵跃桌面云在使用Windows操作系统中时,通常遇到这样的困扰:系统运行了一段时间之后,出现运行速度越来越慢、系统盘的数据越来越多、剩余容量变得越来越少的问题。但是,由于Windows 系统不开源,我们无法知道出现这种情况的本质原因。而在Linux操作系统中,利用Linux内核的开源特性,可从内核源码层定位上述问题,从而对Linux系统进行定制、优化,以满足功能和性能上的需求。 接下来将以linux-3.10.1版本的内核为例,灵跃桌面云带领大家来详细了解下如何获取Linux内核源码,如何编译、安装一个属于自己的Linux内核,更多的详情请参考:https://www.doczj.com/doc/bd10301299.html,/Index/details/id/58.html。

相关主题
文本预览
相关文档 最新文档