当前位置: 首页 > news >正文

内核之旅起航---简单内核模块和内核编程规则

                                                                                                      内核模块与内核编程一些常识

首先把我之前的hello word 模块加载失败问题解决了。

首先:

更新内核,yum update kernel 安装内核开发树。

     内核模块hello word 代码:

<span style="font-size:18px;">#include<linux/init.h>          //内核相关函数的头文件,内核编程不能调用C库
#include<linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");  //用来告诉内核,这个模块遵循的许可

static int hello_init(void)      //初始化模块
{
    printk("the first modules\n\n");
    printk(KERN_ALERT "hello ,world\n");
    return 0;

}

static void hello_exit(void)    //清除模块
{
    printk(KERN_ALERT "GOODBYE,cure1 world\n");
}

module_init(hello_init);     //这两个宏分别注册初始化模块函数,注册退出函数
module_exit(hello_exit);     </span>

下面是makefile 

obj-m += hello.o
DIR:=$(shell pwd)
K_DIR:=$(shell uname -r)
k_path := /usr/src/kernels/$(K_DIR)

all:
	make -C $(k_path) M=$(DIR) modules

这个makefile 还有点缺点,就是没有clean ,不过对于这个演示并没有什么影响。


这个是编译结果:


然后是载入


但是并没有我们期待的输出。

这是因为根据系统传递消息的机制不同,得到的结果可能是不一样的,有的系统输出在终端,有的系统输出在某些文件里。

可是不论它输出在那里,都是从内核缓冲区出来的,所以我们可以使用dmesg 来查看内核缓冲区中的东西。


果然是OK 的。到这里这个模块就算是OK了。

下面是一些内核编程的规则和规范吧。

@前边有__的函数,一般就是接口的底层组件,应当谨慎使用,。本质是告诉程序员:“谨慎调用,否则后果自负”。

@不论代码是否使用,就算是睡眠的也一定要考虑并发的问题。

@少使用typedef 关键字

@内存的使用精打细算,能节省多少内存就减少多少内存。

@效率第一Linux内核的宗旨

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/zmrlinux/p/4921390.html

相关文章:

  • HtmlCleanner结合xpath用法(转载)
  • KVO的简单使用
  • P1297: [SCOI2009]迷路
  • POJ C++程序设计 编程题#3:计算数列平方和
  • Css_Backgroud-position(背景图片)定位问题详解
  • Android剪切板(ClipboardManager) 复制文本
  • HTML控件ID和NAME属性的区别,以及如何在asp.net页面的.CS文件中获得.ASPX页面中HTML控件的值...
  • html中获取图片的真实尺寸
  • mysql 小知识点备忘(一)
  • 双向BFS—NOIP2002 字串变换
  • NetworkStateReceiver的简单应用
  • virtual memory exhausted: Cannot allocate memory
  • 中国经济初识
  • Thinkpad X240修改bios引导方式
  • cocos2d-x 3.2 2048——第六部分(最后一章)
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [译] React v16.8: 含有Hooks的版本
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • C# 免费离线人脸识别 2.0 Demo
  • docker-consul
  • Docker入门(二) - Dockerfile
  • HTTP中GET与POST的区别 99%的错误认识
  • If…else
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript 基本功--面试宝典
  • js继承的实现方法
  • Median of Two Sorted Arrays
  • PhantomJS 安装
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • QQ浏览器x5内核的兼容性问题
  • 大型网站性能监测、分析与优化常见问题QA
  • 给Prometheus造假数据的方法
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 我感觉这是史上最牛的防sql注入方法类
  • 优秀架构师必须掌握的架构思维
  • 追踪解析 FutureTask 源码
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • $jQuery 重写Alert样式方法
  • (floyd+补集) poj 3275
  • (超详细)语音信号处理之特征提取
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (算法二)滑动窗口
  • (一)Linux+Windows下安装ffmpeg
  • (一)VirtualBox安装增强功能
  • (一)认识微服务
  • ***利用Ms05002溢出找“肉鸡
  • **CI中自动类加载的用法总结
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Core和.Net Standard直观理解
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net 高效开发之不可错过的实用工具
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据