구)홈페이지 오탈자 보기
리눅스 커널의 이해

 

페이지오탈자 내용등록일
439

(p 439 up()함수 코드 중간 부분)

if (atomic_read(&sem->count) <= 0)  

==>
이 줄을 삭제한다. 삭제하지 않을 경우 waking 필드 값을 증가하기 위해 스핀락을 걸기전에 다른 프로세스에서 up()함수를 호출하여 증가한 count값이 0보다 크면 함수를 빠져 나갈것이고,  다시 이쪽 프로세스로 돌아왔을때는 count값이 증가된 상태이므로 위의 if문을 만족하지 않게되어 waking값의 증가가 일어나지 않는다. 결국, 세마포어 락을 기다리며 잠들었던 프로세스는 영영 깨어나지 못하게되는 문제가 발생하게 됩니다. 따라서 이 부분은 버그로써 커널버전 2.2.11 이후의 버전에서는 버그 픽스로 해결되었다. 자세한 내용은 다음 URL을 참고하자.
http://www.uwsg.iu.edu/hypermail/linux/kernel/9907.2/0052.html (구글의 힘은 대단해 -_-;)

따라서 440쪽 둘째 문단 내용이 완전히 틀린 말이 됩니다. 즉, "이는 up() 함수가 waking 값을 ~~~~ 때문이다."는 문장 전체는 거짓말이죠. 저자(혹은 역자)가 잘못 코드를 이해했을 가능성이 높아 보입니다.

실제로 커널 버전 2.2.23의 /include/asm-i386/semaphore-helper.h에 들어 있는 wake_one_more함수(up()함수가 호출함)를 살펴보시면 위의 if문 없이 바로 waking 값이 증가되는 것을 보실 수가 있을겁니다.

ps) 흐미흐미~~~ 내가 이것땜에 이해가 안되서 찾아본다고 며칠을 고생했는디! 아까운 내 시간 물어내셔~~     

2006-10-251
443

((p443) 둘째줄)

가정에서
==>
과정에서

2006-10-251
457

(p 457 맨 아래 두줄)

     return;
get_irqlock(cpu);

==>
     get_irqlock(cpu);
return;

이렇게 사용해야 말이 된다. 실제로 리눅스 2.2.23 소스코드 
/arch/i386/kernel/irq.c에서 __global_cli()함수를
찾아보시면 이와 같은 순서로 나와 있다.

2006-10-251
475

(p 475 밑에서 6째줄)

"super_blocks 변수 내에 있는 s_list 필드의 next, prev 필드에 각각 저장한다."

==>
"super_blocks 변수 내에 있는 next, prev 필드에 각각 저장한다."

로 고쳐야 됩니다. 왜냐면 super_blocks 변수 자체가 struct list_head형으로 선언되었으므로 수퍼블록 객체 항목의 하나인 s_list와는 아무런 관련이 없죠.     

2006-10-251
489

(p 489 표)

structdentry_operations*

==>
struct dentry_operations*     

2006-10-251
491

((p491) 첫째줄)

객체를
==>
객체는     

2006-10-251
493

((p493) 표 다음 둘째줄)

files_struct 구조체인 fd_array 필드를 가리킨다.
==>
files_struct 구조체의 fd_array 필드를 가리킨다.

2006-10-251
493

((p493) [표 12-6] 마지막 줄)

truct file * 
      
==>
struct file *

     

2006-10-251
494

((p494) 밑에서 둘째 줄)

i_writeaccess 필드
==>
i_writecount 필드 

2006-10-251
498

((p498) [표 12-8] 제목)

[표 12-8] ufsmount 자료 구조 필드
==>
[표 12-8] vfsmount 자료 구조 필드     

2006-10-251
500

((p500) 밑에서 둘째줄)

d_convers
==>
d_covers

2006-10-251
503

((p503) 위에서 셋째 줄)

sb->s_root_d_covers
==>
sb->s_root->d_covers

2006-10-251
503

(p503 6째 줄)

마운트 포인트의 아이노드에서 

==>
마운트 포인트의 디엔트리에서     

2006-10-251
586

(p 586 11 째 줄)

"블록 번호가 있고, 대응하는 버퍼헤드의 주소가 있으면 커널은 신속하게 해당 버퍼"

==>
블록 번호가 있으면 커널은 신속하게 해당 버퍼"


설명) 장치 식별자와 블록 번호를 이용해 해시 테이블로부터 대응하는 버퍼헤드의 주소를 얻고자 하는 것임.     

2006-10-251
595

(p 595 밑에서 5째 줄)

"bdflush_wait 태스크 큐 안에 보류시킨"
==>
"bdflush_wait 대기 큐 안에 보류시킨"


설명) 다음장에도 나오듯이 대기큐라야 말이되죠.     

2006-10-251
617

(p 617 아래서 다섯째 줄)

"앞에서 계산한 페이지 오프셋인 pos에서 시작하여"


==>
"앞에서 계산한 페이지 오프셋에서 시작하여"


참고)
파일 오프셋은 지역변수 pos이고, 페이지 오프셋은 지역변수 offset이죠. (update_vm_cache함수 코드 참조) 따라서 위의 문장을 "앞에서 계산한 페이지 오프셋인 offset에서 시작하여"로 고쳐야 하지만 굳이 페이지 오프셋 변수 offset을 밝힐 필요가 없어 위와 같이 고치는 것이 바람직하다고 봅니다.     

2006-10-251
637

(p 637 밑에서 9째줄)

p 637 밑에서 9째줄을 보면 "... 미리 정의한 기준치보다 작아질 때마다 1초 간격으로..
==>
p 637 밑에서 9째줄을 보면 "... 미리 정의한 기준치보다 작아질 때마다 10초 간격으로.."

2006-10-251
645

(p 645 3번)

"swap_files 매개변수에..."
==>
"swap_flags 매개변수에..."

2006-10-251
646

((p646) 맨 아래줄)

swap_lockmap() 필드에 저장한다.
==>
swap_lockmap 필드에 저장한다.   

2006-10-251
647

(p 647 2번에서 4째줄)

..., SWP_WRITEOK 필드의 최상위 비트가 1로 켜져 있으며, SWP_USED 플래그가 1로 켜져 있다면,
==>
..., SWP_WRITEOK 필드의 최상위 비트가 0이고, SWP_USED 플래그가 설정되어 있다면

2006-10-251
651

((p 651) 밑에서 7번째 줄)

"함수는 스왑 아웃된 페이지 식별자를 나타내는 entry 매개변수 하나를 자원하며"
==>
"함수는 스왑 아웃된 페이지 식별자를 나타내는 entry 매개변수 하나를 가지며,"

2006-10-251
660

((p 660) 6번 4째줄)

"입출력 연산을 종료하면 페이지 디스크립터의 사용 사운터를.."

==>
"입출력 연산을 종료하면 페이지 디스크립터의 사용 카운터를.."으로 변경     

2006-10-251
667

(p 667 4번)

PG_DMA 플래그가 0이면, gfp_mask 매개변수가 비워진 페이지 프레임을 ISA DMA 버퍼를 위해 써야 한다고 지정하며, 0을 반환한다.

==>
PG_DMA 플래그가 0이며, gfp_mask 매개변수가 비워진 페이지 프레임을 ISA DMA 버퍼를 위해 써야 한다고 지정하면, 0을 반환한다.

2006-10-251
674

(p 674 아래에서 5째 줄)

그렇지 않으면, 페이지를 공유하지 않거나

==>
그렇지 않으면 페이지를 공유하지 않고,

설명) 위의 7번이 아닌 경우임

2006-10-251
677

(p 677 9째 줄)

a. 페이지에 락이 걸려 있으면,

==>
a. 페이지에 락이 걸려 있거나,

2006-10-251
790

((p 790) 세번째 문단 첫째줄(16줄))

BIOS는 컴퓨터 지원을 올렸을 때 유일하게 의존할 수
==>
BIOS는 컴퓨터 전원을 올렸을 때 유일하게 의존할 수  

2006-10-251
821

((p821) 찾아보기 중)

__free_page() 654
==>
__free_page() 603, 653     

2006-10-251
823

((p823) 찾아보기 중)

buffer_mem  591
==>
buffer_mem  590     

2006-10-251
830

(p 830)

getblk() 543, 588, 591

==>
getblk() 553, 588, 591     

2006-10-251
830

((p830) 찾아보기 중)

getblk() 543, 588, 591
==>
getblk() 553, 588, 591     

2006-10-251
834

(p 834 맨 아래줄)

mark_buffer_dirty()     575, 586

==>
mark_buffer_dirty()     574, 586     

2006-10-251
836

((p836) 2열 18째줄)

open_namei() 511, 782
==>
open_namei() 512, 782
     

2006-10-251