xml地图|网站地图|网站标签 [设为首页] [加入收藏]
来自 关于我们 2019-10-16 13:01 的文章
当前位置: 新濠国际登录平台 > 关于我们 > 正文

新濠国际登录平台正在进入目录,编译添加的h

 

试试第一个hello world模块添加:

一.环境如下:

make menuconfig过程解析
作者 codercjg 在 28 九月 2015, 5:27 下午

1.本地主机的参数

zhangjun@zhangjun-virtual-machine:~$ uname -a

Linux zhangjun-virtual-machine 4.4.0-31-generic #50~14.04.1-Ubuntu SMP Wed Jul 13 01:07:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

zhangjun@zhangjun-virtual-machine:~$ ls /usr/src/linux-headers-4.4.0-31-generic/arch    Documentation  include  Kconfig   mm              scripts   tools   zfs

block   drivers        init     kernel    Module.symvers  security  ubuntu

certs   firmware       ipc      lib       net             sound     usr

crypto  fs             Kbuild   Makefile  samples         spl       virt

 

1,在添加drivers/char/hello.c

1.1内核版本:

make menuconfig用于图形界面配置linux内核。
linux源码根目录下有.config文件,其他子目录下一般都会有一个Kconfig文件和Makefile文件。
三个文件的作用分别为:
Kconfig: 定义配置项
.config: 设置配置项的值(可通过make menuconfig界面配置或者直接修改)
Makefile:读取配置项的值,并根据该值决定是否编译该目录下该配置项关联的c源文件

2.编写内核模块文件

编写自己的内核模块文件myModule.c,内容如下:

#include  <linux/kernel.h>

#include <linux/module.h>

#include <linux/types.h>

static int __init myModule_init(void)

{

    printk(KERN_INFO"myModule init.rn");

        return 0;

}

 

static void __exit myModule_exit(void)

{

    printk(KERN_INFO"myModule exit.rn");

}

module_init(myModule_init);

module_exit(myModule_exit);

MODULE_LICENSE("GPL");

 

/*********************************************************************************
 *      Copyright:  (C) 2014 zhouguangfeng<zhouguangfeng91@gmail.com>
 *                  All rights reserved.
 *
 *       Filename:  hello.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(08/09/2014)
 *         Author:  zhouguangfeng <zhouguangfeng91@gmail.com>
 *      ChangeLog:  1, Release initial version on "08/09/2014 06:23:18 PM"
 *                 
 ********************************************************************************/
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

jello@jello:~$ uname -a

make menuconfig 首先会读取/arch/arm/Kconfig, 然后根据该Kconfig文件引用其他目录下的Kconfig,
最后和根目录下的.config对比,生成图形配置界面,配置完成后的结果保存在.config文件中。
比如当写一个hello的字符驱动hello.c后,放在linux源码/driver/char/目录下后,要一起编译进内核需要
修改该目录下的Kconfig和Makefile.
在/driver/char/Kconfig文件里加入以下内容:
config HELLO
bool “/dev/hello hello driver example ”
default y
help
Say Y here if you want to support /dev/hello device.
然后make menuconfig后就可以看到如下内容:

3.编写Makefile

#kernel代码的路径

KERN_DIR = /usr/src/linux-headers-4.4.0-31-generic/   

all:

         make -C $(KERN_DIR) M=`pwd` modules   

clean:   

         make -C $(KERN_DIR) M=`pwd` modules clean   

obj-m += myModule.o

MODULE_LICENSE ("Dual BSD/GPL");

Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

新濠国际登录平台 1

4.编译

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule# make

make -C /usr/src/linux-headers-4.4.0-31-generic/     M=`pwd` modules   

make[1]: 正在进入目录 `/usr/src/linux-headers-4.4.0-31-generic'

  CC [M]  /home/zhangjun/zj_driver/myModule/myModule.o

  Building modules, stage 2.

  MODPOST 1 modules

  CC      /home/zhangjun/zj_driver/myModule/myModule.mod.o

  LD [M]  /home/zhangjun/zj_driver/myModule/myModule.ko

make[1]:正在离开目录 `/usr/src/linux-headers-4.4.0-31-generic'

 

static int __init hello_init (void)
{
    printk (KERN_INFO "Hello worldn");
    return 0;
}

1.2发行版:

但这时执行make zImage还不能编译成功,要正确编译还需要在/driver/char/Makefile文件里加上:
obj-$(CONFIG_HELLO)+= hello.o
当在make menuconfig图形界面里选中了hello选项后,生成的.config文件会有CONFIG_HELLO=y
当执行make zImage命令时,obj-y += hello.o 就表示要把该目标文件编译进内核。
如果是模块,则可把HELLO配置项设为tristate类型,在make menuconfig图形界面选择hello M模块选项时
生成的.config文件会CONFIG_HELLO=m
当执行make modules命令时,obj-m +=hell.o就表示把该目标文件编译为模块。
obj-y和obj-m是linux 编译时定义的全局变量,分别表示要编译进内核的文件列表和编译为模块的文件列表。

5.安装驱动

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule# insmod myModule.ko

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule# cat /proc/modules

myModule 16384 0 - Live 0xffffffffc03d4000 (OE)

nls_utf8 16384 1 - Live 0xffffffffc016f000

isofs 40960 1 - Live 0xffffffffc03f4000

vmw_vsock_vmci_transport 28672 1 - Live 0xffffffffc03cc000

vsock 36864 2 vmw_vsock_vmci_transport, Live 0xffffffffc0165000

bnep 20480 2 - Live 0xffffffffc0178000

rfcomm 69632 8 - Live 0xffffffffc050b000

nfsd 315392 13 - Live 0xffffffffc05e4000

auth_rpcgss 57344 1 nfsd, Live 0xffffffffc0542000

nfs_acl 16384 1 nfsd, Live 0xffffffffc038b000

nfs 249856 0 - Live 0xffffffffc05a6000

binfmt_misc 20480 1 - Live 0xffffffffc0393000

lockd 90112 2 nfsd,nfs, Live 0xffffffffc052b000

grace 16384 2 nfsd,lockd, Live 0xffffffffc0386000

sunrpc 331776 19 nfsd,auth_rpcgss,nfs_acl,nfs,lockd, Live 0xffffffffc04b9000

fscache 61440 1 nfs, Live 0xffffffffc04a9000

coretemp 16384 0 - Live 0xffffffffc03c7000

kvm_intel 167936 0 - Live 0xffffffffc057c000

kvm 532480 1 kvm_intel, Live 0xffffffffc0426000

snd_ens1371 28672 2 - Live 0xffffffffc0365000

snd_ac97_codec 131072 1 snd_ens1371, Live 0xffffffffc0405000

irqbypass 16384 1 kvm, Live 0xffffffffc0381000

crct10dif_pclmul 16384 0 - Live 0xffffffffc037c000

gameport 16384 1 snd_ens1371, Live 0xffffffffc0373000

crc32_pclmul 16384 0 - Live 0xffffffffc034b000

ac97_bus 16384 1 snd_ac97_codec, Live 0xffffffffc0400000

snd_pcm 106496 2 snd_ens1371,snd_ac97_codec, Live 0xffffffffc03d9000

aesni_intel 167936 0 - Live 0xffffffffc039d000

vmw_balloon 20480 0 - Live 0xffffffffc036d000

snd_seq_midi 16384 0 - Live 0xffffffffc0360000

snd_seq_midi_event 16384 1 snd_seq_midi, Live 0xffffffffc035b000

aes_x86_64 20480 1 aesni_intel, Live 0xffffffffc0355000

lrw 16384 1 aesni_intel, Live 0xffffffffc0321000

gf128mul 16384 1 lrw, Live 0xffffffffc0350000

snd_rawmidi 32768 2 snd_ens1371,snd_seq_midi, Live 0xffffffffc0342000

glue_helper 16384 1 aesni_intel, Live 0xffffffffc033d000

ablk_helper 16384 1 aesni_intel, Live 0xffffffffc0277000

cryptd 20480 2 aesni_intel,ablk_helper, Live 0xffffffffc031b000

joydev 20480 0 - Live 0xffffffffc0315000

input_leds 16384 0 - Live 0xffffffffc0307000

serio_raw 16384 0 - Live 0xffffffffc0233000

snd_seq 69632 2 snd_seq_midi,snd_seq_midi_event, Live 0xffffffffc032b000

snd_seq_device 16384 3 snd_seq_midi,snd_rawmidi,snd_seq, Live 0xffffffffc0326000

snd_timer 32768 2 snd_pcm,snd_seq, Live 0xffffffffc030c000

btusb 45056 0 - Live 0xffffffffc02fb000

btrtl 16384 1 btusb, Live 0xffffffffc0272000

btbcm 16384 1 btusb, Live 0xffffffffc0160000

btintel 16384 1 btusb, Live 0xffffffffc0145000

bluetooth 516096 25 bnep,rfcomm,btusb,btrtl,btbcm,btintel, Live 0xffffffffc027c000

snd 81920 11 snd_ens1371,snd_ac97_codec,snd_pcm,snd_rawmidi,snd_seq,snd_seq_device,snd_timer, Live 0xffffffffc021e000

soundcore 16384 1 snd, Live 0xffffffffc006b000

nfit 32768 0 - Live 0xffffffffc01f0000

vmwgfx 229376 3 - Live 0xffffffffc0239000

ttm 94208 1 vmwgfx, Live 0xffffffffc01d8000

drm_kms_helper 143360 1 vmwgfx, Live 0xffffffffc01fa000

drm 360448 6 vmwgfx,ttm,drm_kms_helper, Live 0xffffffffc017f000

shpchp 36864 0 - Live 0xffffffffc0156000

fb_sys_fops 16384 1 drm_kms_helper, Live 0xffffffffc0151000

syscopyarea 16384 1 drm_kms_helper, Live 0xffffffffc014c000

vmw_vmci 65536 2 vmw_vsock_vmci_transport,vmw_balloon, Live 0xffffffffc0134000

sysfillrect 16384 1 drm_kms_helper, Live 0xffffffffc00fc000

sysimgblt 16384 1 drm_kms_helper, Live 0xffffffffc00b8000

i2c_piix4 24576 0 - Live 0xffffffffc0120000

8250_fintek 16384 0 - Live 0xffffffffc00f7000

parport_pc 36864 0 - Live 0xffffffffc00ae000

ppdev 20480 0 - Live 0xffffffffc0065000

mac_hid 16384 0 - Live 0xffffffffc003d000

lp 20480 0 - Live 0xffffffffc0043000

parport 49152 3 parport_pc,ppdev,lp, Live 0xffffffffc0030000

hid_generic 16384 0 - Live 0xffffffffc004d000

usbhid 49152 0 - Live 0xffffffffc0127000

hid 118784 2 hid_generic,usbhid, Live 0xffffffffc0102000

psmouse 122880 0 - Live 0xffffffffc00d8000

mptspi 24576 2 - Live 0xffffffffc00cd000

mptscsih 40960 1 mptspi, Live 0xffffffffc00be000

mptbase 102400 2 mptspi,mptscsih, Live 0xffffffffc0072000

e1000 135168 0 - Live 0xffffffffc008c000

scsi_transport_spi 32768 1 mptspi, Live 0xffffffffc0052000

ahci 36864 1 - Live 0xffffffffc005b000

libahci 32768 1 ahci, Live 0xffffffffc0027000

pata_acpi 16384 0 - Live 0xffffffffc000f000

fjes 28672 0 - Live 0xffffffffc001f000

vmw_pvscsi 24576 0 - Live 0xffffffffc0014000

vmxnet3 57344 0 - Live 0xffffffffc0000000

安装驱动应该会调用myModule_init函数,那么应该有打印输出,但是实际上没有;

 

static void __exit hello_exit (void)
{
    printk (KERN_INFO "Goodbye worldn");
    return;
}

jello@jello:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial

其他相关命令:
make clean 清除编译内核生成的相关文件
make distclean 清除编译内核生成的相关文件,并且删除根目录下的.config文件
make xxxx_defconfig 会根据/arch/arm/configs/目录下的xxx_defconfig配置文件生成根目录下的.config文件。

6.卸载驱动

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule# rmmod myModule.ko

 

module_init (hello_init);
module_exit (hello_exit);

 

分类: Linux驱动 | 评论

7.模块安装时的打印

步骤5在安装myModule.ko的时候终端上并没有打印出信息,但是实际上打印的信息写入文件/var/log/kern.log,可以通过tail命令查看该文件最后的条目。

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule# tail -f /var/log/kern.log

Jan 15 11:17:16 zhangjun-virtual-machine kernel: [ 5755.442589] myModule: module verification failed: signature and/or required key missing - tainting kernel

Jan 15 11:17:16 zhangjun-virtual-machine kernel: [ 5755.448875] myModule init.

Jan 15 11:21:12 zhangjun-virtual-machine kernel: [ 5991.177018] myModule exit.

 

其中 printk是内核特有的打印函数,类似与printf,只是它不依赖库文件,KERN_INFO为

二.列出启用的模块:

platform总线设备驱动模型
作者 codercjg 在 28 九月 2015, 3:57 下午

8.关于printk函数

Linux 内核中通过printk输出信息,信息的类型在文件/usr/src/ linux-headers-4.4.0-31-generic /include/linux/printk.h中(有些源码在文件includelinuxkernel.h中)定义。

/*

 * These can be used to print at the various log levels.

 * All of these will print unconditionally, although note that pr_debug()

 * and other debug macros are compiled out unless either DEBUG is defined

 * or CONFIG_DYNAMIC_DEBUG is set.

 */

#define pr_emerg(fmt, ...)

         printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)

#define pr_alert(fmt, ...)

         printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)

#define pr_crit(fmt, ...)

         printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)

#define pr_err(fmt, ...)

         printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)

#define pr_warning(fmt, ...)

         printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)

#define pr_warn pr_warning

#define pr_notice(fmt, ...)

         printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)

#define pr_info(fmt, ...)

         printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)

如果不指定,默认是 DEFAULT_MESSAGE_LOGLEVE,和KERN_WARNING一样。 
root@vickytong:/usr/src/ linux-headers-4.4.0-31-generic# find . -name “*.h” | xargs grep “DEFAULT_MESSAGE_LOGLEVE”

./include/generated/autoconf.h: #define CONFIG_MESSAGE_LOGLEVEL_DEFAULT 4

 

打印优先级

jello@jello:~$ lsmod
Module Size Used by

linux设备驱动模型中分总线、设备、驱动三个重要概念。
每种设备都要挂在一种总线上,比如MCU外部引脚引出的i2c、spi等,然而在MCU内部的i2c控制器、spi控制器等却不在任何总线上。
因此,linux抽象出platform总线的概念,MCU内部的各种设备都可挂在platform总线上。
platform设备驱动的步骤:
platform_device_register()=>platform_driver_register()=>platform_driver_unregister()=>platform_device_unregister()
platform设备驱动分为两个:一个平台设备platform_device和一个平台驱动platform_driver。
下面是一个最简单的platform hello驱动
hello-device.c源码

9.交叉编译

有时候我们需要将模块移植到其他芯片方案的主机(或开发板)上运行,那么需要交叉编译。交叉编译需要修改Makefile,主要是修改kernel代码的路径和编译工具。kernel代码的路径要修改为目的主机系统的源代码路径,编译工具gcc要修改为目的主机芯片架构对应的编译工具。 设置编译器,与编译内核用的编译器要一致。下面为编译驱动时,在terminal终端设置环境变量如下:

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule# source /opt/Xilinx/SDK/2015.4/settings64.sh

 

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule# export ARCH=arm

 

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule#  export CROSS_COMPILE=arm-xilinx-linux-gnueabi-

 

说明:在目前ZedBoard上跑的linux系统,使用该编译器似乎也能编译驱动插入到内核中去(后面做gpio驱动时仔细验证):

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule# export ARCH=arm

 

root@zhangjun-virtual-machine:/home/zhangjun/zj_driver/myModule#  export CROSS_COMPILE= arm-linux-gnueabihf-

 

makefile文件修改如下:

#kernel代码的路径

KERN_DIR = /home/zhangjun/linux 

obj-m := myModule.o

all:

     make -C $(KERN_DIR) ARCH=arm M=`pwd` modules 

clean:     

     rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions

 

 

2,修改drivers/char/Kconfig文件,添加在make menuconfig的选项

ipt_MASQUERADE 16384 1   (数据包伪装)
nf_nat_masquerade_ipv4 16384 1 ipt_MASQUERADE  (This is the kernel functionality to provide NAT in the masquerade flavour (automatic source address selection).这是提供NAT的内核功能)
nf_conntrack_netlink 40960 0 (Connection tracking netlink interface 追踪网络链接接口的连接)
nfnetlink 16384 2 nf_conntrack_netlink (new netfilter netlink interface 新的网络过滤链接接口)
xfrm_user 32768 1  (Transformation user configuration interface转变用户配置的接口)
xfrm_algo 16384 1 xfrm_user ()
iptable_nat 16384 1  (nat相关)
nf_conntrack_ipv4 16384 2  (IPv4 connection tracking support (required for NAT)ipv4连接追踪支持(NAT需要此支持))
nf_defrag_ipv4 16384 1 nf_conntrack_ipv4
nf_nat_ipv4 16384 1 iptable_nat
xt_addrtype 16384 2
iptable_filter 16384 1
ip_tables 24576 2 iptable_filter,iptable_nat
xt_conntrack 16384 1
x_tables 36864 5 ip_tables,ipt_MASQUERADE,xt_conntrack,iptable_filter,xt_addrtype
nf_nat 24576 2 nf_nat_ipv4,nf_nat_masquerade_ipv4
nf_conntrack 106496 6 nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
br_netfilter 24576 0
bridge 126976 1 br_netfilter
stp 16384 1 bridge
llc 16384 2 stp,bridge
aufs 217088 0
psmouse 131072 0
pci_stub 16384 1
vboxpci 24576 0
vboxnetadp 28672 0
vboxnetflt 28672 0
vboxdrv 454656 3 vboxnetadp,vboxnetflt,vboxpci
binfmt_misc 20480 1
dell_wmi 16384 0
sparse_keymap 16384 1 dell_wmi
uvcvideo 90112 0
videobuf2_vmalloc 16384 1 uvcvideo
videobuf2_memops 16384 1 videobuf2_vmalloc
videobuf2_v4l2 28672 1 uvcvideo
videobuf2_core 36864 2 uvcvideo,videobuf2_v4l2
v4l2_common 16384 1 videobuf2_v4l2
videodev 176128 4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
media 24576 2 uvcvideo,videodev
intel_rapl 20480 0
dell_laptop 20480 0
x86_pkg_temp_thermal 16384 0
dcdbas 16384 1 dell_laptop
intel_powerclamp 16384 0
dell_smm_hwmon 16384 0
coretemp 16384 0
kvm_intel 172032 0
kvm 544768 1 kvm_intel
irqbypass 16384 1 kvm
crct10dif_pclmul 16384 0
crc32_pclmul 16384 0
ghash_clmulni_intel 16384 0
wl 6447104 0
snd_hda_codec_hdmi 53248 1
cryptd 20480 1 ghash_clmulni_intel
snd_hda_codec_idt 57344 1
snd_hda_codec_generic 77824 1 snd_hda_codec_idt
snd_hda_intel 40960 6
snd_hda_codec 135168 4 snd_hda_codec_hdmi,snd_hda_codec_idt,snd_hda_codec_generic,snd_hda_intel
snd_hda_core 73728 5 snd_hda_codec_hdmi,snd_hda_codec_idt,snd_hda_codec_generic,snd_hda_codec,snd_hda_intel
snd_hwdep 16384 1 snd_hda_codec
snd_pcm 106496 4 snd_hda_codec_hdmi,snd_hda_codec,snd_hda_intel,snd_hda_core
snd_seq_midi 16384 0
snd_seq_midi_event 16384 1 snd_seq_midi
snd_rawmidi 32768 1 snd_seq_midi
snd_seq 69632 2 snd_seq_midi_event,snd_seq_midi
snd_seq_device 16384 3 snd_seq,snd_rawmidi,snd_seq_midi
snd_timer 32768 2 snd_pcm,snd_seq
cfg80211 565248 1 wl
input_leds 16384 0
joydev 20480 0
serio_raw 16384 0
snd 81920 23 snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_hda_codec_idt,snd_pcm,snd_seq,snd_rawmidi,snd_hda_codec_generic,snd_hda_codec,snd_hda_intel,snd_seq_device
soundcore 16384 1 snd
mei_me 36864 0
mei 98304 1 mei_me   (Intel Management Engine Interface:

include <linux/module.h>

10.下载、安装和卸载

         在Zedboard上的linux挂在nfs,在Terminal上做如下操作:

analog@analog:~$ sudo mount -t nfs 192.168.0.25:/home/zhangjun /mnt/

mount.nfs: /mnt is busy or already mounted

analog@analog:~$ cd /mnt

analog@analog:/mnt$ cd zj_driver

analog@analog:/mnt/zj_driver$ ls

driver_demo  myModule

analog@analog:/mnt/zj_driver$ cd myModule

analog@analog:/mnt/zj_driver/myModule$ ls

Makefile   Module.symvers  myModule.c   myModule.ko     myModule.mod.o

Makefile~  modules.order   myModule.c~  myModule.mod.c  myModule.o

analog@analog:/mnt/zj_driver/myModule$ insmod myModule.ko

insmod: ERROR: could not insert module myModule.ko: Operation not permitted

analog@analog:/mnt/zj_driver/myModule$ sudo su

root@analog:/mnt/zj_driver/myModule# insmod myModule.ko

root@analog:/mnt/zj_driver/myModule# cat /proc/modules

myModule 737 0 - Live 0xbf000000 (O)

root@analog:/mnt/zj_driver/myModule# rmmod myModule.ko

 

#
# Character device configuration
#

The Intel Management Engine (Intel ME) is an isolated and 
protected computing resources (Coprocessor) residing inside 
Intel chipsets. The Intel ME provides support for computer/IT 
management features.
The Feature set depends on Intel chipset SKU.(摘自https://lwn.net/Articles/440292/)

因特尔管理引擎是一个被分离和被保护的属于因特尔芯片组里面的计算资源(协处理器),这个因特尔管理引擎为computer/IT提供管理特性,这种特性集取决于因特尔芯片组SKU,更多资料请看:https://cateee.net/lkddb/web-lkddb/INTEL_MEI.html

include <linux/kernel.h>

11.添加模块参数

有时候需要从用户态传参数给内核模块,这时候在内核模块中需要通过宏module_param声明参数。本例增加两个参数,一个是字符串参数cString,一个是int型参数iInt,修改后代码如下:

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/types.h>

 

static char* cString = NULL;

static int iInt = 0;

module_param(cString, charp, 0644);

module_param(iInt, int, 0644);

 

static int __init myModule_init(void)

{

    printk(KERN_INFO"myModule init, cString = %s, iInt = %dr新濠国际登录平台,n", cString, iInt);

    return 0;

}

 

static void __exit myModule_exit(void)

{

    printk(KERN_INFO"myModule exit.rn");

}

module_init(myModule_init);

module_exit(myModule_exit);

MODULE_LICENSE("GPL");

 

交叉编译后,下载,安装命令如下:

/tmp # insmod myModule.ko cString=helloworld iInt=100 
myModule init, cString = helloworld, iInt = 100

 

menu "Character devices"

)
shpchp 36864 0
mac_hid 16384 0
lpc_ich 24576 0
nfsd 319488 13
auth_rpcgss 61440 1 nfsd
nfs_acl 16384 1 nfsd
lockd 94208 1 nfsd
grace 16384 2 nfsd,lockd
parport_pc 32768 0
sunrpc 335872 18 nfsd,auth_rpcgss,lockd,nfs_acl
ppdev 20480 0
lp 20480 0
parport 49152 3 lp,ppdev,parport_pc
autofs4 40960 2
ums_realtek 20480 0
uas 24576 0
usb_storage 69632 2 uas,ums_realtek
amdkfd 131072 1
amd_iommu_v2 20480 1 amdkfd
radeon 1515520 2
i915 1208320 6
ttm 98304 1 radeon
i2c_algo_bit 16384 2 i915,radeon
drm_kms_helper 155648 2 i915,radeon
syscopyarea 16384 1 drm_kms_helper
ahci 36864 3
sysfillrect 16384 1 drm_kms_helper
libahci 32768 1 ahci
sysimgblt 16384 1 drm_kms_helper
fb_sys_fops 16384 1 drm_kms_helper
r8169 81920 0
drm 364544 12 ttm,i915,drm_kms_helper,radeon
mii 16384 1 r8169
wmi 20480 1 dell_wmi
video 40960 3 i915,dell_wmi,dell_laptop
fjes 28672 0  

include <linux/platform_device.h>

void hello_device_release(struct device *dev)
{
printk(“hello_device_releasen”);
}
struct platform_device hello_device = {
.name = “hello”,
.id = -1,
.dev = {
.release = hello_device_release,
},
};
static int __init hello_device_init(void)
{
int ret;
printk(“hello_device_initn”);
ret = platform_device_register(&hello_device);
if(ret){
printk(“platform_device_register failedn”);
}
return ret;
}
static void __exit hello_device_exit(void)
{
platform_device_unregister(&hello_device);
printk(“hello_device_exitn”);
}
MODULE_AUTHOR(“codercjg”);
MODULE_LICENSE(“Dual BSD/GPL”);
module_init(hello_device_init);
module_exit(hello_device_exit);
hello-driver.c源码

本文由新濠国际登录平台发布于关于我们,转载请注明出处:新濠国际登录平台正在进入目录,编译添加的h

关键词: