模块化驱动动态加载

来源:互联网 发布:php http get请求 编辑:程序博客网 时间:2024/05/01 04:26

  驱动开发中共一般有2中内核调试方式 :静态编译进内核& 动态模块加载。而调试方式有3中,一种是每次下载内核与文件系统,启动,调试, 另外一种是在运行中动态加载内核,还有一种是nfs网络启动。

      在所有的方法中,动态加载模块的方法是最简单的。但是它主要需要编写一个makefile,但是也可以不写。一下是两种方法。

   一。添加支持动态模块加载的内核和应用程序支持。

        在make menuconfig中配置内核时选择:Loadable module support --->

        [*] Enable loadable module support
        [] Set version information on all module symbols (NEW)
        [*] Kernel module loader (NEW)
           并在应用程序配置中选择busybox下的insmod/rmmod/lsmod,

         并选中: [*] Post 2.1 kernel modules。

二。逃避makefile

       关于驱动模块的.c(例如mydriver.c)可这样编译,不需要单独写Makefile,就直接放到uClinux/linux2.4.x里面参与内核编译即可:
cp mydriver.c uClinux-dist/linux-2.4.x/drivers/char
然后修改uClinux-dist/linux-2.4.x/drivers/char/Makefile,
obj-y += mem.o tty_io.o n_tty.o tty_ioctl.o raw.o pty.o misc.o random.o mydriver.o
在最后加入mydriver.o
这样内核就会用正确的参数编译出mydriver.o。
然后把这个mydriver.o单独复制出来到uClinux-dist/romfs/usr下面,然后再把uClinux-dist/linux- 2.4.x/drivers/char/Makefile恢复回去,然后再重编内核,烧写,启动后执行insmod /usr/mydriver.o即可成功。再lsmod看看。

三。一个模块的makefile 内容

发现把驱动程序作为模块加载时,使用的也是虚拟地址,用了set_gpio_ctrl才通过。

编译模块驱动:

arm-linux-gcc -DMODULE -D__KERNEL__ -I/home/2.4.18-rmk7/include -c mydriver.c

编译应用程序:

arm-linux-gcc -o myapp myapp.c

看来还是写个Makefile方便

终端:

mount -t nfs -o rw 192.168.0.196:/home/work /mnt

cd /mnt/2.4.18.rmk7/user/mydrive

insmod mydriver.o

mknod /dev/test c 125 0

.'/myapp