0

Linux デバイス ドライバーの本 ( http://lwn.net/Kernel/LDD3/ )の例を調べていますが、このコンテキストでの関数memsetの使用と有用性を理解していません。説明して。kmallocを使用してデバイス構造にメモリを割り当て、memset を使用してメモリ アドレスの前に 0 を配置することを理解していますか? それにもかかわらず、ここに例があります:

int scull_p_init(dev_t firstdev)
{
int i, result;

result = register_chrdev_region(firstdev, scull_p_nr_devs, "scullp");
if (result < 0) {
    printk(KERN_NOTICE "Unable to get scullp region, error %d\n", result);
    return 0;
}
scull_p_devno = firstdev;
scull_p_devices = kmalloc(scull_p_nr_devs * sizeof(struct scull_pipe), GFP_KERNEL);
if (scull_p_devices == NULL) {
    unregister_chrdev_region(firstdev, scull_p_nr_devs);
    return 0;
}
memset(scull_p_devices, 0, scull_p_nr_devs * sizeof(struct scull_pipe));
for (i = 0; i < scull_p_nr_devs; i++) {
    init_waitqueue_head(&(scull_p_devices[i].inq));
    init_waitqueue_head(&(scull_p_devices[i].outq));
    init_MUTEX(&scull_p_devices[i].sem);
    scull_p_setup_cdev(scull_p_devices + i, i);
}
4

1 に答える 1

1

memset は の前に 0 を入れていませんscull_p_devices。アドレスからscull_p_devices割り当てられた領域のサイズまで、メモリをゼロで上書きしています。

于 2013-04-19T16:26:37.617 に答える