簡體   English   中英

我可以從內核模塊調用mknod嗎?

[英]Can I call mknod from my kernel module?

如標題所示,我正在編寫一個內核模塊,並且希望該模塊創建的字符設備自動顯示。 如何在我的module_initmodule_exit使用mknodrm創建和刪除設備?

編輯:不確定是否允許,但是作為問題的擴展,我在哪里可以找到更多類似的信息? 我的大部分Google搜索操作都導致非常老舊的信息(內核2.6及更早版本)非常混亂,學習如何編寫內核模塊的最佳位置是什么?

不,您不能從內核空間使用mknod和rm cli。 這些是bash命令。 但是存在其他選擇,可以從內核空間創建和刪除模塊的設備節點文件。 在模塊初始化函數中,可以在為設備注冊后使用class_create()然后使用device_create()函數。 調用cdev_init()之后,可以使用這兩個函數來創建節點文件。 同樣,您可以在module_exit函數中使用device_destroy()和class_destroy()函數來刪除節點文件。

這是在char設備初始化函數中創建/ dev / kmem的示例代碼:

int majorNum;
dev_t devNo;  // Major and Minor device numbers combined into 32 bits
struct class *pClass;  // class_create will set this

static int __init devkoInit(void) {
  struct device *pDev;

  // Register character device
  majorNum = register_chrdev(0, "devko", &fileOps);
  if (majorNum < 0) {
    printk(KERN_ALERT "Could not register device: %d\n", majorNum);
    return majorNum;
  }
  devNo = MKDEV(majorNum, 0);  // Create a dev_t, 32 bit version of numbers

  // Create /sys/class/kmem in preparation of creating /dev/kmem
  pClass = class_create(THIS_MODULE, "kmem");
  if (IS_ERR(pClass)) {
    printk(KERN_WARNING "\ncan't create class");
    unregister_chrdev_region(devNo, 1);
    return -1;
  }

  // Create /dev/kmem for this char dev
  if (IS_ERR(pDev = device_create(pClass, NULL, devNo, NULL, "kmem"))) {
    printk(KERN_WARNING "devko.ko can't create device /dev/kmem\n");
    class_destroy(pClass);
    unregister_chrdev_region(devNo, 1);
    return -1;
  }
  return 0;
} // end of devkoInit


static void __exit devkoExit(void) {
  // Clean up after ourselves
  device_destroy(pClass, devNo);  // Remove the /dev/kmem
  class_destroy(pClass);  // Remove class /sys/class/kmem
  unregister_chrdev(majorNum, DEVICE_NAME);  // Unregister the device
} // end of devkoExit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM