>> Edit article
이름
제목
패스워드
안녕하세요.. 커널의 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