리눅스14 Memory Mapping [블로그 통합으로 이전해 온 자료] - 2008. 4. 29. 20:57 * mmap * I/O 물리 주소의 커널 가상 주소로 맵팽 void *ioremap( unsigned long offset, unsigned long size ); void *ioremap_nocache( unsigned long offset, unsigned long size ); void *iounmap( void *data ); *_nocache() 버전은 pci 디바이스의 non-prefetchable 영역에 사용 * I/O 물리 주소와 커널 가상 주소간의 변환 unsigned long virt_to_phys( volatile void *address ); void *phys_to_virt( unsigned long addr.. 2021. 2. 8. 인터럽트 (Interrupt) 처리 [블로그 통합으로 이전해 온 자료] - 2008. 4. 28. 22:49 * 등록 / 해제 - int request_irq( irq, handler, flags, name, dev_id ); - free_irq( irq, dev_id ); unsigned int irq irqreturn_t (*handler)( int, void *, strct pt_regs * ) unsigned long flags const char *name void *dev_id - 인터럽트를 공유하는 경우는 디바이스의 open에서 등록하고 close에서 해제하는 것이 바람직하나 임베디드 환경에서는 대게 인터럽트를 전용으로 사용하기 때문에 디바이스의 등록 시점에서 할당하고 디바이스의 해제에서 인터럽트를 해제하는 것이 바람직할 것이.. 2021. 2. 8. 커널 타이머, 태스크릿, 작업큐 [블로그 통합으로 이전해 온 자료] - 2008. 4. 25. 04:42 in_interrupt() - 프로세스가 인터럽트 문맥에 있는지 검사 true == 0 in_atomic() - 스케줄링 허용 여부 true == 0 h/w, s/w 인터럽트는 물론 spinlock을 쥐고있는 경우에도 해당 * kernel timer - 사용자 영역에 접근해서는 안된다. (copy_*_user류의 함수와 같은..) 프로세스 문맥이 없으므로 특정 프로세스에 관련된 사용자 영역을 가를키는 경로가 없다. - current 포인터를 사용해서는 안된다. - 잠들기나 스케줄링을 수행할 수 없다. schedule_(), wait_event_(), kmalloc(), 세마포어등 사용 금지 struct timer_list ktime.. 2021. 2. 8. 드라이버 코드의 실행 지연 [블로그 통합으로 이전해 온 자료] - 2008. 4. 25. 04:07 * 긴 지연 // 실행 대기 while ( time_before( jiffies, j1 ) ) cpu_relax(); // 스케쥴링 while ( time_before( jiffies, j1 ) ) schedule(); 이벤트를 기다리는 지연일 경우는 대기큐를 사용한 timeout 방법도 있다. wait_event_timeout(); wait_event_interruptible_timeout(); 하지만 이벤트를 사용하지 않는다면 schedule_timeout()을 사용한다. set_current_state( TASK_INTERRUPTIBLE ); schedule_timeout( j1 ); timeout 시간은 jiffies 수가 .. 2021. 2. 8. 이전 1 2 3 4 다음