1. 主题: 1. 嵌入式基础知识
  2. 2. linux内核介绍
  3. 3. 内核的编译和安装(x86)
  4. 4. 第一个模块
  5. 5. 模块的相关工具
  6. 6. 模块的符号导出
  7. 7. 模块的參数
  8.  
  9. 1.linux/module.h
  10. 这个文件所在的位置:/home/zshh/work/driver/kernel/linux-3.5/include/linux
  11.  
  12. 重点看module结构体(模块的计数就在module结构体中)
  13. module这个结构体中包括模块的状态,模块的初始化话函数指针的定义,
  14. 还由exit函数指针的定义.
  15. 当中还包括对内核參数的操作,struct kernel_param *kp 这个结构体的定义例如以下:
  16. struct kernel_param{
  17. const char *name;
  18. const struct kernel parm_ops *ops;
  19. u16 perm;
  20. s16 level;
  21. union
  22. {
  23. void *arg;
  24. const struct kparam_string *str;
  25. const struct kparam_array * arr;
  26. };
  27. };
  28.  
  29. const struct kernel parm_ops *ops;
  30. 这个函数包括了一些读写參数的相关操作.
  31. struct kernel_param_ops
  32. {
  33. int (*set)(const char* val, const struct kernel_param *kp)
  34.  
  35. int (*set)(char *buffer, const struct kernel_param *kp)
  36.  
  37. void(*free)(void * arg)
  38.  
  39. }
  40.  
  41. 2.__init
  42.  
  43. #define __init _section(.init.text)
  44. #define __section(s) __attribute__((__section__(#S)))
  45.  
  46. 这个宏最红替换出来就是 __attribute__((__section__(".init.text")
  47.  
  48. 代表他会被存放再.init.text.
  49. __init __initdata等属性标志,
  50. 是要把这样的属性的代码放入目标文件的.init.text节,
  51. 数据放入.init.data节──这一过程是通过编译内核时为相关目标平台提供了xxx.lds链接脚本来指导ld完毕的。
  52.  
  53. //这个函数的运行分两种情况例如以下:
  54. 一:当编译为模块的时候.使用insmod,或者是modprob插入模块到内核的时候,他会被运行.
  55. 假设插入成功, __init属性的函数就被运行;
  56.  
  57. 二:当代码被编译进入zImage中是,再内核引导时,运行
  58. do_basic_setup()函数调用do_initcalls函数,.init节的全部函数都会被运行一遍.
  59. 在初始化完毕后,用这些keyword标识的函数或数据所占的内存会被释放掉。
  60. 三:全部的__init函数在initcall.init都有一个指针指向它.
  61.  
  62. 3.linux/list.h
  63.  
  64. 4.实验模块參数的bool型。測试可否使用0/1,y/n等;
  65. 假设模块的參数为数组。则须要使用module_param_array宏来声明
  66. 自己写个样例。測试该宏的使用
  67.  
  68. 1. 嵌入式基础知识
  69. =======================
  70. 嵌入式行业的当前发展情况,嵌入式系统构成等
  71.  
  72. 2.linux内核的说明
  73. =======================
  74. kernel文件夹下有两个内核,一个是从www.kernel.org下载的标准内核。一个是由google改动、三星移植的内核;
  75. 解压缩内核后说明一下文件夹结构,并介绍内核的核心功能
  76.  
  77. 3.内核的编译安装(x86)
  78. =======================
  79. (1)内核的配置
  80. $>make menuconfig
  81. 通过图形界面(依赖于ncurses库)。决定编译的内核都包括哪些部分。
  82. 终于的配置结果。存储在.config文件里
  83. 决定代码是否编译,假设编译。是编译到zImage中,还是编译为.ko模块
  84.  
  85. (2)内核的编译
  86. $>make
  87. 编译生成zImage内核和.ko模块
  88.  
  89. (3)内核模块的安装
  90. $>make modules_install
  91. 将生成的.ko安装到磁盘上的特定位置(就是拷贝)
  92. 通常是/lib/modules/xxx/文件夹(xxx为编译的内核的版本号)
  93.  
  94. (4)内核的安装
  95. $>make install
  96. 将生成的zImage安装到/boot文件夹下
  97. (zImagex86上称为bzImage,位于arch/x86/boot/文件夹下)
  98.  
  99. 接下来能够又一次启动系统,看看新编译的内核是否能使用(要看运气)
  100.  
  101. 4.第一个模块
  102. =========================
  103. 參考x86-drv/01mod/文件夹下的mod_test01.cMakefile
  104. 认真了解这两个文件里每部分的作用
  105.  
  106. 5. 模块的相关工具(5个)
  107. =========================
  108. (1)模块的手工载入
  109. $>insmod mod_test01.ko
  110. 会调用模块的入口函数。假设是printk的信息。用$>dmesg查看
  111.  
  112. (2)模块的手工卸载
  113. $>rmmod mod_test01
  114.  
  115. (3)显示模块信息
  116. $>modinfo xxx.ko
  117.  
  118. (4)列出内核中已经载入的模块
  119. $>lsmod
  120.  
  121. (5)自己主动载入模块
  122. 模块的自己主动载入工具。该工具能够自己主动将模块所依赖的模块也一起载入。
  123. modprobe仅仅能载入/lib/modules/xxx下的模块。
  124. $>modprobe xxx //载入
  125. $>modprobe -r xxx //卸载
  126.  
  127. tip:
  128. $>dmesg
  129. 显示printk的信息
  130. $>dmesg -c
  131. 清除printk的缓冲区
  132.  
  133. 6.模块的符号导出
  134. ==========================
  135. 为了避免命名空间污染,内核规定,.ko模块中的全部符号默认都为局部。必须通过EXPORT_SYMBOL宏导出后。才具有全局属性;
  136. EXPORT_SYMBOL宏可用于全局函数和全局变量;
  137.  
  138. 01mod/mod_test02.cmod_test03.c
  139. 生成模块mod_test02.komod_test03.ko
  140. 能够用insmod/rmmodmodprobe測试
  141.  
  142. $>make install //运行Makefile中的目标install
  143. $>modprobe mod_test03
  144. 会把依赖的mod_test02也载入
  145.  
  146. $>modprobe -r mod_test03
  147. 用-r能够卸载模块
  148.  
  149. 7.模块的參数
  150. =========================
  151. module_param宏来声明模块參数
  152. 參考01mod/mod_test04.c
  153.  
  154. 模块參数相应的文件是/sys/module/mod_test03/parameters/namevalue
  155. module_param宏的第3个參数,就用来确定这两个文件的permission

linux内核模块笔记的更多相关文章

  1. linux学习笔记全-如何学习linux?

    简介 今天整理文件整理出了好多年前学习linux的笔记 就整理下发布在博客上怕文件形式会误删. linux入门基础对于新手而言不推荐看书!!不推荐看书!!(大牛跳过)先看视频看linuxcast的视频 ...

  2. Linux内核模块学习

    注:本文是<Linux设备驱动开发详解:基于最新的Linux 4.0内核 by 宋宝华 >一书学习的笔记,大部分内容为书籍中的内容. 书籍可直接在微信读书中查看:Linux设备驱动开发详解 ...

  3. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  4. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  5. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  6. Linux学习笔记(一)2015.4.13

    研究生由单片机转Linux学习 首先安装VMware虚拟机,用的是VMware 10.0 在VMware 10.0上安装视频上推荐的Red Hat Linux 5 安装后正式进入Linux学习 笔记1 ...

  7. 跟着鸟哥学Linux系列笔记3-第11章BASH学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...

  8. 跟着鸟哥学Linux系列笔记2-第10章VIM学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 常用的文本编辑器:Emacs, pico, nano, joe, vim VI ...

  9. 跟着鸟哥学Linux系列笔记0-如何解决问题

    跟着鸟哥学Linux系列笔记0-扫盲之概念 在发生问题怎么处理: 1.  在自己的主机.网络数据库上查询How-To或FAQ -Linux 自身的文件数据: /usr/share/doc -CLDP中 ...

随机推荐

  1. linux入门基础——linux用户基础

    这篇内容是linux用户基础,相关内容见linux改动username和ubuntu改动username和主机名. 用户.组 当我们使用linux时,须要以一个用户的身份登入,一个进程也须要以一个用户 ...

  2. linux c获取mac

    #include <stdio.h> #include <string.h> #include <net/if.h> #include <sys/ioctl. ...

  3. SQL Server 日常维护--查询当前正在执行的语句、死锁、堵塞

    查询当前正在执行的语句: SELECT der.[session_id],der.[blocking_session_id], sp.lastwaittype,sp.hostname,sp.progr ...

  4. ubuntu16.04 安装 docker-compose

    下载安装 docker-composecurl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose ...

  5. Android设计模式——工厂方法模式

    1.定义:工厂方法模式就是定义一个用于创建对象的接口,让子类决定实例化哪个类. 2.看代码: 产品抽象类 public abstract class Product { /** * 产品类抽象方法 * ...

  6. asp实现阿里大鱼短信API接口的方法

    阿里大鱼是阿里推出的产品,官方提供JAVA..NET.PHP等版本的SDK下载,不知为何,唯独不提供ASP版本的SDK. 不提供没关系,自己写就是了,参照官方提供的API写一个就是了. 本来以为无非是 ...

  7. 安装django和selenium

    安装很简单(前提是python已经安装),命令窗口直接输入pip install django,回车就会自动进行安装,selenium也是一样pip install selenium 启动django ...

  8. CorelDRAW X6冰点价加推800套燃爆6月

    CorelDRAW是迄今最具创意的图形设计程序,并获得所有行业的公认的知名工具.在刚刚结束的CorelDRAW X6限量活动之后,CorelDRAW官方继续加推800套CorelDRAW X6满足用户 ...

  9. ZBrush软件中Brush特性

    在ZBrush里给用户提供了上百种用于雕刻的笔刷,每种笔刷的显示模式是以红色的两个圆圈,外面的圆圈表示笔刷在进行绘制和雕刻实际影响的范围,而内圆是表示笔刷强度到外圆的衰减的起始位置,可以在Focal ...

  10. HDU1231 最长连续子序列

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...