IDE 서브시스템의 초기화 HDD / FileSystem

발취: http://badcodek.springnote.com/pages/3470413

IDE 서브시스템의 초기화
 

IDE 디스크는 IBM PC의 역사의 많은 부분을 함께 해왔다. 이 시간을 통해 이들 장치로의 인터페이스도 변해 왔으며, 이는 IDE 서브시스템의 초기화를 처음 생각했던 것보다 더 복잡하게 만든다. 리눅스가 지원할 수 있는 최대 IDE 컨트롤러의 갯수는 4개이다. 각 컨트롤러는 ide_hwifs 벡터에 있는 ide_hwif_t 자료구조로 표현한다.각 ide_hwif_t 자료구조는 두개의 ide_drive_t 자료 구조를 가지고 있으며, 이 중 하나는 주 IDE 드라이브, 다른 하나 는 종속 IDE 드라이브를 위한 것이다. .IDE 인터페이스, 즉 컨트롤러가 발견되면, 컨트롤러와 이에 연결된 디스크를 반영하여 ide_hwif_t가 설정된다. IDE 드라이버가 I/O 메모리 공간에 있는 IDE 명령 레지스터에 명령을 씀으로써 동작이 이루어진다. 1차IDE 컨트롤러의 명령 레지스터와 제어 레지스터의 기본 I/O 주소는 0x1F0 - 0x1F7이다. 이들 주소는 IBM PC 초창기에서부터 관행으로 설정된 것이다.

IDE 드라이버는 각 컨트롤러를 리눅스 블럭 버퍼 캐시와 VFS에 등록하는데, 이는 blk_dev와 blkdevs 벡터에 추가하는 것이다. IDE 드라이버는 또한 해당하는 인터럽트에 대한 제어권을 요청한다. 이들 인터럽트 역시 관행처럼 1차 IDE 컨트롤러에 14, 2차 IDE 컨트롤러는 15로 설정된다. 그렇지만, 이들 설정은 IDE의 다른 상세한 설정과 마찬가지로 커널에 명령행(command line) 옵션을 주어서 덮어 쓸 수 있다. IDE 드라이버는 또한 부팅시 발견된 IDE 컨트롤러마다 gendisk를 만들어 gendisk의 리스트에 추가한다 이 리스트는 나중에 부팅시 발견된 모든 하드 디스트의 파티션 테이블을 찾는데 사용한다. 파티션을 검사하는 코드는 IDE 컨트롤러가 두개의 IDE 디스트를 제어할 수도 있다는 것을 알고 있다.


ide_hwif_t와 ide_drive_t 자료구조에 합리적인 값을 넣는다.(단 한번만의 실행이 유효하다.(MAGIC_COOKIE))

#define MAGIC_COOKIE 0x12345678
static void __init init_ide_data (void)
{
ide_hwif_t *hwif;
unsigned int index;
static unsigned long magic_cookie = MAGIC_COOKIE;

if (magic_cookie != MAGIC_COOKIE) // 이 함수가 한번만 실행하도록 처리해준다.
return; /* already initialized */
magic_cookie = 0;

/* Initialise all interface structures */
for (index = 0; index < MAX_HWIFS; ++index) {
hwif = &ide_hwifs[index]; // ide_hwfs_t 벡터에서 값을 긁어 온다.
init_hwif_data(hwif, index); // ide_hwfs_t와 ide_drive_t에 초기값을 넣어준다

// in/output 함수포인터 default_hwif_iops(hwif);

// ata in/output 함수 포인터 default_hwif_transpor(hwif);

init_hwif_default(hwif, index);

#if !defined(CONFIG_PPC32) || !defined(CONFIG_PCI)

hwif->irq = hwif->hw.irq = ide_init_default_irq(hwif->io_ports[IDE_DATA_OFFSET]);#endif

}

#ifdef CONFIG_IDE_ARM
initializing = 1;
ide_arm_init();
initializing = 0;
#endif
#ifdef CONFIG_BLK_DEV_IDE_STR8100 // starsemi SOC의 IDE 컨트롤러 초기화를 위한 driver code
initializing = 1;
str8100_ide_init();
initializing = 0;
#endif
}

 


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://danieljun.egloos.com/tb/1489675 [도움말]

덧글

댓글 입력 영역