1.1 Shell脚本从文件中读取参数传给驱动模块
问题描述:insmod驱动模块需要几个参数,不过这几个参数需要从配置文件中读取,为了开机时自动化处理还需要把这些操作都放在一个脚本中。
下面是一个helloworld驱动的demo,这个demo需要两个参数: char * people 和 int num
1.2 hello.c
- root@ubuntu:~/test/shreadf# cat hello.c
- #include
- #include
- MODULE_LICENSE("Dual BSD/GPL");
- static char * people= "wang";
- static int num= 1;
- static int hello_init(void)
- {
- printk(KERN_ALERT"num=%d people=%s\n", num, people);
- return 0;
- }
- static void hello_exit(void)
- {
- printk(KERN_ALERT"Hello world exit\n");
- }
- module_init(hello_init);
- module_exit(hello_exit);
- module_param(num, int, S_IRUGO);
- module_param(people, charp, S_IRUGO);
- EXPORT_SYMBOL(num);
- EXPORT_SYMBOL(people);
1.3 Makefile
- root@ubuntu:~/test/shreadf# cat Makefile
- ifneq ($(KERNELRELEASE),)
- obj-m:=hello.o
- else
- KDIR =/lib/modules/$(shell uname -r)/build
- PWD:=$(shell pwd)
- default:
- $(MAKE) -C $(KDIR) M=$(PWD) modules
这个驱动需要的参数在 text.txt中,
root@ubuntu:~/test/shreadf# cat test.txt
1234
abcdefg
第一行是参数num, 第二行是参数people
1.4 测试
编写好后测试一下驱动有没有问题:
root@ubuntu:~/test/shreadf# insmod hello.ko num=1 people=" zhangsan"
root@ubuntu:~/test/shreadf# dmesg | tail
[34398.230034] num=1 people=zhangsan
shell脚本中读取参数用sed 就好了。
但是在给int 型的num传参数时直接用 num=$num时会报错,但是加expr就成功了。
虽然这个脚本可以用了,但是还不是特别理解,个人感觉这个表达表就跟shell中做四则运算时都要加expr一样,这个地方为了类型匹配也需要加expr。
1.5 脚本
- root@ubuntu:~/test/shreadf# cat shread.sh
- #!/bin/sh
- num=$( sed -n '1p' test.txt )
- people=$( sed -n '2p' test.txt )
- echo "num=$num"
- echo "people=$people"
- #insmod hello.ko num=1 people=" zhangsan"
- insmod hello.ko num=`expr $num` people=$people