linux内核模块编写,Linux内核模块编程

1 总体设计思路

Linux内核是单体式结构,相对于微内核结构而言,其运行效率高,但是系统的可维护性和可扩展性较差。为此,Linux提供了内核模块(module)机制,它不仅可以弥补单体式内核相对于微内核的一些不足,而不影响系统性能。内核模块的全称是动态可加载内核模块(Loadabe Kernel Module,KLM),简称为模块。模块是一个目标文件,能完成某种独立的功能,但其自身不是一个独立的进程,不能单独运行,可以动态载入内核,使其成为内核代码的一部分,与其他内核代码的地位完全相同,当不需要某模块功能时,可以动态卸载。实际上,Linux中大多数设备驱动程序或文件系统都以模块方式实现,因为它们数目繁多,体积庞大,不适合直接编译在内核中,而是通过模块机制,需要时临时加载。使用模块机制的另一个好处是,修改模块代码后只需要重新编译和加载模块,不必重新编译整个内核和引导系统,减少了更新系统功能的复杂度。

一个模块通常有一组函数和数据结构组成,用来实现某种功能,如实现一种文件系统、一个驱动模块或其他内核上层的功能。模块自身不是一个独立的进程,当前集成运行过程中调用到模块代码时,可以认为该段代码就代表当前进程在核心态运行。

模块编程可以使用内核的一些全局变量和函数,内核符号表就是用来存放所有模块都可以访问的符号及相应地址的表,存放在/proc/kallsyms文件中,可以使用“cat /proc/kallsyms”命令查看当前环境下导出的内核符号。

通常情况下,一个模块只需实现自己的功能,而无需导出任何符号;但如果其他模块需要调用这个模块的函数或数据结构时,该模块也可以导出符号。这样,其他模块可以使用由该模块导出的符号,利用现成的代码实现更加复杂的功能,这种技术也被称为模块层叠技术,当前已经使用在很多主流的内核源代码中。

2 主要函数的接口设计

module1:设计一个模块,要求列出系统中所有内核线程的程序名、PID、进程状态、进程优先级、父进程的PID

module2:设计一个带参数的模块,其参数为某个进程的PID号,模块的功能时列出该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号、进程状态

模块中包括两个函数:

定义module_init()函数初始化模块、定义module_exit()函数卸载模块

对于需要传递参数的模块,我们使用module_param()来传递参数

task_struct是Linux内核的一种数据结构,它会被装载到RAM中并且包含着进程的信息。每个进程都把它的信息放在 task_struct 这个数据结构体,task_struct 包含了这些内容:

标示符 : 描述本进程的唯一标识符,用来区别其他进程

状态 :任务状态,退出代码,退出信号等

优先级 :相对于其他进程的优先级

程序计数器:程序中即将被执行的下一条指令的地址

内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

上下文数据:进程执行时处理器的寄存器中的数据

I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表

记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等

有关进程信息还有以下三点需要了解:

保存进程信息的数据结构叫做 task_struct,可以在 include/linux/sched.h 中找到它

所有运行在系统中的进程都以 task_struct 链表的形式存在内核中

进程的信息可以通过 /proc 系统文件夹查看。要获取PID为400的进程信息,你需要查看 /proc/400 这个文件夹。大多数进程信息同样可以使用top和ps这些用户级工具来获取

参考文档和完整的文档和源码下载地址:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数式编程(一)

一、特征 函数式一等公民 强调将计算过程分解成可以复用的函数 纯函数、没有副作用 二、compose function compose(...funcs) {if(funcs.length 0){return (args)> args; }if(funcs.length 1){return funcs[0]; }return funcs.reduce((a,b)>(...args)>b(a(...args))…

[vue] vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么?

[vue] vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么? 需要,原生DOM事件必须要手动销毁,否则会造成内存泄漏个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易&#xff…

《解剖PetShop》系列之三

《解剖PetShop》系列之三 三、PetShop数据访问层之消息处理 在进行系统设计时,除了对安全、事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量、数据流量、服务器负荷…

linux下带密码的scp,linux下带密码的scp

from linux下带密码的scp (2014-03-10 12:35:46)背景: 需要将一台机器的数据传输到另外一台机器上,两台机器没有信任关系,没有数据源一方没有ftp或者http,无法进行wget 解决方法: 在其中一台机器安装expect&#xff0c…

@RestControllerAdvice注解使用

在spring 3.2中,新增了ControllerAdvice,RestControllerAdvice 注解,可以用于定义ExceptionHandler、InitBinder、ModelAttribute,并应用到所有RequestMapping中。参考帮助文档。RestControllerAdvice 是组件注解,他使…

[vue] vue组件会在什么时候下被销毁?

[vue] vue组件会在什么时候下被销毁? 页面关闭、路由跳转、v-if和改变key值个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

简单理解bash和常规操作

1. 什么是bash? Bash shell是一个命令解释器,它是操作系统的外壳程序,负责处理用户命令与操作系统内核之间的交互,当用户输入一个命令并执行时,shell会把命令解释并传递给内核,然后再把内核输出返回给用户&…

linux虚拟机dhcp启动失败,Linux 的dhcp启动异常之No subnet declaration for eth1 (192.168.48.134)...

最近折腾Centos自动化安装,需要的dhcp服务,使用yum -y install dhcp安装dhcp、dhcp-common的rpm包,启动dhcp时异常报错,由于dhcp是及服务,关于dhcp启动失败可以查看操作系统日志/var/log/messages,使用serv…

Developer Express .Net 2005 V7.2.1 crack

Developer Express .Net 2005 V7.2.1破解及下载 http://www.sofitcn.net/ 破解需要注册后才能下载。不要广泛外传! 转载于:https://www.cnblogs.com/ainima/archive/2007/07/14/6331513.html

[vue] 使用vue渲染大量数据时应该怎么优化?说下你的思路!

[vue] 使用vue渲染大量数据时应该怎么优化?说下你的思路! 1.如果需要响应式,考虑使用虚表(只渲染要显示的数据); 2.如果不考虑响应式,变量在beforeCreated或created中声明(Object.f…

linux u盘 uid pid,linux下的pid文件的作用

在Linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件。而且往往新安装的程序在运行后也会在/var/run目录下面产生自己的pid文件。那么这些pid文件有什么作用呢?它的内容又是什么呢?(1) pid文件的内容:pid文件为文本文件&#xff0…

学习进度第4周

时间30小时代码量2000行左右博客园2知识点 知识点&#xff1a;从最基本的jsp连接数据库学习。 List<类名> listnew ArrayList<>()&#xff1a;这就像是一个容器。能把数据储存在 list里。 ResultSet rs&#xff1a;创建rs结果集可以用来接受储存数据。 rs…

昨夜的雨图片

昨天趟着淹没到屁股的雨水回家的&#xff0c;今天才知道&#xff0c;这是一场非常可怕的暴雨.本来就吓的够戗,现在直接两腿发软&#xff0c;几欲要哭了。想想真是后怕. 朋友说&#xff0c;你可真大胆,那么大雨你也敢趟.其实不是胆大,而是我走着走着水没的越来越往上了.幸亏个子…

[vue] 你有使用过JSX吗?说说你对JSX的理解

[vue] 你有使用过JSX吗&#xff1f;说说你对JSX的理解 jsx不是一门新的语言&#xff0c;是一种新的语法糖。让我们在js中可以编写像html一样的代码。 允许XML语法直接加入到JavaScript代码中&#xff0c;让你能够高效的通过代码而不是模板来定义界面个人简介 我是歌谣&#x…

linux qtopia-2.2.0编译,qtopia-2.2.0在linux上的安装(基于mini2440)

环境&#xff1a;fedora9、ubuntu10.04x86-qtopia、arm-qtopiagcc-4.3.x、g-4.3.xarm-linux-4.3.2一、x86-qtopia的安装x86-qtopia的安装不管在哪一版本中的linux中&#xff0c;必须采用gcc-4.3.x、g-4.3.x的编译器(或以下&#xff0c;没测试过)&#xff0c;编译过程才不会莫名…

微信支付开发流程

记录下微信JSAPI支付的流程 1、判断是微信浏览器则直接请求微信授权的链接&#xff0c;需要传递给微信重定向回的页面&#xff0c;及订单id // 微信浏览器直接调用 if (this.isWeixin) {let redirectUri http://192.168.1.6/weChatwindow.location.href https://open.weixin.…

vb对数据库操作用存储过程

存储过程如下create proc sp_recordset bbb int as select * from aaa where bbb bbbvb代码如下&#xff1a; Dim cmd As ADODB.Command Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim ADOPrm Set ADOPrm New ADODB.Parameter Set rs New AD…

[vue] `<template></template>`有什么用?

[vue] <template></template>有什么用&#xff1f; 包裹嵌套其它元素&#xff0c;使元素具有区域性&#xff0c;自身具有三个特点&#xff1a; *隐藏性&#xff1a;不会显示在页面中 *任意性&#xff1a;可以写在页面的任意地方 *无效性&#xff1a; 没有一个根元…

linux域文件夹权限设置密码,如何配置Linux 文件权限(经典详细版本: rwxst)

在Linux中&#xff0c;Linux文件权限一共分为三种。本文将向读者展示如何正确配置Linux文件权限。三种特殊权限简介SUID当一个设置了SUID 位的可执行文件被执行时&#xff0c;该文件将以所有者的身份运行&#xff0c;也就是说无论谁来执行这个文件&#xff0c;他都有文件所有者…