linux一切裝置皆檔案的實現(一)

2021-08-18 03:46:10 字數 1961 閱讀 5227

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裝置模型,請看下面...