《Linux设备节点创建》内核kobject上报uevent过滤规则
- 格式:docx
- 大小:63.98 KB
- 文档页数:12
《Linux设备节点创建》内核kobject上报uevent过滤规则 http://blog.csdn.net/tankai19880619/article/details/11776589
说明:本文基于Android2.3和Linux2.6,其余版本仅供参考。 Android2.3及Linux2.6.29内核模拟器版本编译与调试 阅读本文前请阅读:Linux总线、设备、驱动与设备节点创建、用户测试程序 一、netlink监听程序 testnet.c [cpp] view plain copy
1. #include 2. #include 3. #include 4. #include 5. #include 6. #include 7. //该头文件需要放在netlink.h前面防止编译出现__kernel_sa_family未定义 8. #include 9. #include 10. 11. void MonitorNetlinkUevent() 12. { 13. int sockfd; 14. struct sockaddr_nl sa; 15. int len; 16. char buf[4096]; 17. struct iovec iov; 18. struct msghdr msg; 19. int i; 20. 21. memset(&sa,0,sizeof(sa)); 22. sa.nl_family=AF_NETLINK; 23. sa.nl_groups=NETLINK_KOBJECT_UEVENT; 24. sa.nl_pid = 0;//getpid(); both is ok 25. memset(&msg,0,sizeof(msg)); 26. iov.iov_base=(void *)buf; 27. iov.iov_len=sizeof(buf); 28. msg.msg_name=(void *)&sa; 29. msg.msg_namelen=sizeof(sa); 30. msg.msg_iov=&iov; 31. msg.msg_iovlen=1; 32. 33. sockfd=socket(AF_NETLINK,SOCK_RAW,NETLINK_KOBJECT_UEVENT); 34. if(sockfd==-1) 35. printf("socket creating failed:%s\n",strerror(errno)); 36. if(bind(sockfd,(struct sockaddr *)&sa,sizeof(sa))==-1) 37. printf("bind error:%s\n",strerror(errno)); 38. while(1){ 39. memset(buf,0,sizeof(buf)); 40. len=recvmsg(sockfd,&msg,0); 41. if(len<0){} 42. //printf("receive error\n"); 43. else if(len<32||len>sizeof(buf)) 44. printf("invalid message"); 45. for(i=0;i46. if(*(buf+i)=='\0') 47. buf[i]='\n'; 48. printf("received %d bytes\n%s\n",len,buf); 49. } 50. } 51. 52. int main(int argc,char **argv) 53. { 54. MonitorNetlinkUevent(); 55. return 0; 56. }
Android.mk [plain] view plain copy
1. LOCAL_PATH:= $(call my-dir) 2. include $(CLEAR_VARS) 3. 4. LOCAL_SRC_FILES:= \ 5. testnet.c 6. 7. LOCAL_SHARED_LIBRARIES := \ 8. libutils 9. 10. LOCAL_MODULE:= testnet 11. 12. LOCAL_MODULE_TAGS := optional 13. 14. include $(BUILD_EXECUTABLE)
二、如下是添加打印后的信息(Android用户空间udev为ueventd,属于init的一个软连接) 1.总线驱动 root@android:/data/tank # insmod testbus.ko [plain] view plain copy
1. //内核模块加载成功,会上报netlink 2. TK------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env 3. kobject: 'testbus' (bf02d1c8): kobject_uevent_env 4. TK------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env>>>>netlink_broadcast
5. //总线注册上报netlink 6. TK---testlddbus.c----->>>>ldd_bus_init 7. TK--------->>>>>>bus.c>>>>>>bus_register,,,bus->name is ldd 8. TK-------_>>>>kobject.c>>>>>>>kset_register 9. TK-------_>>>>kobject.c>>>>>>>kset_register>>>kobject_uevent 10. TK------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env 11. kobject: 'ldd' (cfcdb1c8): kobject_uevent_env 12. TK------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env>>>>netlink_broadcast
13. //设备注册由于没有分配主设备号,不上报netlink 14. TK-------_>>>>>>>>core.c>>>>>device_register 15. TK-------_>>>>>>>>core.c>>>>>device_add 16. TK-------_>>>>>>>>core.c>>>>>device_add>>>>>kobject_uevent 17. TK------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env 18. TK-------_>>>>>>drivers/base/core.c>>dev_uevent_filter>>ktype is 0xc032137c,&device_ktype is 0xc032137c 19. TK-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->uevent_suppress is 0 20. TK-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->bus is 0x0 21. TK-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->class is 0x0 22. kobject: 'ldd0' (bf02d074): kobject_uevent_env 23. kobject: 'ldd0' (bf02d074): kobject_uevent_env: filter function caused the event to drop! 24. //用户空间ueventd的处理,2个uevent事件 25. init: TK-------_>>>>>uevent.c>>>>>>ueventd_main>>>>ufd.fd is 4 26. init: TK-------_>>>>>>device.c.>>>>>>handle_device_fd 27. init: TK------------>>>>device.c>>>>>>handle_device_event>>>>uevent->major is -1,uevent->minor is -1 28. init: TK------------>>>>device.c>>>>>>handle_device_event>>>>>>uevent->major and minor < 0 29. init: TK------------>>>>device.c>>>>>>handle_device_event>>>>uevent->major is -1,uevent->minor is -1 30. init: TK------------>>>>device.c>>>>>>handle_device_event>>>>>>uevent->major and minor < 0 31. received 83 bytes 32. add@/module/testbus 33. ACTION=add 34. DEVPATH=/module/testbus 35. SUBSYSTEM=module 36. SEQNUM=649 37. 38. received 66 bytes 39. add@/bus/ldd 40. ACTION=add 41. DEVPATH=/bus/ldd 42. SUBSYSTEM=bus 43. SEQNUM=650
说明: drivers/base/bus.c [plain] view plain copy
1. int bus_register(struct bus_type *bus){ 2. retval = kset_register(&priv->subsys); 3. /* 4. lib/kobject.c 5. int kset_register(struct kset *k){ 6. kobject_uevent(&k->kobj, KOBJ_ADD); 7. } 8. */ 9. retval = bus_create_file(bus, &bus_attr_uevent); 10. priv->devices_kset = kset_create_and_add("devices", NULL, &priv->subsys.kobj); 11. priv->drivers_kset = kset_create_and_add("drivers", NULL, &priv->subsys.kobj); 12. }