初识内核模块编译

原创 2015年11月20日 16:58:00

1.用make编译,编译代码如下

obj-m := filename.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)

all:
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

2.运行代码

insmod  filename.ko

用insmod命令,将模块插入到内核中(root权限下)

dmesg命令查看信息

最后用命令rmmod filename从内核中移除该模块

3.链表的一些宏和函数

链表的定义

struct list_head {

    struct list_head *next, prec;

}

若要定义data域须自己在代码中声明

eg: 

struct my_list{

  void *mydata;

struct list_head list;

}


#define LIST_HEAD_INIT(name) { &(name), &(name) }   //初始化

#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)  //声明并初始化


static inline void list_add();  //向head后插入结点

static inline void list_add(struct list_head *new, struct list_head *head)

{

   _list_add(new, head, head->next);

}

static inline void list_add_tail();   //向head前插入节点

static inline void list_add_tail(struct list_head *new, struct list_head *head)

{

   _list_add(new, head->prev, head);

}

static inline void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next)

{

    next->prev = new;

    new->next = next;

    new->prev = prev;

   prev->next = prev;

}


#define list_for_each(pos, head)  for (pos = (head)->next; pos != head; pos=pos->next)   //遍历链表(缺点是只能找到结点的指针域,却找不到data域)

#define list_for_each_safe(pos, n, head)  for (pos = head->next, n=pos->next;  pos!=head;  pos=n,n=pos->next)   //遍历链表(他采用年来暂时储存将要被删除的pos,从而使删除操作不影pos)

#define list_entry(ptr, type, member)  ((type *)((char *)(ptr) - (unsigned long)(&((type *)0) ->member)))    //获得存有data域的结点的起始位置

用指针域的起始地址减去data域的偏移量得到整体的起始位置


static inline void __list_del(struct  list_head *prev, struct list_head *next)    //删除结点的代码

{

      next->prev = prev;

      prev->next = next;

}

static inline void liss_del (struct list_head *entry)   //删除结点的函数

{

   __list_del(entry->prev, entry->next);

   entry->next = LIST_POLSON1;

   entry->prev = LIST_POISON2;

}

内核模块编译时出现的问题解决

第一次把自己编译的驱动模块加载进开发板,就出现问题,还好没花费多长时间,下面列举出现的问题及解决方案      1:出现insmod: error inserting 'hello.ko': -1 I...
  • manchestermi
  • manchestermi
  • 2015年09月01日 00:37
  • 1466

Linux内核模块的编译基础知识

关于linux内核驱动的东西网络上有很多,但网上的东西还是感觉有点笼统,读过之后就忘了,还是需要写下来,或者写到本子上,自己形成一个概念好一些。读了这本书上的东西,把觉得好的东西写下来,已备不时之用,...
  • shanzhizi
  • shanzhizi
  • 2013年03月01日 15:31
  • 3845

Linux内核模块(驱动)编译详解

本文主要说说如何编译自己开发的内核模块。由于驱动通常也被编译成内核模块,因此文章的内容也适用于驱动的编译。 由于在下能力相当有限,有不当之处,还望大家批评指正^_^ 一、准备工作 ...
  • crazycoder8848
  • crazycoder8848
  • 2015年03月08日 15:50
  • 10991

Linux内核模块-初识LKM(一)

一、模块机制产生的原因      内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称模块。Linux内核之所以...
  • u010215456
  • u010215456
  • 2014年04月06日 17:49
  • 885

初识Linux内核-DIY内核模块

一些学习笔记整理出来分享给大家
  • dalerkd
  • dalerkd
  • 2016年09月20日 00:40
  • 392

ubuntu12.04编译内核模块

  • 2013年07月18日 18:38
  • 16KB
  • 下载

编译Linux内核模块的简单Makefile

  • 2012年12月23日 21:34
  • 278B
  • 下载

linux—unix课件\第九讲-2 内核模块编译.ppt

  • 2011年10月04日 15:50
  • 133KB
  • 下载

为Raspberry Pi 2编译内核模块

2015-04-21更新:原始的rpi-source项目已经由PeterOGB 接手维护,所以无须再用我下文中提到的我改过的rpi-source脚本,直接用原始的就可以了。其它文中提到的背景知识都仍然...
  • zdf511391565
  • zdf511391565
  • 2015年08月14日 14:40
  • 1093

Linux最小根文件系统的建立,内核模块的编译,Qemu模拟测试最小系统

1. 利用busybox建立最小根文件系统 =============================================== (1.1) 下载和编译busybox git clon...
  • flyd1005
  • flyd1005
  • 2014年04月19日 23:41
  • 782
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初识内核模块编译
举报原因:
原因补充:

(最多只允许输入30个字)