>> Delete No. 26021 article
No. [질문]커널 I/O를 대신해주는 방법??

등록 2001-04-03 11:28:00 By localhost     조회 2
이름 Sunset    

		안녕하세요.. 커널의 I/O를 대신해주기 위해 짠코드입니다..
고수분들 좀봐주세요..
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 void My_Op( struct buffer_head *bh, int rw )
	{
	unsigned long RSector=0;
	unsigned long RBlock=0;
 	struct buffer_head *Rbh;
	struct buffer_head *Wbh;
 	RSector = bh->b_rsector;
	RBlock = RSector/2;
 	if( rw == READ ){
		if( buffer_uptodate(bh) )
			make_request( MAJOR(bh->b_rdev), rw, bh );
		else{
			Rbh = getblk( 776, RBlock, 1024 );
			Rbh->b_blocknr = RBlock;
			Rbh->b_rsector = RSector;
			Rbh->b_dev = 776;
			Rbh->b_rdev = 776;
			Rbh->b_state = bh->b_state;
			clear_bit( BH_Uptodate, &Rbh->b_state );
			make_request( MAJOR(Rbh->b_rdev), rw, Rbh );
			wait_on_buffer( Rbh );
			memcpy( bh->b_data, Rbh->b_data, 1024 );
			brelse( Rbh );
			bh->b_end_io( bh, 1 );
			}
		}
 	if( rw == WRITE ){
		if( !buffer_dirty(bh) )
			make_request( MAJOR(bh->b_rdev), rw, bh );
		else{
			Wbh = getblk( 776, RBlock, 1024 );
			Wbh->b_blocknr = RBlock;
			Wbh->b_rsector = RSector;
			Wbh->b_dev = 776;
			Wbh->b_rdev = 776;
			Wbh->b_state = bh->b_state;
			set_bit( BH_Dirty, &Wbh->b_state );
			memcpy( Wbh->b_data, bh->b_data, 1024 );
			make_request( MAJOR(Wbh->b_rdev), rw, Wbh );
			wait_on_buffer( Wbh );
			brelse( Wbh );
			clear_bit( BH_Dirty, &bh->b_state );
			make_request( MAJOR(bh->b_rdev), rw, bh );
			}
		}
	}
 이함수가 호출되는곳은 ll_rw_blk.c 내의 ll_rw_block 함수내에서 입니다..
ll_rw_block 함수내에서 make_request가 호출되는 바로 앞부분에서
제가 대신해주고자하는 장치에 I/O가 날아오면 이부분으로 넘어옵니다.
위와같이 해주면 별다른 문제가 없이 동작을 합니다.
그런데 궁금한것은 많은 파일을 복사, 삭제 등등을 하고 파일시스템까지 체크
를 해봤는데 문제는 없이 동작을 하지만 이렇게 제가 대신 읽어주고 써주는게
원래 커널이 읽고/쓰는것보다 조금 느려지는것같아요..
또하나는 위와같은 방법이 별문제가 없는것인지.. 아님 운이 좋아서 동작을
하는건지... 제가봐도 좀 어거지인듯 ㅡㅡ; 해서 이렇게 여러분들의
조언을 구합니다..
부탁드립니다..
잘못된점이라든지.. 아님 다른방법이라든지 등등... 많은 조언 부탁드립니다.
즐거운 하루 되세요..
[관리자] 패스워드를 입력 하십시오. 답장이 존재하면 함께 삭제됩니다.[ 목록 | 이전 ]
패스워드:    

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved