file_operations 구조체 원형

struct file_operations {
   struct module *owner;

   // llseek 메소드는 파일에서 현재의 read/write의 위치를 옮기며, 새로운 위치가 (양수)값으로 리턴된다. 에러는 음수값으로 반환된다.
   loff_ (*llseek) (struct file *, loff_t, int);

   // read 메소드는 디바이스에서 데이터를 가져오기 위해서 사용한다. 여기에 NULL 값을 사용하면 read 시스템
콜은 -EINVAL(“잘못된 매개 변수”)값을 돌려 주며 실패한다. 음수값이 아닌 리턴값은 성공적으로 읽은 바이트 수를 나타낸다.
   ssize_t (*read) (struct file *, char *, size_t, loff_t *);
  
   // 디바이스에 데이터를 보낸다. NULL 값을 스면 wirte 시스템 콜에 대해서 -EINVAL을 돌려준다. 리턴값이 음수가 아니면 성공적으로 작성된 데이터의 바이트 크기이다.
   ssize_t (*write) (struct file *, const char *, size_t, loff_t *);

   // 이 함수 포인터는 디바이스 노드에 대해서는 NULL이어야 한다. 이것은 디렉토리에 대해서 사용한다.
   int (*readdir) (struct file *, void *, filldir_t);

   // 현재의 프로세스를 대기 큐에 넣는다.
   unsigned int (*poll) (struct file *, struct poll_table_strcut *);

   // ioctl 시스템 콜은 디바이스에 종속적인 명령을 만들 수 있도록한다. 커널이 fops 테이블을 참조하지 않고도 인식할 수 있는 많은 ioctl 명령이 있다.
   int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

   // mmap은 디바이스 메모리를 프로세서의 메모리에 맵핑시키도록 요청하기 위해 사용된다. 디바이스가 이 방법을 제공하지 않으면 리턴값은 ENODEV 이다.
   int (*mmap) (struct file *, struct vm_area_struct *);

   // 이 항목이 NULL 로 되어 있으면 디바이스 open 호출은 언제나 성공적이다.
   int (*open) (struct inode *, struct file *);

   // 연린 디바이스를 닫기 이전에 모든 데이터를 쓰도록 하기 위해서 사용한다.
   int (*flush) (struct file *);

   // 노드를 닫을 때 수행된다.
   int (*release) (struct inode *, struct file *);

   // 데이터 중에서 버퍼에 있는 것은 모두 디바이스에 쓴다. 이 메소드가 지원되지 않으면 fsync 시스템 콜은 -EINVAL 리턴값을 갖는다.
   int (*fsync) (struct file *, struct dentry *, int datasync);

   // 이 동작은 FASYNC 플래그에 변화가 있는 디바이스를 확인하기 위해서 사용한다. 드라이버가 비동기 통지를 지원하지 않을 경우에 이 필드를 NULL로 두면 된다.
   int (*fasync) (int, struct file *, int);

   // 파일에 락을 걸기 위해서 사용한다.
   int (*lock) (struct file *, int, struct file_lock *);

   ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);

   ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);

   ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);

   unsigned long (*get_unmapped_area) (struct file *, unsigned long,
unsigned long, unsigned long, unsigned long, unsigned long);
}

참조 : http://blog.naver.com/sglinux2418?Redirect=Log&logNo=20185596

크로스, 다이렉트 랜 케이블

 크로스 : 컴퓨터 – 컴퓨터
 다이렉트 : 컴퓨터 – 허브

 크로스 케이블

주황색 띠  ———-    녹색 띠
주황색  ———-    녹색
녹색 띠       ———-    주황색 띠
파란색    ———-    파란색
파란색 띠    ———-    파란색 띠
녹색       ———-    주황색
갈색 띠    ———-    갈색 띠
갈색    ———-    갈색

 다이렉트 케이블

주황색 띠    ———-    주황색 띠
주황색    ———-    주황색
녹색 띠    ———-    녹색 띠
파란색    ———-    파란색
파란색 띠    ———-    파란색 띠
녹색    ———-    녹색
갈색 띠    ———-    갈색 띠
갈색    ———-    갈색

bootp 설정법

 bootp란 호스트 PC에서 타겟 보드에 IP를 유동적으로 할당할 수 있는 프로토콜이다.

 네트워킹에 기본이 되는 IP를 먼저 할당함으로써 tftp, nfs, 웹 서버 포팅 등이 가능하게 된다.

 설치는 해당 rpm파일을 다운받은 후, 다음과 같이 입력하면 된다.

rpm -Uvh bootp-2.4.3-7.i386.rpm

 rpm이 성공적으로 설치가 완료되면 다음과 같은 설정파일을 생성해준다.

 /etc/bootptab

empos:
    ht=1:
    ha=0x000BA8000011:
    ip=192.168.10.165:
    sm=255.255.255.0

 /etc/xinetd.d/bootp

service bootps
{
    socket_type   = dgram
    flags              = REUSE NAMEINARGS
    protocol         = udp
    wait               = yes
    user               = root
    server            = /usr/sbin/bootpd
    server_args   = -s
    disable           = no
}

 그런다음 Bootloader에서 bootp 명령을 실행하면 된다.

 단, 이 명령을 시작하기전 호스트 PC와 타겟보드 사이에는 크로스 케이블로 연결이 되어있어야 한다.

처음에는 이를 알지못하여 한창 헤메었다….

댓글…..

 좋은 위치!!

 너의 위치에 감사하십시요!!

 차가운 위치!!

 당신의 훌륭한 위치는…

 얼마전부터.. 위의 글과 같은 알수없는 댓글들이 달리기 시작했다…

 무엇을 뜻하는지…알아보기도 힘들다.

 광고인것 같은데…문제는 광고를 보는 사람이 무슨 광고인지 모르겠다는 것…

 한동안 계속 수작업으로 댓글들을 삭제 하였다..

 하지만 하룻만에 250여개의 댓글들이 달리는 것을 보고…살포시 ‘손님들의 댓글 작성’ 권한을 삭제하였다.

 이로써 좀 잠잠해졌으면 한다…

알수없는 에러….

 컴파일중 이상한 오류를 발견했다..

/usr/local/arm/arm-linux/sys-include/asm/fcntl.h:74: parse error before “pid_t”
/usr/local/arm/arm-linux/sys-include/asm/fcntl.h:80: parse error before “loff_t”
/usr/local/arm/arm-linux/sys-include/asm/fcntl.h:82: parse error before “l_pid”

 단순한 프로그램이었는데…이상했다.

 이렇게도 바꾸고 저렇게도 바꾸어서 원인을 찾았는데…

 답은 헤더 파일의 입력 순서에 있었다.

 원래는..

#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <asm/fcntl.h>
#include <stdio.h>

였는데…

이를 다음과 같이 바꾸니 문제가 해결되었다..

#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <asm/fcntl.h>
#include <stdio.h>

 개운하지가 않다.

 문제는 해결했는데 어찌 해결했는지를 모르겠다….

 분명 헤더파일의 입력때문에 뭔가가 엉킨것 같은데….꼭 집어내지를 못하겠다.