2016-06-18 8 views
2

저는 커널 드라이버 프로그래밍에 익숙하지 않으며 몇 가지 측면을 이해하고 싶습니다. 아래의 코드에서 devm_kzalloc 매개 변수 및 사용법을 설명하십시오.

  1. static int ocores_i2c_probe(struct platform_device *pdev) 
    { 
        struct ocores_i2c *i2c; 
        i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); 
    } 
    
    http://lxr.free-electrons.com/source/drivers/i2c/busses/i2c-ocores.c?v=3.19에서 PDEV는 플랫폼 디바이스에 대한 포인터이다. pdev가 가리키는 구조의 내용은 플랫폼 장치가 초기화되고 드라이버 코어가이 정보를이 프로브 기능에 전달할 때 이미 생성됩니다. ?? 이것은 드라이버 코어가 드라이버 사용을 위해 프로브 중에 식별 한 pci_dev를 전달하는 pci dev 구조와 동일합니다. 내 이해가 맞습니까?
  2. devm_kzalloc의 매개 변수에 대해 명확하지 않습니다. "장치가 메모리를 할당 할 대상"은 라인 763 http://lxr.free-electrons.com/source/drivers/base/devres.c?v=3.19#L774에서 무엇을 의미합니까? 결국 우리는 struct ocores_i2c 구조체의 커널에 메모리를 할당 할 필요가있다. 첫 번째 매개 변수는 나중에 자동으로 해제하는 추적 메커니즘으로 사용됩니까 (devres 커널 설명서 읽기 기준)?
  3. devm_kzalloc의 반환 값은 커널에서 ocores_i2c 크기의 새로 할당 된 메모리에 대한 포인터입니다. 이 경우 devm_kzalloc의 두 번째 매개 변수는 sizeof (* i2c) 대신 sizeof (struct ocores_i2c)가되어야합니까?

답변

2

1) 그렇습니다. 커널은이 구조를 작성한 다음 probe 함수에 전달하여 초기화를 수행합니다.

2) 간단히 말해서, devm_ 함수 모음은 반환 된 리소스의 수명주기를 실제 장치의 수명주기와 연결합니다. 따라서 반환 된 리소스는 지정된 장치가 검사되지 않을 때 자동으로 정리됩니다.

3) 아마도 sizeof 연산자가 i2c의 정의를 따를 것이기 때문에 가능합니다. 따라서 실제로는 기본적으로 sizeof(struct ocores_i2c)과 같습니다.

+0

답을 넓히는 것이 좋습니다. 1. 화제 시동기는 * 장치 창조 *와 * 운전사 부착 *이 언제 생겼는지 그리고 그 차이점을 이해해야합니다. 2. 실제'struct device * dev' 포인터는 리소스의 * storage *에 대한 포인터로 사용됩니다. devres API의 코드를 살펴 보는 것이 좋습니다. 3. 아마도 구조체를 변경하는 경우에보다 융통성이 있고 (더 적은 문자를 입력 할 수 있기 때문에) 아마도 그렇지 않을 것입니다. 그럼에도 불구하고 두 가지 방법 모두 단점이 있습니다. – 0andriy

+0

1 & 2 : 고마워. 3. 나는 다른 운전자의 수를보고 sizeof (* i2c)와 sizeof (struct ocores_i2c)가 같거나 비슷하다고 결론을 냈습니다. sizeof (* i2c)가 선호되는 이유를 이해하는 것이 도움이됩니다. Andy, 구조체를 변경한다고하면 완전히 다른 구조체로 변경하거나 구조체에 멤버를 추가하는 것입니까? 나중에 그것도 sizeof (struct i2c)를 사용할 수 있다면? – dee

+0

필자는 드라이버를 실행하고 결과를 인쇄했습니다. 'sizeof (* i2c) = 976 sizeof (i2c) = 8'. 다행히도'sizeof (* i2c)'가 포인터 뒤에오고'struct ocores_i2c'의 크기를 출력하기 때문에 다른 사람들이 – dee