在arm上使用内核模块

(本文是我以前所写,放在此处,以备今后学习查看)

不知道为什么,弄了好多天还是不能在友善的板子上用SD卡下载内核,不知道是什么问题,有点灰心了,不过同学提示我可以使用内核模块,不需要改变内核,于是尝试了一下,经过一番努力,还是简单的实现了一下,在此记录。

       内核模块就我的理解,就是将驱动等编写为一些模块,由于系统本身已经包含内核模块需要的一些函数头文件等,故可以直接下载至内核中,直接使用,不要编译进内核。

       首先要知道内核模块的一些命令:insmod下载内核模块

                                                     rmmod删除内涵模块

                                                     lsmod查看已下载哪些内核模块

                                                     modpromod下载内核模块,与insmod的区别在于如果该模块依赖与其他模块,这时会自动下载这些模块,在下载需要的模块,该命令还没有尝试过,理解不深。

       当然,需要先编写一个C文件,从网上找来的,基本都一样:

#include<linux/init.h> 
#include<linux/module.h> 
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
  printk(KERN_INFO " Hello World enter\n");
  printk(KERN_EMERG " ggggggggggg\n");
  return 0;
}

static void hello_exit(void)
{
  printk(KERN_INFO " Hello World exit....\n ");
  printk(KERN_EMERG " kkkkk....\n ");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("Song Baohua");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");
       这里需要说明一下,首先这里不是用printf而是用printk来打印输出,其次需要两个函数module_init();module_exit();来作为模块的入口和出口。

       然后需要编写一段makefile:如果是在PC上运行,如下:

ifneq ($(KERNELRELEASE),)
obj-m := hello.o 
else
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
 rm *.o *.ko
       首行必须写下来,具体作用是判断什么的,没记清。KERNELDIR指定源内核的位置。这里要注意使用Tab键,其他具体行的意义可以上网查一下。

       如果要运行到ARM上,如下:

ifneq ($(KERNELRELEASE),)
obj-m := hello.o 
else
KERNELDIR := /home/linux-2.6.38/
PWD := $(shell pwd)
default:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
endif
clean:
 rm *.o *.ko
        源内核的地址改为开发板的地址,后面还有加一个交叉编译环境。这里我编译了一下内核,如果不编译内核可能会不管用。

make后会生成.ko文件,将此文件通过NFS挂载至开发板,在开发板目录下输入:insmod ./hello.ko

        如果不出意外会输出: Hello World enter                                                              
                                     ggggggggggg 

       输入:rmmod hello,此时输出:

   Hello World exit....                                                           
                                                                                
 kkkkk....                                                                      
 rmmod: module 'hello' not found

      这时说明内核模块已经下载至开发板,并且可以运行了。 

 

posted on 2012-04-07 11:18  初级业余程序员  阅读(1141)  评论(0)    收藏  举报

导航