리눅스 - 해당되는 글 36건

커널에서는 malloc()나 free()를 이용해 동적 메모리를 사용할 수 없다.

malloc,free와 유사하며 디바이스드라이버에서 많이 사용되며 할당 속도가 빠르다.

DMA같은 디바이스가 사용하는 연속된 물리 메모리 주소가 필요한상황
DMA는 물리 주소 밖에 모르고 그렇기 때문에 연속된 물리 주소에만 기록가능
DMA사운드 UART등에서 DMA를 사용할때 heap처럼 malloc을 사용할 수 없다.
펌웨어 단계에선 물리 메모리를 쓰듯이 써서DMA를 그냥 사용한다.
리눅스는 가상주소사용 DVICE드라이버에서 가상메모리의 연속적인 주소도
실제보면 물리적인 메모리에서 연속되지 않을 수 있기 때문에 DMA는 물리적으로 연속된
공간에서만 CPU의 간섭을 받지않고 직접쓰기 때문에 커널에서 제공하는 메모리를 할당하는
API를 사용한다.

인터럽트랑 동작할때와  동작중이지 않을때 커널에 API가 필요할수도 있고 필요하지 않을수있다.
      리눅스  |  2007. 10. 23. 09:48




사용자 삽입 이미지

cat /proc/knrmsg
하면 이파일은 일반적인 파일이 아니기 때문에 가만히 있다가 메사지가 나올때마다 출력해준다.
      리눅스  |  2007. 10. 19. 11:34




장치를 읽어와서 유저 어플리케이션에 전달을 해주는것이목표이다.
형태는
--------
리드하는 함수 쓰는방법 read함수에서 필요한것은
ssize_t _XXX_read(struct file *flip, char *buff, size_t  count,  loff_t  *off)
read를 할때는 copy_to_user를 사용한다.
변수하나에 등록을 할때는 putuser를 사용한다.
디바이스를열때
O_NONBLOCK, O_NDELAY등에 연결되어있다,.
리드함수에서 하드웨어를 다루려면 다음함수를 사용한다.
매모리맵아이오 :  readb,readw, readl  암에서 주로쓴다
포트맵아이오 inb,inw,inl,nsb,insw,insl 엑스팔육에서 주로쓰고
아이오 매모리 블럭 memcopy  이런거 쓴다.
다용자에게 카피투유저나 풋유저를 사용해서 사용자가 넘겨준 주소를 쓰면된다.

인터럽트 서비스
내부저장
내부버퍼에 쌓여있는 데이터를 보고 풋유저나 카피투유저를 이용해서
사용자 메모리에다가 복사를 해준다.
-----------------------

iotcl은 리드나 라이트 함수가지고 할수없는제어나 기능들
리드나 라이트를 장치로부터 데이타를 쓰거나 데이타를 읽어 오는기능들은하는것이다.
보레이트 설정이나,
이런것들은 ioctl을 이용해서 특정값을 쓸수있도록 구현을 해줄수있다

cmd는 정해진게아니다, 보통인트형이고 디바이스마다 다르다.
어플리에선이렇게 쓰면된다.
int ioctl(int fd, int cmd...);

예를 들어서 유아트의 보레이트를 설정하고 싶으면
set _보레이트 가 1번으로 설정되어 있으면
intioctl(1, 232..);이런식으로 쓴다
==============================================
커널의 ioctl은
변함없이 inode구조체랑파일구조체가 넘어온다.
그리고 arg라고하는 주소를 전달해주는것이 넘어온다.
cmd인수를 명령을 나타내는 응용프로그램의 인수전달

cmd상수값  디바이스드라이버에서 정의한 이값을 유저 어플리케이션에도 알고 있어야된다.
예를들면 커널의 cmd 1을 유저 어플에서도 cmd 1번이 같게 동작하게 만들어야된다.
int sk_ioctl(struct inode *inode, struct file *filp, unsigned int cmd , unsigend long arg);
-----------------------------------------------------------------------------------------
커널 cmd가 들어왔을때 0 이면 어떤작업하고 1이면 어떤작업하고 하는게 케이스문같은걸로 정의 되어 있다.

      리눅스  |  2007. 10. 19. 10:39



sokoban's Blog is powered by Daum & Tattertools