달력

1

« 2025/1 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'OS이야기'에 해당되는 글 86

  1. 2011.12.31 문자 디바이스 호출과정
2011. 12. 31. 18:22

문자 디바이스 호출과정 OS이야기2011. 12. 31. 18:22

/dev/xxx_device 호출과정

가상 파일시스템 관점에서 바라본 것.

1. 사용자 프로그램에서 open()은 시스템 호출 sys_open()을 호출
2. sys_open()은 실제로 do_sys_open()을 호출하며, open()과 관련된 실제 처리를 담당
3. open()에 전달된 파일위치가 /dev/virtual_device이므로 VFS는 각 파일시스템의 루트 inode에 접근
4. 루트 inode의 데이터 블록에서 디렉토리 정보, 즉 덴트리를 읽음
5. 덴트리에서 dev를 검색하고, dev의 inode번호를 찾음
6. dev의 inode에도 데이터블럭을 읽는다. 이 데이터블록에서 dentry를 읽음
7. 덴트리에서 virtual_device를 찾는다.
8. virtual_device가 있으며, virtual_device를 가리키는 inode번호를 찾는다.
9. inode를 이용해 해당 파일의 내용을 가리키는 블록을 가져온다.
10. open()을 호출한 프로세스에 struct file을 구성
11 호출한 프로세스에서 사용중인 파일을 관리하는 테이블인 fd_array에 새로 구성한 struct file을 등록한다.
12 struct file->f_op에 등록된 open()함수를 호출한다.
13 virtual_device_open()이 호출되고 파일이 열린다.
 
커널에서 open()함수 바라본 관점
1. userProgram -> open()
2. sys_call_table sys_open()
3. do_sys_open()
4. getname() 파일 경로명 얻어옴
5. filp_open()에 경로, 접근모드, 권한을 전달
- get_empty_flip()에서 새로운 파일 객체를 생성(struct file)
- flags와 modes에 따라 struct file 멤버 f_flags, f_mode필드를 설정
-open_namei() 함수를 호출 : inode의 데이터 블록을 읽음
  - lookup_dentry()를 호출해서 파일 경로명에 대한 dentry를 구함
  - open_namei()에 전달된 flag인자에 따라 권한 여부를 검사
-쓰기 접근인 경우에는 i_writecount필드 갑승ㄹ 검사. 이 값이 양수이면 현재 쓰기를 수행중인 프로세스의 수를 의미하며, 음수인 경우에는 매핑 메모리를 의미한다.
- struct file을 초기화
- default로 file->f_op = i_op->default_file_ops;
- 파일연산에 open연산이 정의되어 있으면 해당 함수 호출
- 현재 프로세스를 의미하는 current전역변수를 이용해서 등록 current->files->fd[파일핸들번호]
- 파일핸들번호 반환. 이 값이 open()함수를 호출했을 때의 최종 반환값

 

'OS이야기' 카테고리의 다른 글

프로세스의 .text, .data, .lib 구하기  (0) 2012.01.02
proc  (0) 2011.12.31
EXPORT_SYMBOL  (1) 2011.12.24
_syscall#  (0) 2011.12.24
메모리 회수처리  (0) 2011.12.23
:
Posted by НooпeУ


Code Start Code End