首页 > 系统相关 >构造linux内核源码树(转载)

构造linux内核源码树(转载)

时间:2023-10-21 16:57:05浏览次数:34  
标签:22 shana hello source 源码 内核 linux 2.6

本文是参考了网上多篇帖子而写的算不上什么原创。唯一值得欣慰的只不过在本机上实现罢了。因为毕竟失败了几次。也因为本人是初学驱动编程,很多简单的问题在我来说是相当的困难的。望有识之士不要笑话。最后,希望本文能给刚学驱动而还没开头的人提供一些帮助。

刚看 O'REILLY 写的《LINUX 设备驱动程序》时。作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。那怎么建立呢?为此上网“翻云覆雨”起来而结果却是“惨败而归“。
为此托了一天又4个小时(当然包括吃饭睡觉的时间),连个简单的 hello wrold 都没实现。(书中p22页最简单也最没用的驱动事列)
不过功夫不负有心人。在今天终于弄明白了怎么回事。下面就请让我慢慢道来吧。

先查看自己OS使用的内核版本

shana@shana:~$ uname -r
2.6.22-14-generic /* 这是我显示的结果 */

如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的)

shana@shana:/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 /* 这是我下的源码 包 */
shana@shana:/usr/src$

如果没有源码。(一般ubuntu 都没有吧)
查看一下可一下载的源码包(切记不要使用超级用户使用此命令否则……会提示没有此命令)

shana@shana:/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
shana@shana:/usr/src$

我选择了 linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches 这个~
然后 install 之

shana@shana:/usr/src$ sudo apt-get install linux-source-2.6.22

下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:

注意 已经切换到超级用户模式

root@shana:/usr/src#tar jxvf linux-source-2.6.20.tar.bz2

解压后生成一个新的目录/usr/src/linux-source-2.6.22,所有的源代码都在该目录下。

进入该目录

开始配置内核 选择最快的原版的配置(默认)方式 (我是如此)

root@shana:/usr/src/linux-source-2.6.22# make oldconfig

当然你也可以使用 自己喜欢的配置方式 如 menuconfig , xconfig(必须有GTK环境吧)。反正不用剪裁什么,所以不管那种方式能配置它就行了。

完成后,开始make 吧 这儿比较久 一般有1一个小时吧。(保证空间足够 我编译完成后 使用了1.8G) 我分区时分给/目录30G的空间,我没遇到这问题。倒是我朋友遇到了。

shana@shana:/usr/src/linux-source-2.6.22$ make

shana@shana:/usr/src/linux-source-2.6.22$ make bzImage

当然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x。

然后 :

root@shana:/usr/src/linux-source-2.6.22#make modules /* 编译 模块 */

root@shana:/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

clean:

  rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions



如果以上你都完成了在 make 时出现这样的错误

shana@shana:~/linux_驱动开发$ make
make: 没有什么可以做的为 `modules'。

原因很简单 你肯定是从我这直接复制的吧~~~呵呵,Makefile格式错误啦~
解决办法就是 你把如 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 移动到行首 然后按Tab 键自动对齐
这时里边的变量都变成绿色了~然后在 make 吧

shana@shana:~/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'
shana@shana:~/linux_驱动开发$


shana@shana:~/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
shana@shana:~/linux_驱动开发$


然后加载模块 (超级用户)

root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko

按照书上的例子 会在终端显示 hello , world 但是运行后什么都没有出现 (原因不解)

root@shana:/home/shana/linux_驱动开发# insmod ./hello.ko
root@shana:/home/shana/linux_驱动开发#

查看加载模块

root@shana:/home/shana/linux_驱动开发# lsmod
Module Size Used by
hello 2560 0

已经加载上咯~~

删除模块

root@shana:/home/shana/linux_驱动开发# rmmod hello
root@shana:/home/shana/linux_驱动开发#

那程序的输出在那呢?书中说明 如果不出现在终端 则会写进 syslog 文件中

shana@shana:~/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
shana@shana:~/linux_驱动开发$

至此 全部工作都完成了。是否对你有用呢?

 

 原文地址 http://forum.ubuntu.org.cn/viewtopic.php?t=109762

 

https://www.cnblogs.com/chenyuren/articles/2160042.html

标签:22,shana,hello,source,源码,内核,linux,2.6
From: https://www.cnblogs.com/im18620660608/p/17779200.html

相关文章

  • Linux中如何构建内核源码树
    Linux中如何构建内核源码树,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。要编写Linux的驱动,必须要构建内核源码树。内核源码树的作用是构造可以在Linux内核中装载和卸载的模块,因此若是要为目标板构造模块,必须保证......
  • Linux基础命令
    1.基本命令uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件(SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息arch 显示机器的处理器架构uname ......
  • 应用程序响应缓慢的处理方式(LInux)
    一:概述假如你是一名Linux系统管理员,需要处理应用程序遇到的各种问题,优化系统配置。硬件问题、软件问题、网络问题等都会导致系统中应用程序响应速度变得缓慢,优化应用程序、提高系统资源利用率是系统管理员应该掌握的技能之一。二:检查应用程序的资源占用情况Linux系统中处理应用程序......
  • Linux centos7网卡起不来的现象
    现象如下图:FailedtostartLSB:Bringup/downnetworking.解决方法一:一般跟系统自带的NetworkManager这个管理套件有关系,关掉就可以解决systemctlstopNetworkManger//关闭NetworkManager套件服务systemctldisalbleNetworkManager//开机自动关闭systemctkstartnetwork......
  • IDEA 关联Scala源码
    系统环境IntelliJIDEA2023.2(UltimateEdition)JDK17Scala3.3.1去官网下载Scala源码包https://www.scala-lang.org/download/all.html注意:需要同时下载3.x和2.x的包,因为有很多函数实现在2.x的包里面,3.x的包里没有我这里下载了3.3.1和2.13.12的源码包以3.3.1......
  • 《Unix/Linux系统编程》教材学习笔记第三章
    chapter3多任务处理一般来说,多任务处理指的是同时进行几项独立活动的能力。在计算机技术中,多任务处理指的是同时执行几个独立的任务。在单处理器(单CPU)系统中,一次只能执行一个任务。多任务处理是通过在不同任务之间多路复用CPU的执行时间来实现的,即将CPU执行操作从一个任务切换到......
  • Linux系统监控工具-glances
    一、glances介绍glances是一个基于python语言开发,可以为linux或者UNIX性能提供监视和分析性能数据的功能。glances在用户的终端上显示重要的系统信息,并动态的进行更新,让管理员实时掌握系统资源的使用情况,而动态监控并不会消耗大量的系统资源,比如CPU资源,通常消耗小于2%,glances默认......
  • Linux终端的使用
    一、终端的作用要了解终端,就要了解一下计算机方面的历史,早期的计算机都属于大中型计算机,是个庞然大物,占用很大的空间,属于公用产品。不像现在的电脑,可以人手一部,直接操作。那如何对这些计算机进行控制与操作呢。那就搞个终端设备来操作。因此一台计算机上有很多种不同的终端设备也......
  • 捡起ctf学习 day1 Linux Labs
    1.把忘记密码的kali重置了密码进入GRUB启动程序,修改命令,重置密码(参考https://www.cnblogs.com/wh0915/p/17153270.html) 2.做题,ssh连接命令ssh-p端口用户名@网址然后输入密码即可连接 cd命令:切换当前目录百至其它目录,比如进入/etc目录,则执行cd/etccd/:在Linux系......
  • linux 网络管理
    现代人的生活越来越依赖网络,对于一个操作系统来讲,网络功能的支持和管理就更为重要了,本节课我们一起来看一下在CentOS8中如何对网络进行管理NetworkManager和常用工具和基本用法NetworkManager介绍在linux系统中传统的网络管理方法是用过一个叫network的服务来实现,在CentOS7中依......