vmalloc을 사용하여 커널 모듈에 많은 양의 메모리 할당

궁금한

을 사용하여 커널 모듈에 큰 메모리를 할당하려고합니다 vmalloc(). 64GB 램을 사용하는 64 비트 Linux (3.10.0-514.2.2.el7.x86_64)에서 2GB 이상의 메모리를 할당 할 수 없습니다.

다음은 관련 코드 부분입니다.

...

static int logical_block_size = 512;
module_param(logical_block_size, int, 0);
static int nsectors = 1024; /* How big the drive is */
module_param(nsectors, int, 0);

...

/*
 * The internal representation of our device.
*/
static struct sbd_device {
    unsigned long size;
    spinlock_t lock;
    u8 *data;
    struct gendisk *gd;
} Device;

...

static int __init sbd_init(void) {
    /*
     * Set up our internal device.
     */
   Device.size = nsectors * logical_block_size;
   spin_lock_init(&Device.lock);
   Device.data = vmalloc(Device.size);
   ...

를 통해 할당 할 수있는 메모리 크기에 제한이 vmalloc있습니까? 커널 모듈에 많은 양의 메모리를 할당하는 다른 방법이 있습니까?

Ctx

여기에서 코드를 참조하십시오. 주석의 Simple Block Driver 는 질문에 답하는 데 필수적입니다.

그 이유는 16 엑사 바이트 의 데이터 를 할당하려고하기 때문입니다 . 이 계산 sbd_init()은 이유입니다.

Device.size = nsectors * logical_block_size;

Device.size는 unsigned long모듈 매개 변수 nsectors이며 logical_block_size정수입니다.

이제 locgical_block_size를로 설정 1024하고 nsectors를로 설정 하면 2097152(총 2GB 공간) 계산이 부호있는 정수 로 수행 되므로 결과는 다음과 같습니다.

1024 * 2097152 = -2147483648

이것이 암시 적으로 unsigned long(Device.size에 대한 할당에 의해 ) 캐스트되면 결과는 (아마도) 물리적 메모리와 vmalloc 예약 영역 (linux x86_64에서 32TB)을 약간 초과하는으로 18446744071562067968전달됩니다 vmalloc().

해결책은 다음과 같이 계산을 수행하는 것입니다 unsigned long.

Device.size = (unsigned long) nsectors * logical_block_size;

그러면 예상대로 작동합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

다른 블록의 스레드가 커널 내부에서 malloc을 사용하여 할당 된 메모리에 액세스 할 수 있습니까?

분류에서Dev

커널 모듈에 의해 유출 된 메모리는 해당 모듈을 제거 할 때 시스템으로 반환됩니까?

분류에서Dev

Linux 커널 모듈을 작성할 때 module_param에서 얻은 메모리를 처리하는 방법은 무엇입니까?

분류에서Dev

AWS 커널에서 할당량 커널 모듈을 얻는 방법은 무엇입니까?

분류에서Dev

커널 프로그램에서 stdlib.h를 사용할 수 없으므로 커널 모듈에서 system ()을 사용하는 방법은 무엇입니까?

분류에서Dev

cuda, 커널 메모리 임프린트의 동적 메모리 할당?

분류에서Dev

재 할당 할 때 너무 많은 힙 메모리 사용

분류에서Dev

커널의 버퍼를 다른 모듈에서 할당 한 사용자 공간으로 매핑

분류에서Dev

하드웨어 장치 인터페이스에 여러 계층의 커널 모듈을 사용하십니까?

분류에서Dev

별도의 모듈을 사용하여 변수 할당?

분류에서Dev

Linux 커널은 커널을 수정하지 않고 4KB보다 큰 기본 가상 메모리 페이지 크기를 사용할 수 있습니까?

분류에서Dev

커널 모듈의 메모리 액세스를 허용하는 방법은 무엇입니까?

분류에서Dev

Linux 커널에서 소켓 메모리 할당을 늘리는 방법

분류에서Dev

malloc을 사용하여 c에서 동적 메모리 할당

분류에서Dev

커널 모듈을 사용하여 현재 배터리 통계를 얻는 방법은 무엇입니까?

분류에서Dev

OpenCL 커널에 할당 된 추가 32 바이트의 로컬 메모리

분류에서Dev

로드 가능한 커널 모듈을 사용하여 커널 함수 교체

분류에서Dev

new 연산자를 사용하여 힙에 얼마나 많은 메모리가 할당됩니까?

분류에서Dev

Debian을 사용하여 Linux 커널 4.18에 ncpfs 모듈 다시 추가

분류에서Dev

vmalloc ()은 어떤 프로세스의 페이지 테이블에 새 메모리를 할당합니까?

분류에서Dev

Rspec 3.5의 모듈에서 커널 절전 방법을 테스트하는 방법은 무엇입니까?

분류에서Dev

Linux의 현재 커널에서 컴파일되지 않은 커널 모듈을 어떻게 추가합니까?

분류에서Dev

할당 된 것보다 더 많은 메모리를 사용하는 Java

분류에서Dev

변수가 정의되었지만 커널 모듈에서 사용되지 않은 메시지

분류에서Dev

brk () 시스템 호출을 사용하여 메모리를 할당하는 C ++ 사용자 정의 메모리 관리?

분류에서Dev

전체 그리드에 할당 된 공유 메모리 양이 48kB를 초과하면 커널 시작 실패

분류에서Dev

커널 모듈에 별칭을 추가하는 방법은 무엇입니까?

분류에서Dev

커널 모듈에 별칭을 추가하는 방법은 무엇입니까?

분류에서Dev

Linux 커널을 사용하면 프로세스가 100 % 메모리를 사용할 수 있습니까?

Related 관련 기사

  1. 1

    다른 블록의 스레드가 커널 내부에서 malloc을 사용하여 할당 된 메모리에 액세스 할 수 있습니까?

  2. 2

    커널 모듈에 의해 유출 된 메모리는 해당 모듈을 제거 할 때 시스템으로 반환됩니까?

  3. 3

    Linux 커널 모듈을 작성할 때 module_param에서 얻은 메모리를 처리하는 방법은 무엇입니까?

  4. 4

    AWS 커널에서 할당량 커널 모듈을 얻는 방법은 무엇입니까?

  5. 5

    커널 프로그램에서 stdlib.h를 사용할 수 없으므로 커널 모듈에서 system ()을 사용하는 방법은 무엇입니까?

  6. 6

    cuda, 커널 메모리 임프린트의 동적 메모리 할당?

  7. 7

    재 할당 할 때 너무 많은 힙 메모리 사용

  8. 8

    커널의 버퍼를 다른 모듈에서 할당 한 사용자 공간으로 매핑

  9. 9

    하드웨어 장치 인터페이스에 여러 계층의 커널 모듈을 사용하십니까?

  10. 10

    별도의 모듈을 사용하여 변수 할당?

  11. 11

    Linux 커널은 커널을 수정하지 않고 4KB보다 큰 기본 가상 메모리 페이지 크기를 사용할 수 있습니까?

  12. 12

    커널 모듈의 메모리 액세스를 허용하는 방법은 무엇입니까?

  13. 13

    Linux 커널에서 소켓 메모리 할당을 늘리는 방법

  14. 14

    malloc을 사용하여 c에서 동적 메모리 할당

  15. 15

    커널 모듈을 사용하여 현재 배터리 통계를 얻는 방법은 무엇입니까?

  16. 16

    OpenCL 커널에 할당 된 추가 32 바이트의 로컬 메모리

  17. 17

    로드 가능한 커널 모듈을 사용하여 커널 함수 교체

  18. 18

    new 연산자를 사용하여 힙에 얼마나 많은 메모리가 할당됩니까?

  19. 19

    Debian을 사용하여 Linux 커널 4.18에 ncpfs 모듈 다시 추가

  20. 20

    vmalloc ()은 어떤 프로세스의 페이지 테이블에 새 메모리를 할당합니까?

  21. 21

    Rspec 3.5의 모듈에서 커널 절전 방법을 테스트하는 방법은 무엇입니까?

  22. 22

    Linux의 현재 커널에서 컴파일되지 않은 커널 모듈을 어떻게 추가합니까?

  23. 23

    할당 된 것보다 더 많은 메모리를 사용하는 Java

  24. 24

    변수가 정의되었지만 커널 모듈에서 사용되지 않은 메시지

  25. 25

    brk () 시스템 호출을 사용하여 메모리를 할당하는 C ++ 사용자 정의 메모리 관리?

  26. 26

    전체 그리드에 할당 된 공유 메모리 양이 48kB를 초과하면 커널 시작 실패

  27. 27

    커널 모듈에 별칭을 추가하는 방법은 무엇입니까?

  28. 28

    커널 모듈에 별칭을 추가하는 방법은 무엇입니까?

  29. 29

    Linux 커널을 사용하면 프로세스가 100 % 메모리를 사용할 수 있습니까?

뜨겁다태그

보관