링크 ux 에서 인 터 럽 트 아 날로 그 핫 플러그 를 사용 합 니 다.

소개
        Liux 에서 자주 사용 하 는 사용자 층 과 커 널 층 의 통신 방법 은 시스템 호출 (예 를 들 어 copy to user / copy from user), proc, ioctl 과 netlink 가 있다.핫 플러그 모드 는 Liux 가 nelink 를 바탕 으로 이 루어 진 것 입 니 다.netlink 의 설명 은 튜 토리 얼 을 볼 수 있 습 니 다.http://blog.csdn.net/zcabcd123/article/details/8272423。
2. 실현 절차
1. 충전 구조
         Linux 시스템 에서 시스템 설정 이 바 뀌 었 을 때, 예 를 들 어 kset 을 시스템 에 추가 합 니 다.kobject 를 이동 하면 커 널 공간 에서 사용자 공간 으로 알림 이 전 송 됩 니 다. 이것 이 바로 핫 플러그 이벤트 입 니 다.핫 플러그 사건 은 사용자 공간 에 해당 하 는 처리 프로그램 (예 를 들 어 udev, mdev) 을 호출 할 수 있 습 니 다. 이 처리 프로그램 들 은 드라이버 를 불 러 오고 장치 노드 를 만 드 는 등 핫 플러그 사건 에 응답 합 니 다.  Struct kset_uevent_ops {int (* filter) (struct kset * kset, struct kobject * kobj), const char * (* name) (struct kset * kset, struct kobject * kobj), int (* uevent) (struct kset * kset, struct kobject * kobj, struct kobj uevent env * env);} 이 kset 이 관리 하 는 kobject 와 kset 상태 가 변 할 때(가입, 이동)이 세 가지 함수 가 호출 됩 니 다. Filter: 사용자 공간 에 이 벤트 를 전달 할 지 여 부 를 결정 합 니 다. filter 가 0 으로 돌아 가면 이 벤트 를 전달 하지 않 습 니 다. Name: 사용자 공간 에 해당 하 는 문자열 을 전달 하 는 핫 플러그 처리 프로그램 을 담당 합 니 다. Uevent: 사용자 공간 에 필요 한 인 자 를 환경 변수 에 추가 합 니 다. 따라서 kse 를 먼저 채 웁 니 다.t uevent ops 이 구조 체:
static struct kobj_type ktype =
{
};
static int kset_filter(struct kset *kset,struct kobject *kobj)
{
    return 1;
}

static const char *kset_name(struct kset *kset,struct kobject *kobj)
{
    static char buf[20];

    sprintf(buf,"%s","SmartCover");
    return buf;
}


static int kset_uevent(struct kset *kset,struct kobject *kobj, struct kobj_uevent_env *env)
{
    return 0;
}

static struct kset_uevent_ops uevent_ops =
{
    .filter = kset_filter,
    .name = kset_name,
    .uevent = kset_uevent,
};

struct kset *kset_p;
struct kset *kset_c;

2. 초기 화 및 로그아웃
probe 함수 에 추가:
    kset_p = kset_create_and_add("kset_p", &uevent_ops, NULL);
    kset_c = kzalloc(sizeof(*kset_c), GFP_KERNEL);  //   kset   
    kobject_set_name(&kset_c->kobj,"kset_c");
    kset_c->kobj.kset = kset_p;
    kset_c->kobj.ktype = &ktype;

release 함수 에 로그아웃 함 수 를 추가 합 니 다. (일반적으로 시스템 에서 실행 할 기회 가 없습니다.)
    kset_unregister(kset_p);

3. 구체 적 인 시 뮬 레이 션
 kset 을 시스템 에 추가 / 삭제 할 때 커 널 에서 사용자 층, 즉 핫 플러그 로 알림 이 보 내기 때 문 입 니 다. 따라서 우 리 는 첫 번 째 중단 시 삽입 이 고, 다음 에는 뽑 아서 내 추 럴 수 있 도록 설정 할 수 있 습 니 다.
상부 테스트
Android 상층 부 에 서 는 핫 플러그 의 발생 을 감지 하기 위해 UEventObserver 방법 을 사용 합 니 다. 다음 절 차 는 다음 과 같 습 니 다. 1. 감청 할 핫 플러그 파일 경 로 를 설정 합 니 다. 위 에서 시 뮬 레이 션 한 핫 플러그 파일 위 치 는 / sys / kset p 이 므 로 파일 경 로 를 / kset p 로 설정 합 니 다.
	if(add){                    //           
            kset_unregister(kset_c);   //  kset        。     kset    ,kset_unregister   free kset_c   ,         
                                            ,              。
            if(!kset_c){
                kset_c = kzalloc(sizeof(*kset_c), GFP_KERNEL);
            }
            kobject_set_name(&kset_c->kobj,"kset_c");
            kset_c->kobj.kset = kset_p;
            kset_c->kobj.ktype = &ktype;
        }else if(!add){   //           
            kset_register(kset_c); //  kset,       add。
        }

2. UEventObserver. onUEvent 재 작성 방법
	private String ueventTest = "DEVPATH=/kset_p";

3
감청
참고 자료
1. Android 테스트 감청 apk 코드 다운로드:
http://download.csdn.net/detail/u011630458/7364653 2. Android 상부 테스트 의 튜 토리 얼, blog 를 볼 수 있 습 니 다:http://blog.csdn.net/lushengchu_luis/article/details/9466405
3. 테스트 의 전체 코드 는 다음 과 같 습 니 다. (안 드 로 이 드 소스 코드 에서 컴 파일 해 야 합 니 다)
    private final UEventObserver mUEventObserver = new UEventObserver() {
        @Override
            public void onUEvent(UEventObserver.UEvent event){
                Log.e("Seven", "yulinghan UEVENT: "+event.toString());
            }
    };

좋은 웹페이지 즐겨찾기