Ubuntu下编译的第一个内核模块 - Linux教程 - 新客网

合集下载

Ubuntu编译安装Linux内核过程(整理版)

Ubuntu编译安装Linux内核过程(整理版)

Ubuntu编译Linux内核过程一、首先解决Ubuntu代理上网的问题1、这种方法要用到/etc/apt/文件夹下的apt.conf文件。

如果您希望apt-get(而不是其他应用程序)一直使用http代理,您可以使用这种方式。

注意:某些情况下,系统安装过程中没有建立apt配置文件。

下面的操作将视情况修改现有的配置文件或者新建配置文件。

sudo gedit /etc/apt/apt.conf在您的apt.conf文件中加入下面这行(根据你的实际情况替换yourproxyaddress和proxyport)。

Acquire::http::Proxy "http://yourproxyaddress:proxyport";保存apt.conf文件。

如果代理服务器需要登录,那么可以在指定代理服务器地址的时候,用如下格式(根据情况把username,password, yourproxyaddress 和proxyport替换为相应内容):http_proxy=http://username:password@yourproxyaddress:proxyp ort2、然后在新立得设置http代理,在系统--系统管理--新立得软件包管理器--设置--首选项--网络里也要设置http的代理二、下载源代码和编译软件的准备下载内核源代码:/注意,点击2.6.39.3内核的F版,即完整版。

如果你懒得去网站点联接,运行下列命令:代码:$cd ~$wget/pub/linux/kernel/v2.6/linux-2.6.39.3. tar.bz2安装有关编译程序。

安装make ,gcc, make-kpkg,运行menuconfig 等等和编译内核相关的工具。

安装不了,请检查/etc/apt/sources.list 文件。

安装所需工具包有关命令:代码:$sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot三、解压源代码注意,网上很多教程上说应该解压到 /usr/src,纯属以讹传讹,linux掌门人linus说解压到任何目录上都可以。

linux内核编译教程

linux内核编译教程

linux内核编译教程Linux内核是开源操作系统Linux的核心部分,负责管理计算机的硬件资源和提供系统调用等基本功能。

编译Linux内核是根据自己的需求定制Linux系统的一个重要步骤。

本文将介绍如何编译Linux内核。

首先,要开始编译Linux内核,需要下载最新的内核源代码。

可以在Linux官网的下载页面找到相应的内核版本。

将源代码下载到本地后,解压缩到一个合适的位置。

接下来,需要安装一些必要的依赖包。

不同的Linux发行版可能有不同的依赖包名称,可以通过包管理器进行安装。

例如,对于Debian/Ubuntu系统,可以使用apt-get命令安装依赖包。

常见的依赖包包括gcc编译器、make工具、flex和bison等。

在安装完依赖包之后,进入解压缩后的内核源码目录。

可以通过cd命令切换到该目录。

在目录中可以找到一个名为.config 的文件,这是内核的配置文件。

可以通过复制现有的配置文件或者使用make menuconfig等命令进行配置。

配置完成后,可以开始编译内核了。

在内核源码目录中运行make命令,编译过程可能需要一些时间。

可以使用make命令的参数来设置编译的选项,例如使用-j参数指定并行编译的进程数,加快编译速度。

编译完成后,可以使用make modules_install命令安装内核模块。

然后,使用make install命令安装编译好的内核。

这些命令可能需要root权限才能执行。

安装完成后,需要更新系统的引导程序以启动新编译的内核。

具体的操作步骤可以根据不同的引导程序进行设置。

一般来说,需要编辑/boot/grub/grub.cfg文件,添加新内核的引导项。

最后,重启计算机,选择新编译的内核启动。

如果一切正常,系统将会以新内核启动。

在编译Linux内核的过程中,可能会遇到各种问题。

可以通过查找相关文档、咨询论坛或者向开发者社区寻求帮助来解决问题。

总之,编译Linux内核是一个复杂的过程,但通过理解以上步骤和不断实践,可以逐渐掌握这一技能,并根据自己的需求定制出适合的Linux系统。

【IT专家】Ubuntu 编译安装 Linux 4.0.5 内核,并修复 vmware 网络内核模块编译错误

【IT专家】Ubuntu 编译安装 Linux 4.0.5 内核,并修复 vmware 网络内核模块编译错误

Ubuntu 编译安装Linux 4.0.5 内核,并修复vmware 网络内核模块编译错误2015/06/14 1341 . 今天把Ubuntu 14.04 升级到了最新的 4.0.5 的内核版本,本来不打算记录下来的,但是升级的过程中确实遇到了一些问题,因此还是记录下来,分享给遇到同样问题的猿友。

 先去官网下载最新的内核压缩包:https://kernel/ 网速不给力,只能用虚拟机里的迅雷下载,然后再拷贝出来。

 LZ 把源码包拷贝到/usr/src 下面,直接就在这里编译安装了: # 切换到root 身份$ su# 解压缩源码,得到文件夹/usr/src/linux-4.0.5 # tar xvf linux-4.0.5.tar.xz # cd linux-4.0.5# make mrproper 命令用来清理以前编译时留下的临时文件,# 因为LZ 是解压缩的新包,因此不需要这步# make mrproper# 把当前正在使用的内核编译配置文件拷过来作为模板# cp /boot/config-`uname -r` .config# 启动基于ncurse库绘制的图形配置界面,已经按照当前正在使用的内核的配置选好相关选项了,再启用一些新特性即可# 如果出现如下错误,那么可能是没有安装ncurse 库,执行apt-get install libncurses5-dev 命令安装。

# In file included from scripts/kconfig/mconf.c:23:0:# scripts/kconfig/lxdialog/dialog.h:38:20: fatal error: curses.h: No such file or directory# #include CURSES_LOC # make menuconfig# 正常是要执行下面这三条命令的,但是Ubuntu 上不用这么麻烦# make install # make modules # make modules_install# Ubuntu 上用包管理器可以把内核和相关模块编译成deb 包,熟悉Ubuntu 的童鞋这下觉得好办多了吧?# 如果提示没有make-kpkg 命令的话,可以先用apt-get 安装# apt-get install kernel-package # make-kpkg clean# 与make 命令一样,j8 参数可以指定8 个线程同时编译# make-kpkg --initrd kernel-image kernel-headers -j8# 坐等编译完成吧,会在上一级目录中生成两个deb 包,接下来安装它们:# dpkg -i linux-image-4.0.5_4.0.5-10.00.Custom_amd64.deb # dpkg -ilinux-headers-4.0.5_4.0.5-10.00.Custom_amd64.deb# grub 貌似不用更新也可以,安装deb 的时候会自动更新# update-grub# 重启系统,进入新的内核吧# reboot 编译、安装、重启都很顺利,但是发现在新内核中启动vmware 的时候提示必须更新内核模块,可是在编译网络模块的时候死活过不去,LZ 猜测可能是由于内核中某些API 被修改了,而vmware 的驱动源码跟最新的内核中的API 不匹配了,因此才报了一些语法错误,没办法,只能手工修改了。

Ubuntu编译安装Linux内核过程

Ubuntu编译安装Linux内核过程

Ubuntu编译安装Linux内核过程编译安装Linux内核是Ubuntu系统用户进行内核优化、定制和个性化的重要方式之一、本文将介绍Ubuntu编译安装Linux内核的过程,帮助用户完成编译安装。

## 1. 获取Linux内核源代码##2.安装必要的工具和依赖项在编译安装Linux内核之前,需要安装一些必要的工具和依赖项,以确保编译过程的顺利进行。

你可以通过以下命令来安装它们:```sudo apt updatesudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev```##3.解压源代码```tar -xf linux-x.x.x.tar.xz```##4.进入源代码目录进入解压后的源代码目录:```cd linux-x.x.x```##5.配置内核在继续编译之前,需要对内核进行配置。

你可以使用以下命令打开配置窗口:```make menuconfig```这个命令会打开一个文本界面的配置窗口,你可以在其中选择和配置不同的内核选项。

根据你的需求进行自定义配置。

##6.编译内核完成内核配置后,可以执行以下命令来开始编译内核:```make -j4```这个命令中的“-j4”表示使用4个线程进行编译。

你可以根据你的系统硬件配置自定义线程数量。

编译内核的时间会根据你的系统配置和编译选项的不同而有所不同。

请耐心等待编译过程完成。

##7.安装内核完成编译后,可以执行以下命令来安装编译得到的内核:```sudo make modules_install install```这个命令将编译得到的内核模块和内核文件安装到系统中。

安装完成后,你需要更新系统的引导加载程序(grub)以使用新的内核。

##8.更新引导加载程序执行以下命令来更新引导加载程序(grub):```sudo update-grub```这个命令会自动检测并添加新安装的内核到引导菜单中。

LINUX内核模块编译步骤

LINUX内核模块编译步骤

LINUX内核模块编译步骤编译Linux内核模块主要包括以下步骤:1.获取源代码2.配置内核进入源代码目录并运行make menuconfig命令来配置内核。

该命令会打开一个文本菜单,其中包含许多内核选项。

在这里,你可以配置内核以适应特定的硬件要求和预期的功能。

你可以选择启用或禁用各种功能、设备驱动程序和文件系统等。

配置完成后,保存并退出。

3. 编译内核(make)运行make命令开始编译内核。

这将根据你在上一步中进行的配置生成相应的Makefile,然后开始编译内核。

编译的过程可能需要一些时间,请耐心等待。

4.安装模块编译完成后,运行make modules_install命令将编译好的模块安装到系统中。

这些模块被安装在/lib/modules/<kernel-version>/目录下。

5.安装内核运行make install命令来安装编译好的内核。

该命令会将内核映像文件(通常位于/arch/<architecture>/boot/目录下)复制到/boot目录,并更新系统引导加载程序(如GRUB)的配置文件。

6.更新GRUB配置文件运行update-grub命令来更新GRUB引导加载程序的配置文件。

这将确保新安装的内核在下次启动时可用。

7.重启系统安装完成后,通过重启系统来加载新的内核和模块。

在系统启动时,GRUB将显示一个菜单,你可以选择要启动的内核版本。

8.加载和卸载内核模块现在,你可以使用insmod命令来加载内核模块。

例如,运行insmod hello.ko命令来加载名为hello.ko的模块。

加载的模块位于/lib/modules/<kernel-version>/目录下。

如果你想卸载一个已加载的内核模块,可以使用rmmod命令。

例如,运行rmmod hello命令来卸载已加载的hello模块。

9.编写和编译模块代码要编写一个内核模块,你需要创建一个C文件,包含必要的模块代码。

在ubuntu下编译linux内核的详细说明

在ubuntu下编译linux内核的详细说明

一、实验目的学习重新编译Linux内核,理解、掌握Linux内核和发行版本的区别。

二、实验内容在Linux操作系统环境下重新编译内核。

实验主要内容:A. 查找并且下载一份内核源代码,本实验使用最新的Linux内核2.6.36。

B. 配置内核。

C. 编译内核和模块。

D. 配置启动文件。

本次实验环境是Linux2.6.35内核的环境下,下载并重新编译内核源代码(2.6.36);然后,配置GNU的启动引导工具grub,成功运行编译成功的内核。

三、主要仪器设备(必填)Linux环境:utuntu10.10,待编译内核:linux3.6.9四、操作方法和实验步骤【1】下载内核源代码从/网站上下载新的Linux内核3.6.9。

【2】部署内核源代码打开终端,更改用户权限为root。

具体做法是在终端输入sudo su,然后按提示输入密码。

判断是否是root用户是使用whoami命令,若输出为root则已经切换到root账户。

输入mv linux-3.6.9.tar.gz /usr/src,目的是把下载的内核源代码文件移到/usr/src目录。

输入cd /usr/src切换到该目录下。

输入tar zxvf linux-3.6.9.tar.gz,目的是解压内核包,生成的源代码放在linux-3.6.9目录下。

输入cd linux-3.6.9,切换到该目录下。

输入cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入.config,目的是使用在boot目录下的原配置文件。

【3】配置内核配置内核的方法很多,主要有如下几种:#make menuconfig //基于ncurse库编制的图形工具界面#make config //基于文本命令行工具,不推荐使用#make xconfig //基于X11图形工具界面#make gconfig //基于gtk+的图形工具界面由于对Linux还处在初学阶段,所以选择了简单的配置内核方法,即make menuconfig。

kernel 模块编译

kernel 模块编译

kernel 模块编译为了更好的理解 Linux 操作系统的工作原理,我们需要了解操作系统中的一个非常重要的概念:内核(Kernel)。

内核是操作系统的核心组成部分,它执行所有的系统任务,如管理进程、文件系统、设备驱动程序等等。

Linux 内核由许多模块组成,以便于针对特定硬件和应用程序进行优化和配置。

在本文中,我们将学习如何编译内核模块。

内核模块是一段动态载入的代码,可以在运行时添加到内核中。

在 Linux 中,内核模块通常是通过动态链接的方式加载到内核中。

这使得开发人员能够为特定硬件或应用程序编写驱动程序、文件系统或网络协议。

为了编译内核模块,我们需要安装内核源码包及其相关工具。

在大多数 Linux 发行版中,内核源码包可以通过包管理器安装。

例如,在 Ubuntu 中,可以使用以下命令安装:```shellsudo apt-get install linux-source build-essential```此外,我们还需要为特定的内核版本编译环境配置。

我们可以通过以下命令获取当前正在运行的内核版本:```shelluname -r```在本例中,我们得到的输出是“5.4.0-42-generic”。

接下来,我们需要为此内核版本生成一个配置文件。

可以通过以下方式实现:此命令会在当前目录下生成一个默认的配置文件。

我们需要将此配置文件复制到当前内核模块的目录中,并相应地修改:此命令会启动一个图形用户界面,允许用户在内核配置中进行相应的修改。

例如,如果我们要创建一个名为“hello.ko”的内核模块,我们需要确保其依赖项中包含所需的头文件和库。

在菜单“Kernel hacking”中,我们需要允许“kernel module”和“module versioning support”选项。

为了编译内核模块,我们还需要编写一个 Makefile 文件。

可以在当前目录下创建一个名为“Makefile”的文件,并按照以下格式编写:```makefileobj-m += hello.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean```此 Makefile 文件将 hello.c 文件编译为一个名为“hello.ko”的内核模块。

Ubuntu10.10下编译内核linux-2.6.38-rc8成功

Ubuntu10.10下编译内核linux-2.6.38-rc8成功
7,开始编译内核 执行; sudo make-kpkg clean make-kpkg --initrd --append-to-version=-baiyang kernel_image
注:其中的“-baiyang”可以改成你自己喜欢的内容,按照我的编译出来的内核 名字就是“linux-image-2.6.38-rc8-baiyang”
2.安装有关编译程序。安装 make ,gcc, make-kpkg,运行 xconfig 等等和编译内 核相关的工具. 执行; sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot
3.解压源代码 执行; tar jfx linux-2.6.38-rc8.tar.bz2 -C ~/linux 找不到 linux 目录就创建一个,~/linux 可以是任意目录,但是注意,要预留 2G 以上的空间
8.安装内核 编译好的内核在上一层目录,可双击安装
或者执行; cd sudo dpkg -i linux-image-2.6.38-rc8-baiyang_2.6.38-rc8-baiyang-10.00.Custom_i386.d eb
9.安装完成后和老内核比较一下大小: 执行; ls -l /boot/
今天在 Ubuntu10.10 下编译内核 linux-2.6.38-rc8 成功,~~ 以下是我的操作步骤,分享出来以供参考; 1. 在 /下载 linux-2.6.38-rc8, 你可以选择稳定版或者新的测试版,但一定要下载 Full source 版。
4.进入源代码所在目录 执行; cd ~/linux/linux-2.6.38-rc8/ 5,清理以前编译留下的临时文件,如果是刚刚解开的源码包,不用执行此步 执行; make mrproper

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

核心板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 回车,安装ncurses3,安装完成后,输入命令: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.o3,打开linux终端,进入linux-2.6.30目录,输入命令:make modules 回车,完成后在linux-2.6.30/drivers/char/目录下会产生对应到.ko文件(如:cgc-pio.ko)。

linux内核模块编译方法

linux内核模块编译方法

linux内核模块编译方法Linux内核模块编译方法引言:Linux内核是操作系统的核心,它负责管理计算机硬件和软件资源,提供用户和应用程序间的接口。

内核模块是一种动态加载的代码,可以在不重新启动系统的情况下添加、删除或修改内核的功能。

本文将介绍Linux内核模块的编译方法,帮助读者快速了解并掌握内核模块的开发和编译过程。

一、准备工作在编译内核模块之前,我们需要准备一些必要的工具和环境。

首先,确保你的系统已经安装了开发工具链,包括GCC编译器、make工具和内核头文件。

你可以使用以下命令检查是否安装了这些工具:```$ gcc -v$ make -v```如果输出结果中显示了版本信息,则说明相应的工具已经安装。

如果没有安装,你可以使用包管理器来安装它们。

例如,在Debian 或Ubuntu系统中,可以使用以下命令安装GCC和make:```$ sudo apt-get install gcc$ sudo apt-get install make```还需要安装内核头文件,以便在编译期间使用内核的符号和数据结构。

你可以使用以下命令安装内核头文件:```$ sudo apt-get install linux-headers-$(uname -r)```这将安装与当前正在运行的内核版本对应的头文件。

二、编写内核模块在开始编写内核模块之前,你需要了解一些基本的内核模块开发知识。

内核模块是一段与内核紧密耦合的代码,因此你需要熟悉内核的API和数据结构。

你可以参考内核源代码中的文档或在线资源来学习这些知识。

编写内核模块的过程类似于编写普通的C程序,你可以使用任何文本编辑器来创建一个源文件,以`.c`为扩展名。

在源文件中,你需要包含一些必要的头文件,并实现模块的入口函数。

下面是一个简单的内核模块示例:```c#include <linux/init.h>#include <linux/module.h>static int __init hello_init(void){printk(KERN_INFO "Hello, World!\n");return 0;}static void __exit hello_exit(void){printk(KERN_INFO "Goodbye, World!\n");}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Your Name");MODULE_DESCRIPTION("A simple example Linux module.");```在上述示例中,我们定义了两个函数`hello_init`和`hello_exit`,分别用于模块的初始化和退出。

新手指南 Linux编译内核操作流程

新手指南 Linux编译内核操作流程

新手指南Linux编译内核操作流程[日期:2009-12-07] 来源: 作者:北南南北提要:编译内核主要是通过内核实现某些功能,比如iptables 需要内支持;所有的硬件的支持也是通过内核实现的;本文只是简单的给初学者讲一下编译内核的流程;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++正文++++++++++++++++++++++++++++++++++++++++++++++++++++++++++一、为什么要编译内核;有时我们为了实现某些功能,比如对iptables的防火墙有些需要内核支持;还有实现一些硬件的支持等,这时我们需要重编内核;二、内核源码版本的选择;如果发行版本提供内核源码,最好还是用发行版本提供的;比如Fedora 4.0 提供了很多版本的内核源码;我们安装好后,他自带的配置文件大多能满足我们的需要,对于新手来说,根据自带的内核的配置文件.config ,我们也能学到一点如何配置内核。

也没有什么难的,熟能生巧罢了;如果从 下载最新稳定版本的内核也是可以的;三、内核源码安装或解压;对于Fedora Core 4.0 来说,内核源码是放在/usr/src/kernels 目录中;如果通过在线升级内核,也是放在这个目录中;如果您的系统中的/usr/src/kernels/ 中没有内容,说明您没有安装内核的源码包kernel-devel 软件包;您可以通过软件包管理器来补装,请参考《Fedora/ RedHat软件包管理指南》如果您用Fedora Core 4.0 ,我建议您在保留老内核的基础上,在线下载最新版本的内核kerenl-devel 和对应版本的kernel 或者从 下载,有时可能新的kerenl 已经解决了您所面对的问题,这时就没有必要编译内核了;如果您是通过在线安装的内核源码包,比如通过apt+synaptic 或者yum 安装的,内核源码会被放到/usr/src/kernel 下的目录中,您要进入相对应的目录进行编译;在线更新软件包,请参考《Fedora/ RedHat软件包管理指南》,推荐apt+synaptic 工具;如果您是是下载kernel 和kernel-devel 的rpm 包,可以通过来安装;[root@localhost beinan]# rpm -ivh kernel*.rpm如果您是从 下载的类似linux-2.6.13.tar.bz2 或者linux-2.6.13.tar.gz的,您要把下载下来的文件移到/usr/src 目录中解压;然后进入解压的目录中进行配置和编译;[root@localhost beinan]# mv linux-2.6.13.tar.bz2[root@localhost beinan]# cd /usr/src/[root@localhost src]# tar jxvf linux-2.6.12.3.tar.bz2提示:本文以linux-2.6.12.3为例,其实通过发行版的升级版的kernel-devel 和从 下载下来的差不多,大同小异;不同的是通过在线升级的rpm格式的内核源码包,有配置文件.config 可以参考;安装到的目的地是/usr/src/kernel 对FC 4.0来说;如果您要高编译和配置内核,四、内核的配置;1、进入目录执行make mrproper ,对于从 下载而来的tar.bz格式的源码包;[root@localhost src]# cd linux-2.6.12.3/[root@localhost linux-2.6.12.3]#[root@localhost src]# cd linux-2.6.12.3/[root@localhost linux-2.6.12.3]# make mrproper[root@localhost linux-2.6.12.3]# make menuconfig对于Fedora Core 4.0 ,如果您是通过在线安装的kernel和kernel-devel 新版本的包,比如是2.6.12-1.1398_FC4-i686,你可以直进入/usr/src/kernel/相应的目录中直接执行make menuconfig ;利用发行版本提供的 .config 来配置,这样方便点。

ubuntu内核编译、安装

ubuntu内核编译、安装

ubuntu内核编译、安装简要步骤:⼀、下载源码,解压⼆、复制当前系统的配置⽂件到源码⽬录下的.config⽂件三、编译源码四、编译模块五、安装模块六、添加启动项⼀、下载源码,解压 ⽅式1、 查看当前系统内核版本:打开终端输⼊uname -r ⽅式2、apt下载 打开终端输⼊: sudo apt-get source linux-image-$(uname -r) 下载存放⽬录: /usr/src/ 下载完成后,解压⽂件:如 tar -xavf linux-5.0.3.tar.xz⼆、复制当前系统的配置⽂件到源码⽬录下的.config⽂件 因编译后的内核是给本机使⽤,需要适配本机,所以,复制当前系统的配置信息到源码⽬录的 .config⽂件内 cp /boot/config-5.0.3 -generic ./.config.三、编译源码 备份启动⽂件 cp boot/grub/grub.cfg boot/grub/grub.cfg.back 安装编译环境软件 sudo apt-get install libncurses5-dev openssl libssl- dev sudo apt-get install build-essential openssl sudo apt-get install pkg-config sudo apt-get install libc6-dev sudo apt-get install bison sudo apt-get install flex sudo apt-get install libelf-dev sudo apt-get install zlibc minizip sudo apt-get install libidn11-dev libidn11 sudo apt-get install libssl-dev 进⼊源码⽬录,打开终端输⼊: make menuconfig ⾸次编译,图形选择界⾯通过左右⽅向键选择 load(读取刚才复制更新的配置⽂件)>>> OK >>> Save >>> OK >>> EXIT >>> EXIT 编译: make mrproper make clean make bzImage -j8四、编译模块 make modules -j8五、安装模块 make install make modules_install 此操作此后/lib/modules/⽬录下应该新⽣成⼀个新内核版本号⽂件六、添加启动项 将3个⽂件复制到boot⽬录下 mkinitramfs /lib/modules/5.0.3 -o /boot/initrd.img-5.0.3-generic cp /usr/src/linux-5.0.3/arch/x86/boot/bzImage /boot/vmlinuz- 5.0.3-generic cp /usr/src/linux-5.0.3/System.map /boot/System.map-5.0.3 进⼊/boot/grub/然后执⾏ update-grub2七、重启 shutdown -r now uname -a。

linux模块编译步骤(详解)

linux模块编译步骤(详解)

Linux内核模块编程Linux 内核模块编程是一个很重要的知识点。

尤其是编写底层驱动程序时,一定会涉及到它。

内核模块编程也是 Tiger哥学习 Linux 时第一节课所接触的知识。

由此可以看出它的 important, 也可以看出其实它很 easy 。

一前言:1. 什么是内核模块1> 内核模块是具有独立功能的程序。

它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行。

2> 模块编程和内核版本密切相连,因为不同的内核版本中某些函数的函数名会有变化。

因此模块编程也可以说是内核编程。

3> 特点:模块本身不被编译进内核映像,从而控制了内核的大小;模块一旦被加载,就和内核中的其他部分完全一样。

2 . 用户层编程和内核模块编程的区别应用程序内核模块程序使用函数libc库内核函数运行空间用户空间内核空间运行权限普通用户超级用户入口函数main()module_init出口函数exit()module_exit编译gcc makefile链接gcc insmod运行直接运行insmod调试gdb kdbug、kdb、kgdb二 . 说了这么多,那么怎么编写一个内核模块的程序呢?1. 我们先来看两个最简单的函数实例,也是几乎所有程序员在学习一门新语言时都会编写的程序:输出 hello world!现在我们分别用模块编程输出 hello world! ,和在用户层编程输出 hello wrold !。

通过这两个程序我们来分析下如何来编写一个内核模块程序。

用户层编程: hello.c#include<stdio.h>int main(void){printf("hello world/n");}内核编程 : module.c#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>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 语言的同学对第一个程序都是没有问题的。

linux内核模块及内核编译过程

linux内核模块及内核编译过程

Linux内核模块及内核编译过程一、引言Linux内核是Linux操作系统的核心组件,负责管理系统的硬件和软件资源。

内核模块是一种动态加载到内核中的代码,用于扩展和添加新的功能。

本文将介绍Linux内核模块的概念、编写方法以及内核编译过程。

二、Linux内核模块内核模块是一种动态加载到内核中的代码,用于扩展和添加新的功能。

它是一种轻量级的解决方案,可以在不重新编译整个内核的情况下添加或删除功能。

内核模块可以使用内核提供的API,以实现与内核其他部分的交互。

编写内核模块需要了解内核的内部结构和API。

通常,内核模块是用C语言编写的,因为C语言与汇编语言有良好的交互性,并且内核本身也是用C语言编写的。

编写内核模块的基本步骤如下:1.编写模块的源代码:使用C语言编写模块的源代码,并确保遵循内核的编码风格和约定。

2.编译模块:使用内核提供的工具和方法将源代码编译成模块。

3.加载和卸载模块:使用insmod命令将模块加载到内核中,使用rmmod命令卸载模块。

三、内核编译过程内核编译是将源代码转换成可在计算机上运行的二进制代码的过程。

Linux内核的编译过程可以分为以下几个步骤:1.配置内核:使用make menuconfig或make xconfig等工具,根据需要选择要包含在内核中的功能和选项。

2.生成Makefile:根据配置结果生成Makefile文件,该文件用于指导make命令如何编译内核。

3.编译内核:使用make命令根据Makefile编译内核。

这个过程包括编译源代码、生成目标文件、链接目标文件等步骤。

4.安装内核:将编译好的内核映像安装到系统中,以便在启动时加载。

5.配置引导加载程序:将引导加载程序配置为加载新编译的内核映像。

四、总结本文介绍了Linux内核模块的概念、编写方法以及内核编译过程。

通过了解这些知识,我们可以更好地理解Linux操作系统的内部原理,并根据需要定制和优化系统的功能。

编译Linux系统内核的方法步骤

编译Linux系统内核的方法步骤

编译Linux系统内核的方法步骤1.需要先安装编译环境进入root 帐户:> su输入密码安装必要的工具:> apt-get install build-essential(安装gcc, make 等)> apt-get install libncurses-dev(安装make menuconfig 时必须的库文件)> apt-get install kernel-package, fakeroot(Debian 系统里生成kernel-image 的一些配置文件和工具)> apt-get install initramfs-tools, module-init-tools2.安装kernel-source:可以从Ubuntu 的源安装,这样的好处是简单,而且安装的内核是Debian 化了的,缺点是内核不是最新的内核。

> apt-get install linux-source也可以从 下载内核安装。

的境象应该很多,选一个最快的来下载,因为要下载的文件很大。

我这里介绍的是安装 2.6.24 的内核,加上了ck 的补丁。

下载linux-2.6.24.tar.bz2 和patch-2.6.24.bz2 ,并且把它们都存放在/usr/src 目录下。

> tar xvjf linux-2.6.24.tar.bz2> ln -s linux-2.6.24 linux(如果已经有了linux 目录,则要先将其删除)> cd linux> bzcat ../patch-2.6.24.bz2 | patch -p1至此,内核源文件以及补丁就都安装好了。

3.编译内核把源码包解压到/usr/src/linux-2.6.24,然后在/usr/src/下创建一个名为linux 的指向/usr/src/linux-2.6.24的链接(link)。

在shell中输入root@FE2000:~# cd ..root@FE2000:/# cd /usr/src/linuxroot@FE2000:/usr/src/linux# make mrproperroot@FE2000:/usr/src/linux# make menuconfig或者make gconfig此时qconf已经读取了默认配置,你也可以这样做:在qconf中点File->Load 去读取其他的设置文件。

ubuntu内核编译

ubuntu内核编译

ubuntu内核编译Ubuntu下Linux3.9.1内核编译1,安装vmtools,参考⽹上教程2,设置⽂件共享。

在“虚拟机”点击“管理”,右侧有“共享”,将主机的⽬录指向⼀个已经共享的⽂件夹,在ubuntu的/mnt/hgfs可以见到共享的⽂件,考到主⽂件⽬录下随便建的⼀个⽬录www,也可以直接重启拖拽这是fedora⽅式的,Ubuntu也⼀样3,解压⽂件Tar: tar xvf XXXXX.tar.gz: gzip -d XXXX.gz.tar.gz tar zxvf XXXX.tar.gzBz2 bzip2 –d XXXX.bz2.tar.bz2 tar jxvf XXXX.tar.bz2注意⾃⼰内核的后缀名,否则会出现错误4编译Make mrproper //删除以前编译留下的临时⽂件安装编译环境Sudo apt-get updateApt-get install libncurses5-devApt-get install build-essential //编译⼯具Apt-get install kernel-package配置内核:make menuconfig可以直接save,exit直接⽣成.config⽂件。

开始编译;Make –j4编译的过程6、加⼊模块make modules_install7、⽣成可执⾏的内核引导⽂件make bzImage(i字母要⼤写)cp arch/i386/boot/bzImage /boot/vmlinuz-3.9.1 //将内核镜像⽂件复制到boot⽬录下8、将System.map复制到/boot下:cp System.map /boot/System.map-3.9.19、⽣成initrd.img⽂件cd /lib/modules/3.9.1 //会有所隐藏,可以⽤ls –a查看隐藏⽂件update-initramfs –c–k 3.9.110、⾃动查找新内核,并添加⾄grub引导:#update-grub2#update-grub12、重启系统#reboot重启后,进⼊终端使⽤uname –a命令可以看到内核编译的结果。

编译linux内核说明

编译linux内核说明

在ubuntu 操作系统下配置、编译linux内核说明一、建立共享文件夹1、在打开VMware 虚拟机,选中ubuutu 虚拟机文件,不要启动,在虚拟机设置options 下打开shared Folders ,并设置共享文件夹(即将windows下的文件夹共享到 linux 文件系统中 /mnt/hgfs)如果在/mnt/下没有文件夹或共享文件,则需要在linux,在虚拟机管理菜单中安装vmware tools2、在ftp://172.21.73.244//交作业/程顺/课程设计技术资料/提供了linux-2.6.28.8 的内核源码, busybox 源码, u -bo o t 源码,交叉编译器和制作好的文件系统的源文件等资料。

将这些文件拷贝到共享文件夹。

(或者拷贝到U盘,再在Linux环境中打开U盘,拷贝文件)二、建立交叉开发环境1、解压编译器,按图所示命令进行。

解压完成好在 /opt/EmbedSky/4.3.3/bin 下应有上图所示目录。

2 、用命令cd /etcsudo gedit .profile在 .profile 文件中增加一行PATH=$PATH:/opt/EmbesSky/4.3.3/binexport PATH保存退出;运行命令source .profile运行命令arm-linux-gcc –v检查是否出现如下显示内容三、配置剪裁linux内核1 、按照上述操作,首先将linux内核拷贝到home 文件夹执行如下命令sudo tar –xvfj linux-2.6.28.8_v0.1.tar.gz2 –C /opt2 、进入 linux源文件目录执行如下命令cd /opt/EmbesSky/linux-2.6.28 目录下3 执行命令make menuconfig四、编译内核执行命令 make。

Ubuntu内核编译

Ubuntu内核编译

Ubuntu环境下编译linux-2.6.36内核操作手册一、系统环境和原始内核版本:1、ubuntu 10.04操作系统&&linux-2.6.32-21-generic内核版本二、操作步骤1、环境配置安装必备软件编译工具:#apt-get install libncurses5-dev build-essential kernel-package注意:(1)libncurses5-dev是为之后配置内核能运行 make menuconfig程序做准备Build-essential为编译工具,kernel-package是编译内核工具(2)如果系统显示无法查找到这三个文件,输入#apt-get update更新数据源。

进入root用户权限(本文全程超级用户操作):#sudo passwd root (第一次进入超级用户需设置密码)#su (设置完超级用户密码后命令su直接登录)2、下载内核登录下载最新版本内核,本文下载linux-2.6.36.tar.bz2,ubuntu默认下载目录为/home/XX(your name)/Downloads/3、解压缩#cd /usr/src/usr/src# tar xrf /home/XX/Downloads/linux-2.6.36.tar.bz24、配置内核/usr/src# cd linux-2.6.36/usr/src/linux-2.6.36#make menuconfig注:可以直接save,exit直接生成.config文件,也可以使用当前系统配置文件,使用当前系统配置文件方法:/linux-2.6.36#cp /boot/config-XX ./.config,然后进入menuconfig 选择load选项。

5、编译内核/usr/src/linux-2.6.36#make (也可以用make –j4命令据说可以节约时间,但是个人用下来觉得没什么区别。

UBUNTU如何编译一个内核

UBUNTU如何编译一个内核

如何编译一个内核- Ubuntu方式日期:2006-11-21作者:赵珂译来自:每一个Linux发行版都有自己专门的工具去构建自定义的内核. 本文主要介绍在Ubuntu平台上编译内核, 如何从(也叫vanilla kernel新且未改动的内核源代码来构建一个自定义的内核, 这样你可以使用自己的内核而不是发行版的内核, 另外也介绍了如何给内核打补方便增加新的功能.下面的工作我都在Ubuntu 6.10 Server ("Edgy Eft")和Ubuntu 6.06 Desktop ("Dapper Drake")上经过了测试.先要说的是文章中构建自定义内核的方式不是唯一的, 还有许多其它的方式, 这不过是我习惯的方式. 我不能保证使用后不会出现任1. 预备工作我推荐使用root用户执行下面所有的步骤. 如果你还没有创建root登陆口令, 请运行下面的命令:sudo passwd root然后, 以root身份登陆:su如果你想使用一般用户来替代root用户, 记住在本文所有命令前输入sudo, 比如当我运行apt-get update你需要运行下面的命令来替代, 等.sudo apt-get update1.1 Ubuntu 6.10上的/bin/sh ("Edgy Eft")tu 6.10, /bin/sh缺省是一个链接到/bin/dash的字符链接. 当你编译软件源代码的时候, /bin/dash似乎还存在问题. 至少我已经遇到了一所以我把/bin/sh链接到了/bin/bash.如果你使用Ubuntu 6.10, 现在你可以运行:rm -f /bin/shln -s /bin/bash /bin/sh2 安装必需的软件包(为内核编译做准备)首先我们升级软件(包)库:apt-get update然后我们安装所有需要的软件包:apt-get install kernel-package libncurses5-dev fakeroot wget bzip23 下载内核源代码接下来我们下载需要的内核到/usr/src目录(去载你需要的内核版本, 比如. linux-2.6.18.1tar.bz2(你可以从这里下载所有的2.6内核: /pub/linux/kernel/v2.6/). 然后/usr/src目录:cd /usr/srcwget /pub/linux/kernel/v2.6/linux-2.6.18.1.tar.bz2然后解压内核源代码, 创建一个指向内核源代码目录的linux字符链接:tar xjf linux-2.6.18.1.tar.bz2ln -s linux-2.6.18.1 linuxcd /usr/src/linux4 给内核源代码打补丁(可选)的缺省内核不支持新买的设备, 你需要安装新的驱动. 或者你需要使用虚拟技术或其它高级的技术, 而这些现有的内核都不支持. 这样你需要给给内核源代码打补丁(当然补丁已经发布..)在我们假设你已经下载需要的补丁(以下例子我叫它patch.bz2)到/usr/src. 运行下面的命令给内核源代码直接打上补丁(你的用户必须位/usr/src/linux目录):bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-runbzip2 -dc /usr/src/patch.bz2 | patch -p1个命令用于测试, 对内核没有任何影响. 如果没有显示错误, 你可以运行第二个命令给内核打补丁. 如果第一个命令有误, 请务继续的你也能够通过内核的prepatches方式打补丁. 比如, 如果你需要一个功能, 而这个功能仅存在于2.6.19-rc4中, 正式完整的内核版本仍没有发布, 而2已经发布. 你可以把这个补丁打到2.6.18的内核源代码中,但请不要达到2.6.18.1或2.6.18.2, 等. 这个规则在接下来的网页中注明:/patchtypes/pre.htmlprepatches等同于linux中的测试发行; 他们位于存档的测试目录中,我们可以使用patch(1)工具对上一个完整发行版(版本号分三部分)打补丁(例如, 2.6.12-rc4prepatch只可以给2.6.11内核源代码打补丁, 而不是2.6.11.10.)所以如果你想编译2.6.19-rc4内核, 你必须在步骤3.1下载2.6.18(/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2)替代2.6.18.1内核源代码!下面是如何给2.6.18打上2.6.19-rc4补丁:cd /usr/srcwget /pub/linux/kernel/v2.6/testing/patch-2.6.19-rc4.bz2cd /usr/src/linuxbzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1 --dry-runbzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p15. 配置内核使用当前工作内核的配置文件做为新内核配置文件的基础是一个很好的主意. 因此我们拷贝已存的配置文件到/usr/src/linux:cp /boot/config-`uname -r` ./.config然后运行make menuconfig们看到内核的配置菜单. 移动绿色光标到Load an Alternate Configuration File 行后选择.config文件(包含了当前工作内核的配置)做为配内核配置菜单, 选择你需要的功能. 完成配置后, 选择Exit, 回答下面的问题(Do you wish to save your new kernel configuration? 你希的内核配置吗?), 选择Yes:6 构建内核执行下面命令来构建内核:make-kpkg cleanfakeroot make-kpkg --initrd --append-to-version=-custom kernel_imagekernel_headers在--append-to-version= 后面你可以写上任何字符串来区别内核版本, 但是必须以" - "符号开始而且后面不包括任何空格.保持耐心, 内核编译需要一定时间, 主要看你的内核配置和处理器速度.7 安装新内核在成功构建内核后, 你在/usr/src目录能发现两个.deb软件包.cd /usr/srcls -l在我的测试系统上, 他们分别名为linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb(包含了实际的内核) 和linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb(包含了需要的文件, 用于以后需要编译额外的内核模块). 我是这样安装的:dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.debdpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb(现在你甚至能够拷贝这两个.deb文件到其它的Ubuntu系统, 通过上面的方式安装. 你将不再需要编译内核.)然后检查/boot/grub/menu.lst文件, 现在你将能发现新内核使用的两个引导配置块:vi /boot/grub/menu.lst在我测试系统上已经添加好的引导配置块是这样的:title Ubuntu, kernel 2.6.18.1-customroot (hd0,0)kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splashinitrd /boot/initrd.img-2.6.18.1-customsavedefaultboottitle Ubuntu, kernel 2.6.18.1-custom (recovery mode)root (hd0,0)kernel /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro singleinitrd /boot/initrd.img-2.6.18.1-customboot现在重启系统:shutdown -r now如果一切进展顺利, 你的新内核正常工作. 你还可以通过运行下面命令来检查新内核是否运行:uname -r这将会显示如:2.6.18.1-custom如果系统没有起来, 重启一下, 你会看到:按ESC进入GRUB菜单:选择你以前的内核启动系统, 现在你能再次尝试编译新的工作内核. 不要忘记从/boot/grub/menu.1st文件中移去不需要的引导内核信息===================================================================================================== ===================================================================================================== =================================================另一篇=====================================================================================================================================================编译Linux2.6 内核总结在X86, Ubuntu 上编译Linux2.6内核,总结如下:基础知识绍如何编译内核之前, 需要对内核相关概念有一定的了解. 关于Linux kernel的介绍浩如烟海, 这里只介绍系统中相关的目录, 文件及/boot/boot/vmlinuz- : 用于启动的压缩内核镜像, 它也就是/arch//boot中的压缩镜像./boot/system.map- : 存储内核符号地址./boot/initrd.img- : 初始化RAM硬盘时, 用来存储挂载根文件系统所需的模块./boot/grub/menu.lst : grub的配置文件. (不同的发行版中它可能位于不同位置./lib/modules包含了内核模块及其他文件. 注意, modules中一般会有多个目录: 系统自带的内核模块在这里, 你编译自己的内核模块后, 它们也会被不同的目录由内核版本号来区分. 即modules里目录的名称是内核版本号. (使用$ uname -r 可知当前系统内核所用的模块位于哪个目/lib/modules//build为该版本的内核编译新模块所需的文件. 包括Makefile, .config, module.symVers(模块符号信息), 内核头文件(位于include/, include/asm/lib/modules//kernel储存内核目标文件(以.ko为后缀). 它的目录组织和内核源代码中kernel的目录组织相同./lib/modules//中:modules.alias : 模块别名定义. 模块加载工具使用它来加载相应的模块.modules.dep : 定义了模块间的依赖关系.modules.symbols : 指定符号属于哪个模块.这些文件都是文本文件, 可以查看它们.$ uname -runame(1)被用来查看系统信息, 这里对我们有用的是它的"-r"选项, 它显示内核版本信息.下载内核, 验证签名, 解压缩到/pub/linux/kernel/下载最新版本的2.6内核. 速度还比较快. 这里以linux-2.6.17.13为例:1, 下载内核压缩包格式比gzip压缩效率更高, 一般就下载bz2的压缩包. 下载了内核压缩包之后, 还可下载对应的sign文件. 它被用来验证内核压缩文openPGP签名. 详细信息可参考这里.$ wget -c /pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2$ wget -c /pub/linux/kernel/v2.6/linux-2.6.17.13.tar.bz2.sign2, 验证签名gp的服务器获取签名公匙, linux内核包的公匙编号是0x517D0F0E. 再利用sign文件来验证.bz2压缩包的签名. 如果输出中有类似gsignature from "LinuxKernel Archives Verification Key " 的内容,说明该包是有效的. 后面给出的警告信息可以忽略.$ gpg --keyserver --recv-keys 0x517D0F0E$ gpg --verify linux-2.6.17.13.tar.bz2.sign linux-2.6.17.13.tar.bz2GPG签名只是保证镜像网站提供的压缩包和所提供的是相同的, 如果你在下载, 不需要验证签名.3, 解压缩解压缩之前, 有个问题值得思考: 要将压缩包解压到何处? 即要在哪个目录进行Linux内核源代码的编译?内核源码树的README中有这样一段话:Do NOT use the /usr/src/linux area! This area has a(usually incomplete) set of kernel headers that are used by the libraryheader files. They should match the library, and not get messedup by whatever the kernel-du-jour happens to be.实际上, 在我的Ubuntu系统中, /usr/src/ 目录中最初是没有linux目录的. 你可以在/usr/src中新建一个目录,用内核版本命名, 比如/usr/src/linux-2.6.17.13. 这样, 即便之前在/usr/src中安装了linux的头文件,也不会对它们造成影响.我采用的方法是: 在/usr/local/src/kernel目录中进行.核时候, 若在make 后添加"O="将会使生成的目标文件(包括.config)被放置到指定的目录. 否则, 生成的目标文件默认地被放到内核源我们就采用默认的方法. 这是安全的.4, 打补丁中的内核, 我个人认为没必要下载patch, 再打补丁. 费那事干嘛, 直接下载bz2包不就行了. 特定的补丁只能针对紧随其前的一比如你想从2.6.17.1升级到2.6.17.13. 你得打12次补丁, 忒麻烦了.但是, 有时候需要对"官方内核"添加补丁, 以支持特定的系统. 比如ARMLinux, 它往往不是发布完整的内核,而是发布针对特定版本的补丁包. 这种情况下就要知道如何打补丁了. 方法很简单: 把补丁下载, 解压.得到patch-. 将它放到解压后的内核目录树的父目录中(也就是补丁和内核目录在同一目录). 然后cd到内核目录树中运行:$ patch -p1配置内核1, 前提: 构建编译环境显然, 需要make, gcc等工具, 在Ubuntu中, 只需一条简单命令就可安装所有的源代码编译工具:# apt-get install build-essential当然, 如果你的内核是要安装到不同体系结构的目标系统中, 还需要构建cross编译环境.2, 内核配置工具介绍Linux提供了多种内核配置工具, 最基础的是make config, 它列出每个编译选项, 而且是基于文本的, 一般不用它.menuconfig (make menuconfig)menuconfig是比较主流的配置工具, 它需要curse库的支持, 在Ubuntu中默认是没有的, 先安装它:# apt-get install libncurses5-devxconfig (make xconfig)xconfig基于X11, 使用qt库, 在Ubuntu中先安装qt库:# apt-get install libqt3-headers libqt3-mt-dev3, 内核配置相关.config配置文件树的根目录中,有一个.config文件,它记录了内核的配置选项,可直接对它进行修改,再运行(若.config不存在,对内核进行配置后会情况下当然不能开始就运行oldconfig). 实际上, 如果你手头有合适的.config 文件, 可以运行make oldconfig 直接按.config 的内容来$ sudo make oldconfig对内核的配置都是围绕.config 来展开的. 即便开始.config 文件不存在, 进行配置后会创造它.直接在menuconfig中加载已有的配置文件, 不要将它改名为.config. 否则完成配置, 退出menuconfig时会提示你运行make mrprope到的方法只是比较适合于oldconfig!make相关命令$ make oldconfig : 基于已有的.config进行配置, 若有新的符号, 它将询问用户.efconfig : 按默认选项对内核进行配置(386的默认配置是Linus做的).$ make allnoconfig : 除必须的选项外, 其它选项一律不选. (常式系统).$ make clean : 删除生成的目标文件, 往往用它来实现对驱动的重新编译.$ make mrproper : 删除包括.config在内的生成的目标文件.可以查看内核源码树中的README和Makefile了解上述配置方法.4, 开始配置1, 修改Makefile (可选)在Makefile中, 有这样的内容:VERSION = 2PATCHLEVEL = 6SUBLEVEL = 16EXTRA VERSION = .20NAME=Sliding Snow Leopard编译内核之前, 可以先修改Makefile中的版本信息(一般是修改EXTRA VERSION, 比如EXTRA VERSION =-zp). 这样就能将自己编译别人编译的相同版本内核区分开来. 修改, 编译之后, 可使用$ uname -r 查看内核版本信息.上, 从2.6.8的版本起可在内核版本号后面添加个性化字符串. 所以也就没有必要修改Makefile了: () Local version - append to kernel 果你即修改了Makefile中的EXTRA VERSION, 又在配置时定义了local version. 那么local version所定义的字符串将位于末尾, 紧跟EXTRAVERSION的值之后.另外, 如果要用到ccache, 也需要修改Makefile. 参考后面的内容!2, 准备一个.config文件.内核配置选项众多, 一个个去配置相当麻烦. 建议使用手头已有的配置文件. 如果你手头没有, 有多种方法获得它:(1) 使用make defconfig将在源码树的根目录得到.config.(2) 使用当前系统内核的配置文件, 一般位于/boot目录中. 它的名称并不是.config.(3) 使用别的发行版提供的配置文件(网上去下载).kware的.config是个不错的起点. 在它的配置文件基础上作出适合自己系统的修改, 比较方便. 也可以拷贝发行版提供商的.config文3, 建议配置步骤:(1) 将配置文件(不要将它命名为.config!)拷贝到内核源码树根目录.(2) make menuconfig, 然后将上述的配置文件加载进去.(3) 配置完成后, 将生成的配置文件备份(.config, 也可以在menuconfig中指定生成的配置文件名).配置选项是最头疼的问题: 配置时候注意驱动的问题,尤其是网络驱动. 使用pppoe 的话, 要选上ppp 相关的选项. 网卡驱动也要注意, 我刚开始配置的时候, 只加上了lspci | grep Ethernet 对应的网卡, 但是重启后找不到eth0, 一怒之下, 把所有的1000M 网卡驱动都选为模块. 总算成功.以后有空仔细看看. 再就是声卡驱动也要注意.可参考我blog里另一篇文章:配置2.6内核选项注解也可以到Linux Kernel Configuration Archive看一看, 虽然它里面的内容与图形化配置工具中的help大同小异.编译内核后,就要进行编译了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中的另一个文件/proc/kallsyms。
这就是在2.6.xx下一个最简单的模块编写过程。
-
如果没有输出"hello from hello
world",因为如果你在字符终端而不是终端模拟器下运行的话,就会输出,
因为在终端模拟器下时会把内核消息输出到日志文件/vห้องสมุดไป่ตู้r/log/kern.log中。
#sudo rmmod ./hello再用dmesg 可以看到 Bye world!
modutils是管理内核模块的一个软件包。可以在任何获得内核源代码的地方
头文件kernel.h包含了常用的内核函数。
头文件init.h包含了宏_init和_exit,它们允许释放内核占用的内存。
lkp_init是模块的初始化函数,它必需包含诸如要编译的代码、初始化数据结构等内容。
使用了printk()函数,该函数是由内核定义的,功能与C库中的printf()类似,它把要打印的信息输出
{
printk(KERN_ALERT "Bye World!\n");
}
module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_AUTHOR("heyutao");
MODULE_DESCRIPTION("hello");
说明
所有模块都要使用头文件module.h,此文件必须包含进来。
make -C $(KERNELBUILD) M=$(shell pwd) modules 编译内核模块。-C
将工作目录转到KERNELBUILD,调用该目录下的Makefile,并向这个Makefile传递参数M的值是
$(shell pwd) modules。
3. 编译模块
#sudo make (调用第一个命令default)
*.markers *.order *.symvers .tmp_versions
(注意makefile里面要求的tab)
KERNELBUILD :=/lib/modules/$(shell uname -r)/build是编译内核模块需要的Makefile的路径,
Ubuntu下是
/lib/modules/2.6.31-14-generic/build
程序把需要插入的模块以目标代码的形式插入到内核中。在插入的时候,insmod自动调用init_module()
函数运行。注意,只有超级用户才能使用这个命令,其命令格式为:#
insmod [path] modulename.ko2.
rmmod命令调用rmmod程序将已经插入内核的模块从内核中移出,rmmod会自动运行cleanup_module()函数,其命令格式为:#rmmod
获取Modutils(modutils-x.y.z.tar.gz)源代码,然后选择最高级别的patch.x.y.z等于或
小于当前的内核版本,安装后在/sbin目录下就会有insomod、rmmod、ksyms、lsmod、modprobe
等实用程序。当然,通常我们在加载Linux内核时,modutils已经被载入。1.Insmod命令调用insmod
[path]
modulename.ko3.lsmod命令调用lsmod程序将显示当前系统中正在使用的模块信息。实际上这个程序的
功能就是读取/proc文件系统中的文件/proc/modules中的信息,其命令格式为:#lsmod4.ksyms命令
ksyms这个程序用来显示内核符号和模块符号表的信息。与lsmod相似,它的功能是读取/proc文件系统
Ubuntu下编译的第一个内核模块
一、 什么是模块
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为
内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构
组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。
应用程序与内核模块的比较
2 编写Makefile 文件,与hello.c 放在同一个目录里
obj-m := hello.oKERNELBUILD :=/lib/modules/$(shell uname -r)/builddefault: make
-C $(KERNELBUILD) M=$(shell pwd) modulesclean: rm -rf *.o *.ko *.mod.c .*.cmd
和“我走了”。
二、 编写一个简单的模块
模块和内核都在内核空间运行,模块编程在一定意义上说就是内核编程。因为内核版本的每次变化,
其中的某些函数名也会相应地发生变化,因此模块编程与内核版本密切相关。以下例子针对Ubuntu
9.10 内核2.6.31-14-generic
1.程序举例
#include
为了加深对内核模块的了解,表一给出应用程序与内核模块程序的比较。
表一 应用程序与内核模块程序的比较
从表一我们可以看出,内核模块程序不能调用libc库中的函数,它运行在内核空间,且只有超级用户
可以对其运行。另外,模块程序必须通过module_init()和module-exit()函数来告诉内核“我来了”
到终端或系统日志。
lkp_cleanup是模块的退出和清理函数。此处可以做所有终止该驱动程序时相关的清理工作。
module_init()和cleanup_exit()是模块编程中最基本也是必须的两个函数。
module_init()是驱动程序初始化的入口点。而cleanup_exit()注销由模块提供的所有功能。
#include
#include
MODULE_LICENSE("GPL");
static int __init lkp_init(void)
{
printk(KERN_ALERT "Hello World!\n");
return 0;
}
static void __exit lkp_cleanup(void)
这时,在hello.c 所在文件夹就会有 hello.ko ,这个就是我们需要的内核模块啦
#sudo make clean
清理编译垃圾,hello.ko 也会清理掉。
4. 插入模块,让其工作。注意必须是root权限
#sudo insmod ./hello.ko我们用dmesg 就可以看到 产生的内核信息啦,Hello world!
相关文档
最新文档