리눅스 3.4.6 커널은 프로세스 분석을 중단

코드의 각각의 커널 버전이 다른 작은 부분을해야하지만 일반 과정은 기본적으로 동일, 단지 호출 함수 이름과의 관계에 약간의 변화이다,의 인터럽트 처리를 분석 할

1 :이 파일는 traps.c 무효 __init early_trap_init (무효 * vectors_base) 아치 / 팔 / 커널 재배치 기능 /에서 인터럽트 벡터 테이블

 

검색 __vectors_start 발견 vector_stub의 IRQ, 아치 / 팔 / 커널 / entry_armv.S에서이 파일 IRQ_MODE, 네 개의 다운 스트림 프로세스의 사례 연구에 매크로 정의가 알고

vector_stub 매크로입니다.

여기 __irq_usr 사용자 모드 프로세스를 중단하는 것은 __irq_usr를 검색했다

 

이이 매크로입니다 irq_handler, 또는이 entry_armv.S에서 검색 계속

 

검색 arch_irq_handler_default 후 asm_do_IRQ를 호출

 

전면은 여기 어셈블러로 작성, asm_do_IRQ 뒤에 함수 C를 달성하는 데 사용됩니다

  다음과 같은 관계가 호출 :

  early_trap_init // 커널은 여기에 가상 주소를 사용하여 새로운 가상 주소 0x00000000의 원래 인터럽트 벡터 0xffff0000을하거나 커널 설정 파일에있을 수있다

    vector_stub IRQ // 인터럽트 사용자 모드 분석까지입니다

      __irq_usr

        irq_handler

          arch_irq_handler_default

            asm_do_IRQ

다음 asm_do_IRQ 이해 분석하기 위해 것은 휴식하는 방법입니다 

2 : 나열된 제 호출 그래프

  asm_do_IRQ

    handle_IRQ

      generic_handle_irq

        구조체 irq_desc * DESC = irq_to_desc (IRQ);

        generic_handle_irq_desc

          호출 핸들러 3 : 투명한 인터럽트 2 해상도 인터럽트 :; desc-> handle_irq (IRQ, DESC) // DESC 구조 함수 1 실현

================================================= 부문 라인 ================================================= ====

  desc-> handle_irq (IRQ, DESC) 분석은 그 함수를 가리키는 handle_irq? 커널 / IRQ / chip.c에서의 desc-> handle_irq = 처리 호출이 편지에서 찾을 __irq_set_handler 검색;

  / 리눅스 / irq_set_chained_handler에서 irq.h에 다음에 아치 / 팔 / 작은지면-s3c24xx 얻을 검색 함수 호출을 불렀다 포함 호출 누가 볼이 기능 __irq_set_handler 다시 검색

  s3c24xx_init_irq이 기능이 다른 인터럽트 초기화 기능이 호출 할 수 __irq_set_handler 예에 불과 내부 초기화 인터럽트 기능 설정된다 구성체 irq_desc 구조에서이 함수 호출 통화

  handle_edge_irq

    handle_irq_event (내림차순)는; //이 함수는 인터럽트를 처리하는 것입니다

  계층 우리가 또한 포함 아래에 정의 된 이러한 구조 irq_desc 구조를 분석해야이 같다 일부만 나열 / 리눅스 / irqdesc.h

다음은 커널 인터럽트 아키텍처는 어떤 우리가 우리 자신의 인터럽트를 사용하는 경우, 우리는 어떻게 커널을 말할까요, 프레임을 중단, 일을입니까? 에 등록 Request_irq의 다음을 분석 할

irq_desc 처리 기능, 연결리스트 등의 각종이 있으며, 숫자 첨자 배열 중단 우리가 사용하고자하는 자신의 인터럽트 구동, 그것을 충전을 구성하기 위해 필요한 다음리스트에 등록 된 고유.

 

request_irq

  request_threaded_irq

    action = kzalloc(sizeof(struct irqaction), GFP_KERNEL);    //分配一个irqaction结构体

    action->handler = handler;                //填充 把传入的参数填充到结构体
    action->thread_fn = thread_fn;
    action->flags = irqflags;
    action->name = devname;
    action->dev_id = dev_id;

    retval = __setup_irq(irq, desc, action);          //设置中断

       __irq_set_trigger

        ret = chip->irq_set_type(&desc->irq_data, flags);  //设置中断类型

    __enable_irq(desc, irq, false);              //使能中断

 

到此基本分析完毕,下一节 写一个基本中断的按键驱动程序

 

추천

출처www.cnblogs.com/x2i0e19linux/p/11718602.html