初识内核模块编译

原创 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;

}

相关文章推荐

uclinux-2008r1(bf561)内核中内存管理相关的几个结构体

 快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com   本文适用于ADI bf561 DSPuclinux-2008r1-rc8 (移植到vdsp...

中断处理

1.中断和异常的硬件处理      首先,从硬件的角度来看CPU如何处理中断和异常,这里假定内核已被初始化,CPU已从实模式转到保护模式。      当CPU执行了当前指令之后,CS和EIP这对寄存器...

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

一、模块机制产生的原因      内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称模块。Linux内核之所以...

初识Linux内核-DIY内核模块

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

ubuntu12.04编译内核模块

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

编译Linux内核模块的简单Makefile

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

Tiny6410内核模块编译之helloworld

由于项目,需要自己编译内核驱动,但是考虑到编译内核比较麻烦,而且需要重新烧写系统,不是很方便,所以研究了一下通过模块的方式加载驱动。用一个 helloworld的程序说明一下整个流程,记下来,以便以后...
  • xsc_c
  • xsc_c
  • 2013年12月06日 21:23
  • 1561

编译内核模块

内核模块在用gcc编译时需要使用特定的参数。另外,一些宏同样需要定义。 这是因为在编译成可执行文件和内核模块时, 内核头文件起的作用是不同的。 以往的内核版本需要我们去在Makefile中手动设置这些...

linux内核模块编译学习笔记

# linux内核模块编译学习笔记 # v0.1 2013.11.15 *** 详细的模块编译过程    v0.2 2013.12.12 *** 添加了在源码树中编译模块,Kconfig配置的内容 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初识内核模块编译
举报原因:
原因补充:

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