Kernel 내부의 System Call을 수정하여 DeviceDriver 호출하는

송동섭의 이미지

제가 하려고 하는 작업은 sys_gettimeofday ( gettimeofday call의 커널 내부명 ) 가 호출하는 do_gettimeofday functions 의 시간 측정을 외부 rtc에서 읽을 수 있도록 하는 작업을 하려고 합니다.

보드는 strongarm 보드이고 rtc는 gpio로 연결되어 open 과 ioctl로 access하도록 드라이버 프로그램은 작성되었습니다.

우선, 현재 잘 모르는 상태에서 시도해본 방법은 ( 무식한 방법? ㅋ 몰라서 그런거니 이해바랍니다. )

sys_gettimeofday -> do_gettimeofday를 호츨 하므로..

/linux/arch/arm/kernel/time.c 에서 sys_gettime을 찾아서 아래와 같이 수정하였습니다.

void do_gettimeofday(struct timeval *tv)
{
                int fd;
	unsigned long flags;
	unsigned long usec, sec;
	
/* 아래 부터 제거 */
/*
	read_lock_irqsave(&xtime_lock, flags);
	usec = gettimeoffset();
	{
		unsigned long lost = jiffies - wall_jiffies;

		if (lost)
			usec += lost * USECS_PER_JIFFY;
	}
	sec = xtime.tv_sec;
	usec += xtime.tv_usec;
	read_unlock_irqrestore(&xtime_lock, flags);
*/
	/* usec may have gone up a lot: be safe */
/*
	while (usec >= 1000000) {
		usec -= 1000000;
		sec++;
	}

	tv->tv_sec = sec;
	tv->tv_usec = usec;
*/
/* 대체 코드 */
	[b]fd = sys_open ( "/dev/rtc", O_RDWR, 0 );
	sys_ioctl ( fd, 0x1, tv );[/b]}

위와 같이 수정 후 커널 컴파일 다시 한 후 올려 봤더니

"unable to handle kernel null pointer ~~" 머 이렇게 나오더군요. 우선 도움 부탁 드립니다!! ( 위와 같이 접근하는게 맞는건지도 모르겠네요.
계층상 커널의 콜이 상위 드라이버 모듈로 연결된다는 생각 자체가 옳은건지...)


P.S : 제가 목적하는 작업을 위해 생각 해본 방법이
1. do_gettimeofday와 같이 최 하위 코드를 수정. ( 위와 같은 방법 )
2. system call 랩핑 ( 콜을 가로체는 듯? 같은 방법 )
두 가지를 생각 해봤는데 제 생각이 맞는 건지요? 그리고 1번의 방법으로 접근하는게 맞는건지도 알려주세요!!

송동섭의 이미지

방금 테스트가 끝났네요. 우선, Kernel의 system call 내부에서 device driver를 사용자 프로그래밍과 같은 방법으로 하는것은 잘못된 생각과 시도 인듯 보입니다.
이유는 정확히는 모르겠지만.. 추측건데, 모듈에서 디바이스 드라이버 모듈을 사용할 경우 다음과같은 현상이 발생하게 됩니다.

정상적인 호출.

gettimeofday -> sys_gettimeofday -> do_gettimeofday -> copy_to_user -> 값확인.

수정후 호출.
gettimeofday -> sys_gettimeofday -> do_gettimeofday -> device driver call -> copy_to_user ( device driver 내 ) -> copy_to_user ( gettimeofday ) -> 값확인

수정후 호출을 보면 사용자는 요구하지 않은 ( Kernel 내부에서 콜을 통해 요구 하였지 사용자가 요구하지 않은 ) 값이 copy_to_user ( device driver ) 에 의해 사용자에게 전달하려 합니다. 이럴경우 사용자 프로그램에서 요구한적은 없고 copy_to_user에 의해 값은 전달되어야 하고.. 문제가 발생할 듯 보입니다. 순전히 제 생각인데 이 부분이 문제가 되지 않았나 싶습니다.

따라서, device driver내의 function을 수정 ( driver 형식이 아닌 단순한 function call 형식 ) 으로 수정하여 time.c 에 다 때려 넣어 버렸습니다. 그러니.. 문제 없이 시간값을 받아오고 있습니다. ( 물론, 다 때려 넣지 않구 나누어서 호출하려 했으나 링크 문제가 나고... 해결할 바를 몰라 ... )

결국, kernel 내부에서 driver 를 컨트롤 하려고 할 경우는 사용자 프로그래밍 방식이 아닌, 그냥 device driver프로그램하듯 하면 된다는 것을 확인하였습니다.

** Inside Of Inside By Forman

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.