Linux内核树的建立-基于ubuntu系统

刚看 O‘REILLY 写的《LINUX 设备驱动程序》时。作者一再强调在编写驱动程序时必须 建立内核树。先前的内核只需要有一套内核头文件就够了,但因为2.6的内核模块吆喝内核源码树中的目标文件连接,通过这种方式,可得到一个更加健壮的模块 装载器,但也需要这些目标文件存在于内核目录树中。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。那怎么建立呢?为此上网“翻云覆 雨”起来而结果却是“惨败而归“。
为此托了一天又4个小时(当然包括吃饭睡觉的时间),连个简单的 hello wrold 都没实现。(书中p22页最简单也最没用的驱动事列)
不过功夫不负有心人。在今天终于弄明白了怎么回事。下面就请让我慢慢道来吧。
先查看自己OS使用的内核版本
[email protected]:~$ uname -r
2.6.22-14-generic 
如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的)
[email protected]:/usr/src$ ls
linux-headers-2.6.22-14
linux-headers-2.6.22-14-generic
linux-source-2.6.22 
linux-source-2.6.22.tar.bz2 
[email protected]:/usr/src$
如果没有源码。(一般ubuntu 都没有吧)
查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则……会提示没有此命令)
[email protected]:/usr/src$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
xen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patches
linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches
[email protected]:/usr/src$
我选择了 linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 这个~
然后 install 之
[email protected]:/usr/src$ sudo apt-get install linux-source-2.6.22
下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:
注意 已经切换到超级用户模式
[email protected]:/usr/src#tar jxvf linux-source-2.6.20.tar.bz2
解压后生成一个新的目录/usr/src/linux-source-2.6.22,所有的源代码都在该目录下。
进入该目录
开始配置内核 选择最快的原版的配置(默认)方式 (我是如此)
[email protected]:/usr/src/linux-source-2.6.22# make oldconfig
当然你也可以使用 自己喜欢的配置方式 如 menuconfig , xconfig(必须有GTK环境吧)。反正不用剪裁什么,所以不管那种方式能配置它就行了。
完成后,开始make 吧 这儿比较久 一般有1一个小时吧。(保证空间足够 我编译完成后 使用了1.8G) 我分区时分给/目录30G的空间,我没遇到这问题。倒是我朋友遇到了。
[email protected]:/usr/src/linux-source-2.6.22$ make
[email protected]:/usr/src/linux-source-2.6.22$ make bzImage
当然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。
然后 :
[email protected]:/usr/src/linux-source-2.6.22#make modules 
[email protected]:/usr/src/linux-source-2.6.22#make modules_install 
执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.22-14-generic/
。 在随后的编译模块文件时,要用到这个路径下的build目录。至此,内核编译完成。可以重启一下系统。
至此 内核树就建立啦 原来不是很难.....
写一个 最简单 最没用的驱动吧
我在 /home/shana/linux_q/ 目录下创建2个文本文件 hello.c Makefile
//hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
程序我就不解释了……
Makefile 文件
obj-m := hello.o
KERNELDIR := /lib/modules/2.6.20/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
如果以上你都完成了在 make 时出现这样的错误
[email protected]:~/linux_驱动开发$ make
make: 没有什么可以做的为 `modules‘。
原因很简单 你肯定是从我这直接复制的吧~~~呵呵,Makefile格式错误啦~
解决办法就是 你把如 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 移动到行首 然后按Tab 键自动对齐
这时里边的变量都变成绿色了~然后在 make 吧
[email protected]:~/linux_驱动开发$ make
make -C /lib/modules/2.6.22-14-generic/build M=/home/shana/linux_驱动开发 modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.22-14-generic‘
CC [M] /home/shana/linux_驱动开发/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/shana/linux_驱动开发/hello.mod.o
LD [M] /home/shana/linux_驱动开发/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.22-14-generic‘
[email protected]:~/linux_驱动开发$
[email protected]:~/linux_驱动开发$ ls -l
总用量 124
-rw-r--r-- 1 shana shana 303 2008-03-16 10:43 hello.c
-rw-r--r-- 1 shana shana 49039 2008-03-16 12:11 hello.ko
-rw-r--r-- 1 shana shana 687 2008-03-16 12:11 hello.mod.c
-rw-r--r-- 1 shana shana 25840 2008-03-16 12:11 hello.mod.o
-rw-r--r-- 1 shana shana 24360 2008-03-16 12:11 hello.o
-rw-r--r-- 1 shana shana 8344 2008-03-16 09:17 linux_qudong_qu.txt
-rw-r--r-- 1 shana shana 266 2008-03-16 12:09 Makefile
-rw-r--r-- 1 shana shana 0 2008-03-16 12:11 Module.symvers
[email protected]:~/linux_驱动开发$
然后加载模块 (超级用户)
[email protected]:/home/shana/linux_驱动开发# insmod ./hello.ko
按照书上的例子 会在终端显示 hello , world 但是运行后什么都没有出现 (原因不解)
[email protected]:/home/shana/linux_驱动开发# insmod ./hello.ko
[email protected]:/home/shana/linux_驱动开发#
查看加载模块
[email protected]:/home/shana/linux_驱动开发# lsmod
Module Size Used by
hello 2560 0
已经加载上咯~~
删除模块
[email protected]:/home/shana/linux_驱动开发# rmmod hello
[email protected]:/home/shana/linux_驱动开发#
那程序的输出在那呢?书中说明 如果不出现在终端 则会写进 syslog 文件中
[email protected]:~/linux_驱动开发$ cat /var/log/syslog |grep world
Mar 16 12:14:53 shana kernel: [ 5937.529297] Hello, world
Mar 16 12:16:05 shana kernel: [ 6009.439036] Goodbye, cruel world
[email protected]:~/linux_驱动开发$

时间: 2024-07-30 20:40:44

Linux内核树的建立-基于ubuntu系统的相关文章

关于在Linux mint(应该所有基于ubuntu的发行版都是这样子)jade安装使用问题

本文出自blog.csdn.net/svitter jade是什么? 模板引擎 如何在Ubuntu下使用? github上给的答案是 使用 npm install jade 来安装使用. 但是在ubuntu下没有办法直接在命令行使用jade. 你需要找到~/node_modules/jade/bin下的jade.js 如果使用deb安装的node,那么node在命令行下为js 希望不正确之处大家给予指正_(:3」∠)_ 关于在Linux mint(应该所有基于ubuntu的发行版都是这样子)ja

Linux内核分析——进程的切换和系统的一般执行过程

进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 (一)进程调度与进程调度的时机分析 1.不同类型的进程有不同的调度需求 第一种分类: (1)I/O-bound:频繁进行I/O,花费很多时间等待I/O操作的完成. (2)CPU-bound:计算密集型,需要大量CPU时间进行计算. 第二种分类: (1)批处理进程:不必交互.很快响应. (2)实时进程:要求响应时间短. (3)交互式进程(shell). 2.调度策略:是一组规则,它们决定什么时候以怎样的方式选择一个新进程

20135239 益西拉姆 linux内核分析 进程的切换和系统的一般执行过程

week 8 进程的切换和系统的一般执行过程 [ 20135239 原文请转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] 一.进程调度与进程调度的时机分析 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已.对于理解操作系统的工作机制,反而是进程的调度时机与进程的切换机制更为关键. 不同类型的进程有不同的调度需求 第一

Linux内核源码树建立加载hello模块

在加载模块之前,书中说要先建立内核源码树,那么,如何建立内核源码树呢? 首先,要先知道你的OS的内核版本,用uname -r可以查得到 在/url/src/目录下可以看到对应的版本目录 如果没有可以用apt-cache search linux-source获取内核 用sudo apt-get install linux-source-3.13.0下载内核 下载完成后在该文件夹中产生一个对应的压缩文件 linux-source-3.13.0.tar.bz2 然后解压该文件tar jxvf lin

Linux内核配置解析 - 概述(基于ARM64架构)

1. 前言 对刚接触Linux kernel的同学来说,遇到的第一个问题就是:我该从哪里入手?. 话说Linux kernel的打开方式是多种多样的:从简单的设备驱动入手:从源代码的目录结构入手:从kernel的启动过程入手:从大的功能模块入手:等等.不管怎样,每条都是正途(条条大路通罗马嘛). 而本文(以及随后的系列文章),将从Linux kernel的配置项入手,从整体上认识Linux kernel.之所以这么做,原因有二: 1)Linux kernel的配置项数目繁多,以至于进行kerne

基于Ubuntu系统XAMPP环境安装以及DVWA渗透测试系统安装(详解的不能再详解了)

首先这是X勺年人生第二次博,用来记录一下转折于我而言.做个简介,这个Ubuntu是linux的一种吧,然 然后这个Ubuntu是我刚简单安装(在虚拟机上)没有经过任何配置,从头开始,我这绝壁的小白,其实 什么都不懂,一个半吊子学网络应用的,可能这样我才更仔细的粘贴出来,我配置这个东西这次大约参 了两个文档(比第一少的多了)还有一个官网视频,想知道怎么下载的么,这得问我身边的大神,他下载 的.厉害了,不愧是10多年经验还年纪轻轻的小伙子. 开始开始ing   .... 1.首先你得装上Ubuntu

构建调试Linux内核网络代码的环境MenuOS系统

构建MenuOS系统 1.将指定文件拷贝到本地: git clone https://github.com/mengning/linuxnet.git 此过程可能需要输入github账号和密码. 2.进入目录linuxnet,使用make命令编译根文件系统: cd linuxnet make rootfs 3.在Makefile文件中有一条指令用于开启menu系统(不需要自己输入): qmenu -kernel ../../linux-3.18.6/arch/x86/bzImage -initr

python爬虫学习日历2【基于ubuntu系统】beautifulsoup的强大之处

前一篇小文中就提到了python的requests库可以获取网络编码中的所有内容,我们获取了自然就必须对它进行加工处理,就像我们学习一样,一本书,我们可以轻易的获取,但是它究竟是在讲哲学还是讲历史呢还是其他云云,需要我们认真分析,取其精华去其糟粕.而在python当然也有做这个工作的'人',就是我们需要安装库中的'beautifulsoup' 我本来是想继续用昨天的网址来说明的,不过效果不佳,我一会这这篇小文的最后会附上源代码,供各位朋友或者自己再次的学习 html_doc = ""&

基于Ubuntu系统搭建以太坊go-ethereum源码的开发环境

第一.先安装geth的CLI环境sudo apt-get install geth,这个很重要 第二.下载源代码 git clone https://github.com/ethereum/go-ethereum 我下载到啦 /home/siegel/ethereum/ 更改文件夹权限为可写  chmod -R 777 /home/siegel/ethereum/go-ethereum 第三步 sudo apt-get install software-properties-common sud