QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 580|回复: 0

学习过《LINUX设备驱动程序》一书的请进,请教一个问题

[复制链接]
发表于 2004-4-28 17:46:05 | 显示全部楼层 |阅读模式
在《LINUX设备驱动程序》第十二章 块设备驱动程序中,讲到可分区设备 分区检测一节时,有以下一段代码(描述spull设备模块初始化时为分区检测所进行的适当设置)

    spull_sizes = kmalloc( (spull_devs << SPULL_SHIFT) * sizeof(int),
                          GFP_KERNEL);
    if (!spull_sizes)
        goto fail_malloc;

    /* Start with zero-sized partitions, and correctly sized units */
    memset(spull_sizes, 0, (spull_devs << SPULL_SHIFT) * sizeof(int));
    for (i=0; i< spull_devs; i++)
        spull_sizes[i<<SPULL_SHIFT] = spull_size;
    blk_size[MAJOR_NR] = spull_gendisk.sizes = spull_sizes;

    /* Allocate the partitions array. */
    spull_partitions = kmalloc( (spull_devs << SPULL_SHIFT) *
                               sizeof(struct hd_struct), GFP_KERNEL);
    if (!spull_partitions)
        goto fail_malloc;

    memset(spull_partitions, 0, (spull_devs << SPULL_SHIFT) *
           sizeof(struct hd_struct));
    /* fill in whole-disk entries */
    for (i=0; i < spull_devs; i++)
        spull_partitions[i << SPULL_SHIFT].nr_sects =
                spull_size*(blksize/SPULL_HARDSECT);
    spull_gendisk.part = spull_partitions;
    spull_gendisk.nr_real = spull_devs;
#ifndef LINUX_24
    spull_gendisk.max_nr = spull_devs;
#endif

关于这段设置spull_sizes和spull_partitions数组的代码,我有1个疑问:在这段代码内有两个for循环,分别对spull_sizes和spull_partitions数组赋值,比如说对于spull_sizes,由代码“kmalloc( (spull_devs << SPULL_SHIFT) * sizeof(int),GFP_KERNEL);”可知,spull_sizes是一个整型数组,元素为32个。(spull_devs = 2; SPULL_SHIFT = 4)。可是在FOR循环内赋值时,循环次数为2(因为spull_devs=2,即有两个spull类型的设备),对spull_sizes数组赋值时却是用"spull_sizes[i<<SPULL_SHIFT] = spull_size;". 这样的话,岂不是只对spull_sizes[0]和spull_sizes[16]赋了值,那其他的元素呢?对spull_partitions数组的初始化也有这个疑问,不解呀~请教各位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 11:22 , Processed in 0.041972 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表