《linux内核设计与分析》内核模块编程
内核模块编程
一、准备工作
虚拟机:VMware Workstation 12
操作系统:ubuntu
当前内核版本:linux-headers-4.4.0-22-generic
二、有关于内核模块的知识
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。
内核模块的相关指令:
查看内核版本
uname –a
模块编译好后,将模块放入内核
insmod .ko
查看程序的输出
dmesg
卸载模块
rmmod
三、编译形成新内核
根据学姐的代码:
Makefile
obj-m:=.o
CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL_PATH:=/usr/src/linux-headers-4.4.--generic
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
第1行:产生1模块的目标模块
第2行:模块所在的当前路径
第3行:LINUX_KERNEL_PATH后面要写你自己的内核版本对应的内核源码包地址。
make-C $(LINUX_KERNEL_PATH) 指明跳转到内核源码目录下读取那里的Makefile,M=$(CURRENT_PATH) 表明返回到当前目录继续执行当前的Makefile。
第5行:模块编译
第7行:清理
1.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h> static struct task_struct *pcurrent;
static int __init print_init(void)
{
printk(KERN_INFO "print current task info\n");
printk("pid\ttgid\tprio\tstate\n");
for_each_process(pcurrent){
printk("%d\t",pcurrent->pid);
printk("%d\t",pcurrent->tgid);
printk("%d\t",pcurrent->prio);
printk("%ld\n",pcurrent->state);
}
return ;
} static void __exit print_exit(void)
{
printk(KERN_INFO "Finished\n");
}
module_init(print_init);
module_exit(print_exit);
第1行:linux/kernel.h包含了常用的内核函数。
第2行:linux/module.h是必要的头文件,内核模块代码中必须包含。
第3行:linux/init.h含了宏_init和_exit,它们允许释放内核占用的内存。
第12行:Printk的功能类似于C语言中的printf,这个函数是由内核定义的。
先make生成1.ko文件等,在insmod 1.ko将模块放入内核,最后dmesg查看所编译程序的输出

四、遇到问题
在make这一步所遇到的基本所有问题都是因为.c文件出错所造成的。
还有一个问题就是在之前加载过模块之后再进行加载时会出现错误,这时将模块卸载了再进行加载就可以了。
《linux内核设计与分析》内核模块编程的更多相关文章
- 《Linux内核设计与分析》第六周读书笔记——第三章
<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...
- 《Linux内核设计与分析》第十七章读书笔记
设备与模块 关于设备驱动和设备管理,四种内核成分. 设备类型:在所有Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对象:内核数据 ...
- 《Linux内核设计与分析》第四章读书笔记
<内核设计与实现>第四章读书笔记 第四章:进程调度 进程(操作系统)程序的运行态表现形式. 进程调度程序,它是确保进程能有效工作的一个内核子系统. 调度程序负责决定将哪个进程投入运行,何时 ...
- 《Linux内核设计与实现》学习记录一
chapter1 Linux内核简介 前言:Unix是一个具有相似应用程序编程接口(API)并且基于相似设计理念的操作系统家族. 1.1 Unix的历史 1.Unix演化版实现了任务管理.换页机制.T ...
- 初探内核之《Linux内核设计与实现》笔记下
定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...
- 初探内核之《Linux内核设计与实现》笔记上
内核简介 本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核 原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...
- Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理
Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...
- Linux内核设计第四周——扒开系统调用三层皮
Linux内核设计第四周 ——扒开系统调用三层皮 一.知识点总结 (一).系统调用基础知识 1.用户态和内核态 内核态:在高级别的状态下,代码可以执行特权指令,访问任意的物理地址: 用户态:在相应的低 ...
- 《Linux内核设计与实现》CHAPTER1,2阅读梳理
<Linux内核设计与实现>CHAPTER1,2阅读梳理 [学习时间:2.5hours] [学习内容:Linux内核简介——历史与现今版本:Linux内核源代码以及编译] CHAPTER1 ...
随机推荐
- system函数的应用
system函数的两个简单应用 1.调用cmd命令.例:(打开计算器) #include <stdlib.h> int main() { system("calc"); ...
- span 文本内容超过宽度自动换行
span{word-break:normal; width:auto; display:block; white-space:pre-wrap;word-wrap : break-word ;over ...
- jquery计算时间差(天、时、分、秒)并使用定时器实时获取
类似网站抢购需求,会有个时间倒计时的展示(天.时.分.秒) 要拿到最终时间与当前时间对比,算出时间差并用定时器以秒的方式执行 实现代码: $(document).ready(function(){ r ...
- vs2015添加管理员权限
在工作过程中,我可能可能遇到要求编译好的程序默认以管理员权限运行,我们可以这样操作 一.新建一个manifest文件: <?xml version="1.0" encodin ...
- 利用Apache AXIS 1 发布WebService
首先,AXIS 是apache的作品. 1.到apache去下载相关的包,包括axis.jar.axis-ant.jar.commons-discovery-0.2.jar等.将jar包放到WEB-I ...
- labellmg使用方法
https://www.cnblogs.com/Terrypython/p/9577657.html
- Vue2 第一天学习
个人小总结:1年多没有写博客,感觉很多知识点生疏了,虽然工作上能解决问题,但是当别人问到某个知识点的时候,还是迷迷糊糊的,所以坚持写博客是硬道理的,因为大脑不可能把所有的知识点记住,有可能某一天忘了, ...
- jenkins执行远程脚本注意的问题
1构建任务 ->新建任务 2.填写任务名称 第二次构建可以复制第一次的配置 3.选择任务名称上面右键 选择配置 4.如下图所示 附录脚本内容 test.sh#!/bin/bash JAR ...
- 【Atcoder yahoo-procon2019-qual D】 Ears
Atcoder yahoo-procon2019-qual D 题意:给你\(L\)个耳朵(???),以及一条范围从\(0\)到\(L\)的数轴,你可以选择一个出发点,从该点开始随意走动,如果经过了\ ...
- 【Topcoder 10107】TeamManagement
Topcoder 10107 题意:给定一棵树,其中有些点是忠诚的,现在要选k个点,每个选择的联通块都必须包含一个忠诚的点,求包含某个点的概率. 思路:考虑树型\(dp\),\(dp(i,j,0/1, ...