fs/inode.c
void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
else if (s_isblk(mode)) else if (s_isfifo(mode))
inode->i_fop = &def_fifo_fops;
else if (s_issock(mode))
inode->i_fop = &bad_sock_fops;
else
printk(kern_debug "init_special_inode: bogus i_mode (%o) for"
" inode %s:%lu\n", mode, inode->i_sb->s_id,
inode->i_ino);
}通過inode中mode獲取檔案的型別
對於字元裝置 ,對應結構struct cdev , const struct file_operations *ops 對應操作方法, fs/char_dev.c
static int chrdev_open(struct inode *inode, struct file *filp)
else if (!cdev_get(p))
ret = -enxio;
} else if (!cdev_get(p))
ret = -enxio;
spin_unlock(&cdev_lock);
cdev_put(new);
if (ret)
return ret;
ret = -enxio;
filp->
f_op = fops_get(p->ops);
if (!filp->f_op)
goto out_cdev_put;
if (filp->f_op->open)
return 0;
out_cdev_put:
cdev_put(p);
return ret;
}inode中的
i_rdev記錄了裝置號,通過
i_rdev找到kobj,然後得到 struct cdev,而這個過程是在cdev_add中完成struct cdev和裝置號之間的對映的。
對於塊裝置, 對應結構struct block_device, const struct block_device_operations *fops對應操作方法, fs/block_dev.c:
static int blkdev_open(struct inode * inode, struct file * filp)
static struct block_device *bd_acquire(struct inode *inode)
spin_unlock(&bdev_lock);
bdev =
bdget(inode->
i_rdev);
//通過裝置號找到struct block_device
if (bdev)
spin_unlock(&bdev_lock);
}return bdev;
}struct block_device代表乙個塊裝置
struct block_device *bdget(dev_t dev)
int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)
static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
struct gendisk *get_gendisk(dev_t devt, int *partno)
else
mutex_unlock(&ext_devt_mutex);
}return disk;
}
Linux 一切皆檔案
一切皆是檔案 是 unix linux 的基本哲學之一 不僅普通的檔案,目錄 字元裝置 塊裝置 套接字等在 unix linux 中都是以檔案被對待 它們雖然型別不同,但是對其提供的卻是同一套操作介面。檔案本質就是一種抽象,一般是指對資料的一種抽象。同時,檔案 也表示資料的儲存組織形式。資料庫就是另...
Linux 一切皆檔案
啟動乙個程序,需要乙個程式檔案,這是乙個二進位制檔案。啟動的時候,要載入一些配置檔案,例如 yml properties 等,這是文字檔案 啟動之後會列印一些日誌,如果寫到硬碟上,也是文字檔案。但是如果我想把日誌列印到互動控制台上,在命令列上唰唰地列印出來,這其實也是乙個檔案,是標準輸出 stdou...
linux一切皆是檔案 LINUX一切皆檔案
只要用過linux的筒子,或者保守點說接觸到一些linux思想的同志肯定聽說過這樣一句話,在linux下,一切皆是檔案 不錯,今天walfred將在快速上手linux裝置驅動這一塊,談談linux的裝置也符合 一切皆是檔案 的思想在linux裝置驅動模型應用。如果你不理解linux裝置模型,請看下面...