open系統呼叫在核心中的流程分析

2021-06-03 07:40:52 字數 1364 閱讀 7484

真是蠻複雜的,我分三步走,力求講得比較清楚。

以字元裝置為例,相對於塊裝置要簡單些。

基於2.6.26的核心

一)驅動註冊open函式都幹了些什麼?

register_chrdev -> cdev_add  ->  kobj_map

file: fs/char_dev.c

int register_chrdev(unsigned int major, const char *name,

const struct file_operations *fops)

file: fs/char_dev.c

int cdev_add(struct cdev *p, dev_t dev, unsigned count)

file: fs/char_dev.c

static struct kobject *exact_match(dev_t dev, int *part, void *data)

file: drivers/base/map.c

int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range,

struct module *module, kobj_probe_t *probe,

int (*lock)(dev_t, void *), void *data)

mutex_lock(domain->lock);

for (i = 0, p -= n; i < n; i++, p++, index++)

mutex_unlock(domain->lock);

return 0;

}二)從系統呼叫往核心走,看當初驅動裡註冊的file_operations裡的open函式怎麼被呼叫的

這個跟具體的檔案系統有關係的。

現在/dev/下的裝置節點都是通過udev動態建立的,udev會去呼叫mknod(假定是ext2,核心會呼叫ext2_mknod),

如果是char裝置,會把def_chr_fops附給inode->i_fop,而ext2_mknod會呼叫init_special_inode(),函式

的部分實現如下:

file: fs/ext2/namei.c

static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t rdev)

...}

file: fs/char_dev.c

const struct file_operations def_chr_fops = ;

系統呼叫Open 函式的核心追蹤 上篇

from open函式相信大家都用過,這裡就不多說它的使用方法等事項,現直接進入正題.使用者態程式呼叫open函式時,會產生乙個中斷號為5的中斷請求,其值以該巨集 nr open進行標示.而後該程序上下文 processcontext 將會被切換到核心空間。待核心中的相關操作完成後,就會從核心返回,...

二。向核心中新增系統呼叫

核心版本 3.4.24 大家發現什麼問題一定要告訴我,大家一起學習啦 向核心中新增系統呼叫 1.系統呼叫是和平台相關的 arm平台的系統呼叫的彙編 路徑 vim 從333行開始 2.新增系統呼叫的步驟 存著系統呼叫表,系統呼叫的函式入口就是這 系統呼叫號就是基於基位址的配偏移位址 vim linux...

open 系統呼叫的實現

open系統呼叫的服務例程是sys open 函式,它接受三個引數 要開啟檔案的路徑名filename,訪問模式的表示flags和檔案許可權掩碼mode。在核心中,sys open實際呼叫do sys open函式來完成所有操作。do sys open主要執行如下操作 1,通過getname 從程序...