第17章、设备与模块

17.1设备类型

1.块设备(blkdev):

寻址以块为单位,通常支持重定位操作。通过称为“块设备节点”的特殊文件来访问。

2.字符设备(cdev):

不可寻址,仅提供数据的流式访问。通过称为“字符设备节点”的特殊文件来访问。

3.网络设备(ethernet devices):

提供了对网络的访问。它不是通过设备节点来访问,而是通过套接字API这样的特殊接口来访问。

17.2 模块

17.2.1 Hello,World

(1)hello_init()函数是模块的入口点。

模块的所有初始化函数必须符合下面的形式:

Int my_init(void);

它可被标记为static类型。

(2)hello_exit()函数是模块的出口函数。

Exit函数负责对init函数以及在模块生命周期过程中所做的一切事情进行撤销工作,基本上就是清理工作。

模块的所有初始化函数必须符合下面的形式:

void my_exit(void);

它也可被标记为static类型。

17.2.2构建模块

构建模块的第一步是决定在哪里管理模块源码。

(1)放在内核源代码树中

(2)放在内核代码外

17.2.3安装模块

Make  modules_install 构建命令用来安装编译的模块到合适的目录下,通常需要以root权限运行。

17.2.4产生模块依赖性

Linux模块之间存在依赖性。

17.2.5载入模块

载入模块最简单的方式是通过insmod命令,它做的就是请求内核载入模块。

Insmod module.ko(这里module.ko是要载入的模块名称)

卸载模块可以使用rmmod命令。

Rmmod module

17.2.6管理配置选项

配置选项的第一行定义了该选项所代表的配置目标;

第二行声明编译选项类型;

第三行指定了该选项的默认选项。

17.2.7模块参数

(1)定义一个模块参数可以通过宏module_param()完成:

Module_param(name,type,perm);

(2)必须在使用该宏前定义变量

(3)通常,需要用一个charp类型来定义模块参数(一个字符串)

17.2.8导出符号表

在内核中,导出内核函数需要使用特殊的指令:EXPORT_SYMBOL()和EXPORT_SYMBOL_GPL().

导出的内核函数可以被模块调用,而未导出的函数模块则无法被调用。

导出符号,只需要在声明函数后,紧跟上EXPORT_SYMBOL()指令。

17.3 设备模型

《Linux内核设计与实现》第17章学习笔记的更多相关文章

  1. 《Think Python》第17章学习笔记

    目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...

  2. 《Linux内核设计》第17章学习笔记

  3. scala编程第17章学习笔记(4)——元组

    元组可以把固定数量的条目组合在一起以便于作为整体传送.不像数组或列表,元组可以保存不同类型的对象. 元组常用来返回方法的多个值.例如,下面的方法找到集合中的最长单词并返回它的索引: scala> ...

  4. scala编程第17章学习笔记(3)

    可变(mutable)集合与不可变(immutable)集合 为了更易于完成不可变集合到可变集合的转换,或者反向转换,Scala提供了一些语法糖.纵使不可变集和映射并不支持真正的+=方法,Scala还 ...

  5. scala编程第17章学习笔记(2)——集和映射

    默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变 ...

  6. scala编程第17章学习笔记(1)——集合类型

    列表 列表的初始化及对其首尾的访问: scala> val colors = List("red", "blue", "green") ...

  7. 《Think Python》第16章学习笔记

    目录 <Think Python>第16章学习笔记 16.1 Time 16.2 纯函数(Pure functions) 16.3 修改器(Modifiers) 16.4 原型 vs. 方 ...

  8. 《Think Python》第15章学习笔记

    目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...

  9. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

随机推荐

  1. jQuery-jqprint.js打印插件使用高版本jQuery时问题

    使用jqprint打印插件的网页demo代码: <!doctype html> <html> <head> <meta charset="utf-8 ...

  2. python中的轻量级定时任务调度库:schedule

    提到定时任务调度的时候,相信很多人会想到芹菜celery,要么就写个脚本塞到crontab中.不过,一个小的定时脚本,要用celery的话太“重”了.所以,我找到了一个轻量级的定时任务调度的库:sch ...

  3. Pycharm 安装 idea VIM

    直接在线安装 1.File->Settings->Plugins->Install JetBrains Plugins 2.点击install安装ideavim 3.也许需要的切换v ...

  4. Win平台阅读Kafka源码时候使用bat脚本时候报错以及解决方案

    问题1: 使用bat脚本报错: 解决方案: 在配置好kafka的server.properties文件后,cmd进入命令窗口输入命令:.\bin\windows\kafka-server-start. ...

  5. Idea设置快捷键以及修改Eclipse的debug快捷键

    Idea强大不多说了,用久了都可以习惯,但是感觉Idea的debug真是不如eclipse好用,Idea的快捷键都是组合键,用着繁琐.两种方法可以设置eclipse的快捷键: 1:直接全局都使用ecl ...

  6. pump模块的学习-metamask

    pump = require('pump') pump简介 https://github.com/terinjokes/gulp-uglify/blob/master/docs/why-use-pum ...

  7. mybatis collection使用注意

    背景 今天我在使用collection时候,出现数据库有两条数据,但是却返回一条,在复制这条数据到四条后,依然返回一条 分析 这四条数据,数据库的每个字段值完全相同,所以估计是当成一条处理了 如果随便 ...

  8. 按行读取.txt文件,并按行写入到新文件中

    package com.test.io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...

  9. Redis 参数说明

    4. Redis的配置 4.1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 4.2. 当Redis以守护进程方式运行时,Redis ...

  10. Linux下NTP服务器配置

    简介 原理 配置ntp服务器 进行同步 一.简介 在计算时间的时候,最准确的计算应该是使用『原子震荡周期』所计算的物理时钟了( Atomic Clock, 也被称为原子钟 ),这也被定义为标准时间(I ...