编译和安装linux内核2.6.24,并且写一个简单的内核驱动测试之

本文介绍如何在CentOS 5.1上编译Linux内核及安装过程,并提供了一个简单的“Hello World”驱动示例。文章涵盖了内核源代码的下载、编译配置、启动项设置及驱动程序的编写、编译与加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


好久没有编译过内核了,最近要弄驱动,查看了一下在/usr/src下面有两个文件夹,里面都是空的,没有任何内核源代码。
我用的是CentOS 5.1,其实红帽系列在redora出现之后就一直没有附带linux内核源代码了,所以这些个头文件什么的在你安装好系统那刻起是都不会有的了。
当然了,不管是什么发行版本的linux系统,下面方法都应该适用。
自己从新安装一个就是,现下载:
www.kernel.org下载,如图:


下载后解压到/usr/src下:
bzip2 -dc linux-2.6.24.4.tar.bz2 | tar xvf -
把文件夹linux-2.6.24.4改名字为:linux-kernel


随便在哪个文件夹下面,编写一个shell文件名叫a.sh,内容如下:
   #! /bin/bash
   mkdir  -p /home/name/build/kernel
   cd /usr/src/linux-kernel
   make mrproper
   make O=/home/name/build/kernel menuconfig
   make O=/home/name/build/kernel
   sudo make O=/home/name/build/kernel modules_install install


然后打开一个终端执行
bash  a.sh
shell文件里面O=/home/name/build/kernel表示编译配置在=号后面的文件夹里面进行,中间可以自己查看一下。
后面的过程除了在配置内核的时候,都可以不管了。
这个过程会自动生成新的的内核启动映象,并且自动复制到/boot目录下面去,不用手动复制了。


之后修改grub.conf文件,让以后的系统用新的的内核启动:
vim /etc/grub.conf
内容如下:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,6)
#          kernel /boot/vmlinuz-version ro root=/dev/sda7
#          initrd /boot/initrd-version.img
#boot=/dev/sda
default=2
timeout=5
splashimage=(hd0,6)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.24.4)
    root (hd0,6)
    kernel /boot/vmlinuz-2.6.24.4 ro root=LABEL=/ rhgb quiet
    initrd /boot/initrd-2.6.24.4.img
title CentOS (2.6.18-53.el5)
    root (hd0,6)
    kernel /boot/vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet
    initrd /boot/initrd-2.6.18-53.el5.img
title Windows XP
    rootnoverify (hd0,0)
    chainloader +1

把这一部分注释掉:
title CentOS (2.6.18-53.el5)
    root (hd0,6)
    kernel /boot/vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet
    initrd /boot/initrd-2.6.18-53.el5.img
修改为
#title CentOS (2.6.18-53.el5)
#    root (hd0,6)
#    kernel /boot/vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet
#   initrd /boot/initrd-2.6.18-53.el5.img

再修改default = 0,这里0对应第一个title,下面一次类推
重启就可以了。

编译内核的输出文件太大了,就是开始的/home/name/build/kernel,把这个文件夹可以删除了最后。要写驱动的话,不要删除。

写一个最简单的驱动程序:hello.c

/*======================================================================

    A simple kernel module
:   " hello world "      


======================================================================*/

# include <linux/init.h>

#include <linux/module.h>


MODULE_LICENSE(
" Dual BSD/GPL " );

static 
int  hello_init(void)

{

  printk(KERN_ALERT 
"  Hello World enter " );

  
return   0 ;

}



static void hello_exit(void)

{

  printk(KERN_ALERT 
"  Hello World exit   " );

}



module_init(hello_init);

module_exit(hello_exit);



MODULE_AUTHOR(
" ztz0223 " );

MODULE_DESCRIPTION(
" A simple Hello World Module " );

MODULE_ALIAS(
" a simplest module " );

然后写一个Makefile

如下:

PWD = $(shell pwd)
KERNEL_SRC = /usr/src/linux-2.6.24.4/

obj-m := hello.o
module-objs := hello.o

all:
    $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules
   
clean:
    rm *.ko
    rm *.o

打开终端进入到hello.c路径下make,2.6的内核好像不支持用gcc直接编译了,要用make,如下:

[root @BTazuo  azuo] #  cd hello  //进入驱动程序的路径,此部分是注释
[root @BTazuo  hello] #  dir
hello . c  Makefile
[root
@BTazuo  hello] #  make    //编译
make  - / lib / modules / 2.6 . 24.4 / build M =/ azuo / hello  modules
make[
1 ] :  Entering directory ` / usr / src / linux - 2.6 . 24.4 '
  CC [M]  /azuo/hello/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /azuo/hello/hello.mod.o
  LD [M]  /azuo/hello/hello.ko
make[1]: Leaving directory `/usr/src/linux-2.6.24.4
'
[root
@BTazuo  hello] #  dir //编译成功
hello . c  hello . ko  hello . mod . c  hello . mod . o  hello . o  Makefile  Module . symvers
[root
@BTazuo  hello] #


加载和卸载驱动:

[root @BTazuo  hello] #  insmod ./hello.ko
[root @BTazuo  hello] #  rmmod ./hello.ko

打开/var/log/messages文件可以看到,最后有内核加载和卸载的信息:

 Hello World enter
 Hello World exit
表示内核加载和卸载成功!
共计8个压缩包 本压缩包是:part01.rar 出版社:人民邮电出版社 ·页码:368 页 ·出版日期:2008年 ·ISBN:7115187118/9787115187116 ·条形码:9787115187116 ·包装版本:1版 ·装帧:平装 ·开本:16 ·中文:中文 ·附带品描述:附光盘一张 ·市场价格:49元 内容简介 Linux内核Linux操作系统中最核心的部分,用于实现对硬件部件的编程控制接口操作。《Linux2.6内核标准教程》深入、系统地讲解了 Linux内核的工作原理,对Linux内核的核心组件逐一进行深入讲解。 全书共8章,首先讲解Linux系统的引导过程;然后对Linux内核的3大核心模块——内存管理、进程管理、中断异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量RCU这两种新的 同步机制。 《Linux2.6内核标准教程》适合Linux内核爱好者、Linux驱动开发人员、Linux系统工程师参考使用,也可以作为计算机及相关专业学生深入学 习操作系统的参考书。 引用: 目录 第1章 Linux内核学习基础 1 1.1 为什么研究Linux内核 2 1.1.1 Linux的历史来源 2 1.1.2 Linux的发展现状 3 1.1.3 Linux的前景展望 3 1.2 选择什么版本进行研究 3 1.3 内核基本结构 4 1.3.1 内核在操作系统中的地位 4 1.3.2 Linux 2.6内核源代码目录树简介 5 1.3.3 Linux 2.6内核的新特性 8 1.4 如何阅读本书 9 1.4.1 内核探索工具 10 1.4.2 推荐阅读方法 122章 引导过程分析 14 2.1 内核镜像的构建过程 15 2.1.1 编译内核的步骤及分析 15 2.1.2 内核镜像构建过程分析 16 2.2 系统引导过程分析 18 2.2.1 傀儡引导扇区 18 2.2.2 探测系统资源 21 2.2.3 解压内核镜像 35 2.2.4 进入保护模式 40 2.2.5 系统最终初始化 47 2.3 系统引导过程总结 47 第3章 内存管理 50 3.1 基础知识 51 3.1.1 存储器地址 51 3.1.2 分段机制 52 3.1.3 分页机制 59 3.2 内核页表的初始化过程 65 3.2.1 启用分页机制 65 3.2.2 构建内核页表 68 3.3 物理内存的描述方法 76 3.3.1 内存节点 77 3.3.2 内存区域 81 3.3.3 物理页框 85 3.4 物理内存的初始化过程 86 3.4.1 探测系统物理内存 87 3.4.2 初始化内存分配器 89 3.5 物理内存的分配与回收 101 3.5.1 伙伴分配算法 101 3.5.2 对象缓冲技术 103 3.6 内核地址空间 105 3.6.1 常规映射地址空间 105 3.6.2 固定映射地址空间 107 3.6.3 长久内核映射空间 109 3.6.4 临时内核映射空间 116 3.6.5 非连续映射地址空间 119 第4章 进程管理 128 4.1 进程与线程的概念 129 4.1.1 程序与进程 129 4.1.2 进程与线程 129 4.2 进程描述符 131 4.2.1 进程标识符 132 4.2.2 进程的状态 132 4.2.3 进程上下文 134 4.2.4 当前进程 139 4.3 进程的组织形式 143 4.3.1 进程标识符构成的哈希表 143 4.3.2 所有进程构成的双向链表 148 4.3.3 执行态进程组成的运行队列 149 4.3.4 阻塞态进程组成的等待队列 152 4.4 进程的创建过程 155 4.4.1 进程创建的接口函数 156 4.4.2 进程创建的处理过程 162 4.5 进程调度算法 177 4.5.1 进程的分类 178 4.5.2 进程优先级 178 4.5.3 时间片分配 181 4.5.4 进程调度时机 182 4.6 进程切换过程分析 183 4.6.1 选取合适进程 183 4.6.2 完成上下文切换 184 4.7 空闲进程的初始化 187 4.7.1 空闲进程的内核态栈 187 4.7.2 空闲进程的内存描述符 188 4.7.3 空闲进程的硬件上下文 190 4.7.4 空闲进程的任务状态段 190 第5章 中断异常 192 5.1 基础知识 193 5.1.1 中断异常的定义 193 5.1.2 中断异常的分类 193 5.1.3 中断异常的对比 194 5.2 处理机制 195 5.2.1 IA32架构下的处理机制 195 5.2.2 Linu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值