主题:	1. 嵌入式基础知识
2. linux内核介绍
3. 内核的编译和安装(x86)
4. 第一个模块
5. 模块的相关工具
6. 模块的符号导出
7. 模块的參数 1.看linux/module.h。
这个文件所在的位置:/home/zshh/work/driver/kernel/linux-3.5/include/linux 重点看module结构体(模块的计数就在module结构体中)
再module这个结构体中包括模块的状态,模块的初始化话函数指针的定义,
还由exit函数指针的定义.
当中还包括对内核參数的操作,struct kernel_param *kp 这个结构体的定义例如以下:
struct kernel_param{
const char *name;
const struct kernel parm_ops *ops;
u16 perm;
s16 level;
union
{
void *arg;
const struct kparam_string *str;
const struct kparam_array * arr;
};
}; const struct kernel parm_ops *ops;
这个函数包括了一些读写參数的相关操作.
struct kernel_param_ops
{
int (*set)(const char* val, const struct kernel_param *kp) int (*set)(char *buffer, const struct kernel_param *kp) void(*free)(void * arg) } 2.看__init宏 #define __init _section(.init.text)
#define __section(s) __attribute__((__section__(#S))) 这个宏最红替换出来就是 __attribute__((__section__(".init.text") 代表他会被存放再.init.text.
__init, __initdata等属性标志,
是要把这样的属性的代码放入目标文件的.init.text节,
数据放入.init.data节──这一过程是通过编译内核时为相关目标平台提供了xxx.lds链接脚本来指导ld完毕的。 //这个函数的运行分两种情况例如以下:
一:当编译为模块的时候.使用insmod,或者是modprob插入模块到内核的时候,他会被运行.
假设插入成功, __init属性的函数就被运行; 二:当代码被编译进入zImage中是,再内核引导时,运行
do_basic_setup()函数调用do_initcalls函数,.init节的全部函数都会被运行一遍.
在初始化完毕后,用这些keyword标识的函数或数据所占的内存会被释放掉。
三:全部的__init函数在initcall.init都有一个指针指向它. 3.看linux/list.h 4.实验模块參数的bool型。測试可否使用0/1,y/n等;
假设模块的參数为数组。则须要使用module_param_array宏来声明
自己写个样例。測试该宏的使用 1. 嵌入式基础知识
=======================
嵌入式行业的当前发展情况,嵌入式系统构成等 2.linux内核的说明
=======================
kernel文件夹下有两个内核,一个是从www.kernel.org下载的标准内核。一个是由google改动、三星移植的内核;
解压缩内核后说明一下文件夹结构,并介绍内核的核心功能 3.内核的编译安装(x86)
=======================
(1)内核的配置
$>make menuconfig
通过图形界面(依赖于ncurses库)。决定编译的内核都包括哪些部分。
终于的配置结果。存储在.config文件里
决定代码是否编译,假设编译。是编译到zImage中,还是编译为.ko模块 (2)内核的编译
$>make
编译生成zImage内核和.ko模块 (3)内核模块的安装
$>make modules_install
将生成的.ko安装到磁盘上的特定位置(就是拷贝)
通常是/lib/modules/xxx/文件夹(xxx为编译的内核的版本号) (4)内核的安装
$>make install
将生成的zImage安装到/boot文件夹下
(zImage在x86上称为bzImage,位于arch/x86/boot/文件夹下) 接下来能够又一次启动系统,看看新编译的内核是否能使用(要看运气) 4.第一个模块
=========================
參考x86-drv/01mod/文件夹下的mod_test01.c和Makefile
认真了解这两个文件里每部分的作用 5. 模块的相关工具(5个)
=========================
(1)模块的手工载入
$>insmod mod_test01.ko
会调用模块的入口函数。假设是printk的信息。用$>dmesg查看 (2)模块的手工卸载
$>rmmod mod_test01 (3)显示模块信息
$>modinfo xxx.ko (4)列出内核中已经载入的模块
$>lsmod (5)自己主动载入模块
模块的自己主动载入工具。该工具能够自己主动将模块所依赖的模块也一起载入。
modprobe仅仅能载入/lib/modules/xxx下的模块。
$>modprobe xxx //载入
$>modprobe -r xxx //卸载 tip:
$>dmesg
显示printk的信息
$>dmesg -c
清除printk的缓冲区 6.模块的符号导出
==========================
为了避免命名空间污染,内核规定,.ko模块中的全部符号默认都为局部。必须通过EXPORT_SYMBOL宏导出后。才具有全局属性;
EXPORT_SYMBOL宏可用于全局函数和全局变量; 写01mod/mod_test02.c和mod_test03.c
生成模块mod_test02.ko和mod_test03.ko
能够用insmod/rmmod或modprobe測试 $>make install //运行Makefile中的目标install
$>modprobe mod_test03
会把依赖的mod_test02也载入 $>modprobe -r mod_test03
用-r能够卸载模块 7.模块的參数
=========================
用module_param宏来声明模块參数
參考01mod/mod_test04.c 模块參数相应的文件是/sys/module/mod_test03/parameters/name和value
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. 疯狂Java学习笔记(72)-----------大话程序猿面试

    大话程序猿面试 10个我最喜欢问程序猿的面试问题 程序猿面试不全然指南 10个经典的C语言面试基础算法及代码 程序猿的10大成功面试技巧 程序猿选择公司的8个标准 编程开发 8个值得关注的PHP安全函 ...

  2. 读取excel模板填充数据 并合并相同文本单元格

    try             { string OutFileName = "北京市国控企业污染源废气在线比对监测数据审核表" + DateTime.Now.ToString(& ...

  3. php的异步并行扩展swoole

    Swoole是PHP的异步并行扩展,有点像Node.js,但swoole既支持同步又支持异步,比node更强大.Swoole扩展是基于epoll高性能事件轮询,并且是多线程的,性能非常好. Swool ...

  4. 关于ubuntu中文输入调用不出来的解决办法,具体如正文。

    卸载了 fcitx sudo apt-get remove fcitx 重启 sudo reboot 重新安装 fcitxsudo apt-get install fcitx 安装拼音输入法sudo ...

  5. js判断PC端与移动端跳转

    在网上看到很多这样类似的代码,但是有的很复杂,或者有的没有判断完全,上次经理去见完客户回来讲,使用苹果浏览打开pc端(pc已经做了识别跳转)会自动跳转到移动端的网页去,后来经测试才发现 documen ...

  6. Android回炉系列之四大组件之首Activity

            有段时间没有认认真真研习过android了,android毕竟是我进这个软件开发圈子接触的第一门技术,android已经成了口头禅之类的东西了.当初学习android的时候大都是草草了 ...

  7. this self指针

    this 和 self指针 为函数提供了运行上下问:为函数提供了当前对象的其实地址,方便函数的对对象的访问.

  8. 【AnjularJS系列4 】 — 单个页面加载多个ng-App

    第四篇,插播, 单个页面加载多个ng-App 在写范例的时候发现的问题 一个页面有多个ng-app,angular只会处理第一个ng-app 需要加载两个ng-app,需要进行手动加载: angula ...

  9. ZBrush曲线功能介绍

    在ZBrush®中曲线功能是一个非常有用的工具.插入笔刷,曲线笔刷,拓扑和许多地方都会用到它.生成曲线的方式有很多种.可以使用重拓扑引导线,可以使用笔触菜单下曲线功能中的框架网格,可以使用ZBrush ...

  10. 脚本_使用expect自动交互远程主机安装软件

    #!bin/bash#功能:使用expect工具自动交互密码,远程到其它主机,安装httpd软件#作者:liusingbon#删除~/.ssh/known-hosts后,ssh远程任何主机,系统都会询 ...