2012년 10월 26일 금요일

request_threaded_irq


int __must_check
request_threaded_irq(unsigned int irq, irq_handler_t handler,
             irq_handler_t thread_fn,
             unsigned long flags, const char *name, void *dev);


  • irq 에 따라서 handler, thread_fn 을 돌려달라고 등록하기.



  • handler 에 NULL을 넣으면 default handler(irq_default_primary_handler) 가 불려 thread_fn 이 수행되는 동안 해당 irq 를 disable 상태로 만들어둔다. return 은 IRQ_WAKE_THEAD.
    • 참고하여 handler function 을 만들도록 해야겠다. 또한, thread_fn 안에서는 irq 를 enable 해주도록 할 것.



  • 왜 handler 와 thread_fn 두 개인가?
    • thread_fn 을 NULL 로 넣어도 상관없음.
      • 이 경우 그냥 request_irq 와 같음.



예제: mmc host 에서 새로운 mmc card 인식을 위하여 gpio 를 irq 로 연결할 때.



linux version 2.6x  도입.

2012년 7월 31일 화요일

bluetooth stack 분석

Android : bluez 를 이용
* bluez 구성
* linux kernel (net/bluetooth ) 부분에 hci command 를 이용한 l2cap 이 구현되어 있음.
* library 형태로 profile 들이 구현되어 있음.
* bluetoothd 라는 daemon 을 띄우고 d-bus 를 통해 android platform 과 통신함.
* sdp tree 관련 처리는 tool을 이용해서 따로 하고 있음.

Windows 7,8
* MS 에서 구현 bthport.sys 라는 port 가 있고 여기에 miniport 로 bthusb.sys 랑 bthuart.sys 같은게 있음. ( l2cap 이 여기서 다 구현되어 있음)

- 참고
bthusb 등이 bthport 에 있는 함수를 직접 부를 형태여서 이 사이에 filter를 달거나 할 수 없음.
따라서 당연히 device tree 를 확인하는 툴로 봐도 bthport.sys는 안보임.

* profile 들도 driver 형태로 구현함
* BRB 라고 bluetooth request block 을 만들어서 ioctl로 내리면 알아서 처리해줌.
* sdp tree 관련해서 처리하는 inteface 를 비슷한 layer에서 제공해줌.

2012년 4월 25일 수요일

unlink 시에는 negative dentry 가 생기지 않는다

lookup 시에 찾으려는 file 이 없으면 dentry 가 가르키는 (vfs) inode 를 NULL 로 만들어둔다.

이런 dentry는 nagative dentry 가 되어서 다음 번 lookup에 활용된다.


unlink 시에는 inode 를 없애야 하는데, 이 때 dentry 가 가르키는 inode만 없애는 것이 아니라

dentry 까지 같이 free 한다.

2012년 4월 3일 화요일

linux getdents (readdir) 의 callback filldir 에 대하여

readdir 
linux 에서 directory file 의 내용을 읽기 위하여 사용하는 API 이다.


대표적으로는 ls 가 readdir을 통해서 구현되었다고 생각하면 된다.
실제로 사용하는 syscall 은 getdents 이다. 


이름으로 보면 getdent's' 복수형이다. 
즉, readdir을 directroy file 내용을 하나씩 읽어오고
getdents는 여러개씩 읽어오도록 되어있다.


당연히 getdents 가 성능이 더 좋다.


내부의 구현을 보면 둘다 vfs_readdir() 을 부르게 되는데, 다만 이 때 넘겨주는 callback fuction 인 filler (readdir은  fillonedir, getdents는 filldir) 의 차이로 구분하게 된다.

여기서 남기고 싶은 이야기는


getdents 가 넘거주는 filldir 에 d_type 에 대한 것이다.



static int filldir(void * __buf, const char * name, int namlen, loff_t offset,
  u64 ino, unsigned int d_type)


뭐하는데 쓰이는 지 봤는데, 오로지 ext2,3,4, Btrfs 만 을 위한 field 같이 보인다.
다른 인자들은 특별할 것이 없이 fs 가 name, len, offset, ino 를 주면 buf 에 미리 약속된 형태(linux_dirent)로 적절히 넣어준다.
이 때 마지막에 d_type을 넣어주는데. 이것을 보고  block device, character device 인지 directory 인지 혹은 named pipe 인지 따위의 정보를 알 수 있다. 


http://linux.die.net/man/2/getdents 보면,
"Currently, only some file systems (among them: Btrfs, ext2, ext3, and ext4) have full support for returning the file type in d_type. All applications must properly handle a return of DT_UNKNOWN."


라고 되어있다.  


vfs code를 보다보니 Btrfs만을 위한 특별한 code가 들어있을 만큼 linux에서 Btrfs에게 신경을 써주는 거 같은데, 혹시나 이것도 그런 것일까? d_type 은 대체 무슨 이득이 있어서 넣어둔 것일까 궁금하다.

2011년 12월 7일 수요일

signed 와 unsigned 의 비교

그냥 ubuntu gcc로 compile 할 때는 멀쩡하던 것이
android 용으로 ndk-build 를 써서 빌드하니까 엄청난 warning 들이 나왔다.
다른 것들은 뭐 initialize 안한 것 부터해서 그냥 휙휙 고치면 되는 것들이었는데...

warning: comparison between signed and unsigned integer expressions
이 녀석은 조금 골치가 아프다. 아...놔... 누굴까 대체...

그래서!

int 와 unsigned int 를 비교하면 어떻게 되는지 실험해보기로 했다.

구글링으로도 잘 안나오더라...OTL
환경은 64bit ubuntu...그냥 int는 4byte, long은 8byte 이다... 혹시나 해서ㅎ

기억하던대로(?)

int i = -1  는 0xffffffff
unsigne int ui = -1 도 0xffffffff (unsigned 에 -1 넣어도  warning 없이 compile 잘 되는구나;;;)

비교하면 그냥 같다고 나오는구나...
걍 bit 배열만 보고 판단하는 구나.. 그랬구나 OTL 허무...

자 이제 ... 누군가

int x = -1 이라고 하고
unsigned int y 로 받아온 값을 비교하는데..

if( x == y ) goto error;
라고 적어둔 식에서 위에 경고가 뜨는 걸
그냥 type casting 으로 없애도 되는가에 대한 결론을 내보자.

재수없이 y 에 0xffffffff 가 들어왔다면?!
하아 -_-... error 겠구만... 잘 발견하기도 어려운...
일단은 0xffffffff은 안들어오는 것이 보장되는 것 같으니 일단은 type casting 만 하고 넘어간다.



블로그 시작

나도 뭐라도 남겨야 겠다.
이 사진의 이상한 점은?!ㅋㅋㅋ

Code Reading (오픈소스 관점에서 본 코드 읽기) 책 정리

쓸만한 것들

#define STREQ(a,b) (*(a)==*(b) && strcmp((a), (b) == 0)

- strcmp 을 if 문에 넣을 경우 if(!strcmp(a,b)) 가 a, b가 같을 경우라서 보기 안좋았는데,
위와 같이 매크로를 만들어 쓰면 깔끔해진다. 헐... 게다가 첫 문자가 다를 경우 바로 다르다고 뒤를 생략 할 수 있으니 미미한(?) 최적화 효과도 기대해 볼 수 있다.