Linux 고정 커밋 d6d3455d8751 · 일반 SD 메모리 카드 경로

Linux MMC: 호스트·카드·디스크는 서로 다른 장치입니다

카드 감지 신호가 왔다고 해서 블록 디스크가 준비된 것은 아님을 짚고, 실패한 단계를 소스와 연결합니다.

호스트 등록만으로 디스크가 생기지는 않습니다

SD 카드를 꽂았는데 /dev/mmcblk*가 보이지 않는다면 서로 다른 세 객체를 구분해야 합니다. mmc_host는 컨트롤러와 요청 처리 경로, mmc_card는 식별한 카드, gendisk는 블록 장치로 노출할 디스크를 나타냅니다. 이 글은 Torvalds 트리의 커밋 d6d3455d8751854e0d1820f14184682e23ac4475을 기준으로 하며, 모든 커널 버전이나 카드 종류의 호출 순서를 일반화하지 않습니다.

세 객체와 그 사이의 조건
  1. 호스트 · mmc_host

    컨트롤러 드라이버가 요청을 처리할 준비를 하고 호스트를 등록합니다.

    ↓ 감지 작업에서 프로토콜을 식별하고 초기화

  2. 카드 · mmc_card

    SD 초기화에 성공하면 카드 장치를 드라이버 모델에 등록합니다.

    ↓ 블록 읽기 지원·드라이버 연결·할당 성공 필요

  3. 디스크 · gendisk

    블록 드라이버의 probe가 디스크를 준비하고 등록합니다.

화살표는 책임과 호출의 관계입니다. 각 상자의 함수가 완전히 반환한 뒤 다음 상자가 시작한다는 시간표가 아닙니다.

호스트 시작과 카드 감지는 다른 작업입니다

mmc_add_host()는 기능 조합을 검사하고 device_add(&host->class_dev) 뒤 mmc_start_host()를 호출합니다. 호스트는 이 함수가 끝나기 전에 요청을 처리할 준비가 되어 있어야 합니다. 시작 함수가 호출하는 _mmc_detect_change()는 host->detect 지연 작업을 예약하므로, 반환값 0을 카드 인식 완료로 읽으면 안 됩니다. 호스트 등록 · 감지 작업 예약 · 호스트 시작

mmc_rescan()은 재검색 비활성화 여부, 비탈착형 카드의 기존 검색 여부, 등록된 카드의 상태부터 봅니다. 기존 버스가 유지되면 새 카드 초기화를 반복하지 않습니다. 탈착형 호스트에서 get_cd()가 카드 없음을 알리면 전원을 끄고 탐색 경로를 나갑니다. 폴링 설정이면 끝에서 감지 작업을 다시 예약합니다.

이 버전은 먼저 UHS-II 연결을 시도하며, 다른 탐색 경로에서는 호스트 기능에 따라 SDIO → SD → MMC를 시도합니다. SD Express는 별도 분기가 있습니다. 따라서 카드 감지 IRQ 하나를 모든 종류의 카드가 같은 순서로 초기화됐다는 증거로 사용할 수 없습니다. 재검색 조건 · 프로토콜 탐색

카드 등록과 드라이버 probe를 구분합니다

일반 SD 경로의 mmc_attach_sd()는 카드 응답과 전압을 확인하고 mmc_sd_init_card()를 거쳐 mmc_add_card()를 호출합니다. 초기화 오류는 버스 분리로, 카드 등록 오류는 카드 제거 후 버스 분리로 이어집니다. SD 연결의 성공·실패 경로

mmc_add_card() 안의 device_add(&card->dev)가 카드 장치를 등록합니다. 드라이버 모델의 device_add()에는 bus_probe_device() 호출도 있으므로, 카드 등록 함수가 반환하기 전에 드라이버 연결 시도가 일어날 수 있습니다. 등록과 바인딩은 구분할 책임이지, 무조건 시간상 떨어진 두 구간은 아닙니다. MMC 버스의 probe는 연결된 드라이버의 probe(card)로 전달합니다. 카드 장치 등록 · 등록 중 probe 허용과 호출 · MMC 버스 probe

블록 디스크 등록은 probe 안의 별도 실패 지점입니다

mmcblk 드라이버의 mmc_blk_probe()는 우선 카드가 CCC_BLOCK_READ를 지원하는지 검사합니다. 필요한 작업 큐를 만들고 mmc_blk_alloc()로 디스크 할당을 진행합니다. 하위 mmc_blk_alloc_req()는 요청 큐, 이름, 용량 등을 준비한 뒤 add_disk_fwnode()를 호출하며, 실패하면 할당 자원을 정리합니다. 블록 probe · 주 디스크 할당 호출 · 디스크 등록과 정리

확인한 상태아직 보장하지 않는 것
호스트 등록 성공카드 존재·응답·초기화 성공
카드 장치 등록mmcblk 연결, 디스크 할당·등록 성공
디스크 등록호출자의 /dev에서 노드가 보이는지, 접근 권한이나 파일시스템 마운트 성공

장치 노드는 반드시 사용자 공간이 만든다고 단정하는 것도 부정확합니다. 장치 번호가 있는 장치의 등록 경로에는 devtmpfs_create_node() 호출이 있고, devtmpfs 구현은 동작 중인 처리 스레드가 없으면 노드 생성 없이 반환합니다. 커널 장치 등록, 노드 생성, 실제 환경에서 경로를 볼 수 있는지를 각각 확인해야 합니다. 장치 노드 생성 호출 · devtmpfs의 조건

같은 경로로 묶지 않는 카드와 관찰

순수 SDIO 카드는 mmc_block의 대상이 아닙니다. SD-combo, UHS-II, SD Express, 내장 eMMC와 비탈착형 호스트에는 별도 조건이 있습니다. 이 글의 도표는 일반 SD 메모리 카드의 객체 경계를 설명하며 모든 종류에 그대로 적용되지는 않습니다. SDIO와 블록 드라이버의 구분

오류를 좁힐 때는 카드 감지, 전원·전압 협상, 초기화, 카드 등록, 드라이버 probe, 디스크 등록 중 마지막으로 성공한 지점을 구분합니다. 소스를 읽었다고 해서 실제 보드의 신호·전압·시간을 측정한 것은 아닙니다. 기존 U-Boot MMC 글은 별도 구현이며, 구형 블로그 그림을 이 커널 버전의 증거로 재사용하지 않았습니다.