device driver 공부중인 학생인데, ioctl 관련 질문입니다.

yaeho12의 이미지


fnd, dot 디바이스 드라이버를 통합해서 사용하기 위해
write함수를 ioctl 함수를 안에넣고 사용하려고 하는데,
make와 모듈적재는 문제없이 되고, fnd_clear는 정상작동하는데, fnd_write(a)의 경우 입력한 데이터가 fnd에 출력되지 않습니다.
write문을 저렇게 바꾸면 안되는건가요.
도움을 청합니다.

편의상 코드는 잘라서 올렸습니다.
//디바이스 드라이버

#define FND_CSX fnd 메모리주소
 
 
 
unsigned char disp[8] = {0};
 
int fnd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
char[8] a=arg;
    switch(cmd)
    {
        case 1:fnd_clear();
	case 2:fnd_write(a);  break;
        default: break;
    }
	return 0;
}
//static ssize_t fnd_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos)
ssize_t fnd_write (const char *buf)
{
    int i;
 
    i=1;
    get_user(disp, (unsigned char*)buf);
    //copy_from_user(disp, buf, count);
    //printk( "write data %x \n", disp[5]);
 
    for(i =1; i <= MAX_FND; i++){	
    switch(i)
    {	
        case  1:    FND_CS7 = disp[0];  break;
        case  2:    FND_CS6 = disp[1];  break;
        case  3:    FND_CS5 = disp[2];  break;
        case  4:    FND_CS4 = disp[3];  break;
        case  5:    FND_CS3 = disp[4];  break;
        case  6:    FND_CS2 = disp[5];  break;
        case  7:    FND_CS1 = disp[6];  break;
        case  8:    FND_CS0 = disp[7];  break;
        default :   break;
    }
    }
    return 0;
}
 
static struct file_operations fnd_fops = {
	.open =fnd_open,
	//.write =fnd_write,
	.release =fnd_release,
	.ioctl =fnd_ioctl,
};

// 테스트프로그램

int main()
{
 
	int n=0; 
        int count=0;
        int dev=0;
	int len=0;
	int i=0;
	unsigned char		buf[MAXFND+1]="7\0";
	unsigned char	new_buf[MAXFND+1];
 
        dev = open( fnd_dev, O_RDWR);
 
while(1)
{
memset(buf, 0, sizeof(buf));
		memset(new_buf, 0, sizeof(new_buf));
		i=0;
		printf("##########################################\n");     
 
 
		printf("                        FND TEST\n");
		printf("                     press any numbers\n");
		printf("                                           'q' to exit \n");
		printf("#########################################\n");
 
                len=strlen(buf);
 
		for(n=MAXFND-len+1;n<MAXFND;n++) {
			new_buf[n]=asc_to_fnd( (buf[i]-48 ));
			i++; } 
 
 
                usleep(2000000)
                ioctl(dev, 2, new_buf);// 이부분에서 출력이 안됩니다. 혹시 몰라 2초의 딜레이 추가후 입력되도록 해보았는데 결과가 마찬가집니다.
 
 
 
 
}
ktd2004의 이미지

아래에서 값이 제대로 대입이 될까요? arg가 pointer로 넘겨주는 것 같은데. 메모리 복사를 해야하지 않나요???

char[8] a=arg;
yaeho12의 이미지

그부분 말고는 다른데 문제되는부분은 없을까요??

taeho

bushi의 이미지

'그 부분'은 가독성을 떨어뜨리는 것 외의 다른 문제는 없을 정도로 아무 가치 없는 코드라서, 의도하셨던 하지 않으셨던 간에 별 문제는 없습니다.
아마도 컴파일러에 의해 제거되리라 생각됩니다.

get_user(dest, src_ptr) 은 pagefault handler 가 준비된다는 것을 빼면 memcpy(&dest, src_ptr, sizeof(*src_ptr)) 과 결과가 같습니다.
따라서 sizeof(*(unsigned char *)) 만큼만 복사됩니다.

노파심에...
get/put_user() 와 memcpy() 가 가장 크게 다른 점은 4 바이트(32bit arch), 혹은 8바이트(64bit arch) 이상은 취급하지 않는다는 것이고,
memcpy 와는 달리 각 arch 가 가지고 있는 가장 효율적인 1byte, 2byte, 4byte, 8byte 복사 instruction 을 사용해서 C 의 기본 type 인 char, short, int, long 에 대응하기 위한 목적으로 만들어졌기 때문입니다.
여기에 pagefault handler 를 추가해서 swap-out 되버린 상황이나 fork-clone 때의 COW 상황을 대비하는 것은 copy_to/from_user() 와 마찬가지입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.