Block Device Open
original source: Understanding Linux Kernel 3rd Edition
블록 장치 파일 열기
커널은 fs가 disk 또는 partition에 마운트 될때, 스왑 파티션이 활성화 될때, 유저 프로세스가 블록 장치에 open 시스템 콜을 호출할 때, block device file을 연다. 모든 경우 커널은 같은 작업을 수행하는데, (i)블록 장치 디스크립터를 찾고, (ii)파일 연산 메소드를 설정한다. 장치 파일이 열릴때, dentry_open() 함수가 파일 객체의 메소드를 전용함수로 설정하는데, 파일 객체의 f_op 필드는 def_blk_fops table의 주소로 설정한다. 기본적으로 디스크립터를 찾아 없으면 생성하고, open을 포함하여 이후에 사용될 method에 블록장치 함수에 매핑하는 것을 완료하면 concept 적인 open 과정이 끝난다. 고려해야 할 항목은 inode, filp, bdev, gendisk 등이다.
Method |
Function |
open |
blkdev_open |
release |
blkdev_close |
llseek |
block_llseek |
read |
generic_file_read |
write |
blkdev_file_write |
mmap |
generic_file_mmap |
fsync |
block_fsync |
ioctl |
block_ioctl |
aio_read |
generic_fio_aio_read |
1. blkdev_open() 함수는 매개 변수로 inode 와 filp (파일객체)를 전달 받아 다음 과정을 수행한다.
1. 아이노드 객체의 inode->i_bdev 필드를 검사 (NULL=nothing, else 해당 블록 디스크럽터의 주소), return desc.
2. if NULL, bdget(inode->i_rdev) 함수를 통해, desc. 를 찾는다. 없으면 새로 할당한다.
3. 추후 open에 desc가 사용될 수 있으므로, inode->i_bdev에 저장.
4. inode->i_mapping 필드를 bdev 아이노드에서 해당 필드 값으로 설정
5. inode를 열린 아이노드 리스트에 추가
2. filp->i_mapping 필드를 inode->i_mapping 값으로 설정
3. gendisk dscriptor 주소를 얻음.
4. bdev->bd_openers (0: 블록장치가 안열림, else: 이미 열렸음)
5. bdev->bd_disk를 gendisk 디스크립터의 주소 disk로 초기화함.
6. 블록 장치가 전체 디스크이면 (part 0) 다음 과정을 수행
1. 정의된 disk->fops->open 수행
2. disk->queue 로부터 관련 필드를 셋팅
7. return 0 (기타 몇몇 과정은 생략)
'Linux Kernel' 카테고리의 다른 글
PCI configuration space (1) | 2016.09.03 |
---|---|
volatile keyword (0) | 2016.08.30 |
glibc Malloc (0) | 2016.08.27 |
LD_PRELOAD example (0) | 2016.08.27 |
MMIO in PCIe (0) | 2016.08.24 |