Open()なしでカーネルスペース内のファイル記述子と詳細を取得する -- c フィールド と linux フィールド と linux-kernel フィールド 関連 問題

Getting file descriptors and details within kernel space without open()












6
vote

問題

日本語

誰もがこの問題を克服するためのコードを提供することができますか?

ファイル /dev/driver1

を考えると、カーネルレベルから struct inode* を効果的に取得する方法

ユーザースペースに与えられた:

<事前> <コード> int fd; fd = open("/dev/driver1", O_RDWR | O_SYNC);

カーネル空間:

<事前> <コード> static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg) struct dev_handle *handle; handle = file->private_data;

それを想定して、そのパスでは行かない、

例えばカーネル自体の中でどのように入手しますか。ハードコーディング<コード> True0 は、ハンドルに与えられますか?

英語

Could anyone provide the code to overcome this problem?

Effectively how do we obtain the struct inode* from kernel level given the file /dev/driver1?

Given in user space that:

int fd; fd = open("/dev/driver1", O_RDWR | O_SYNC); 

In Kernel space:

static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg) struct dev_handle *handle; handle = file->private_data;     

Assuming that, we do not go by that path,

How do we obtain within the kernel itself, by eg. hard coding the file->private_data to be given to handle?

</div
        
         
         

回答リスト

2
 
vote

filp_open 機能を探しています。ファイル<コード> include/linux/fs.h :

<事前> <コード> struct file *filp_open(const char *filename, int flags, umode_t mode);

これは関数ソースとドキュメントへのリンクです。 http:/ /lxr.Free-Electrontons.com/Source/FS/Open.ch.CLAT937

本当にFDが必要な場合は、 sys_open (新しいカーネルではエクスポートされていない)を使用できます。

<事前> <コード> long sys_open(const char __user *filename, int flags, int mode);

私会の質問について非常に良い答えを見つけることができます: Linuxカーネルモジュール内のファイルの読み書き方法

編集( inode の取得方法):

キャッシュされた inode から struct file

<事前> <コード> struct file *file = ...; struct inode *inode = file->inode;

ロックでそれを望むなら:ここは背景です:<コード> Documentation/filesystems/path-lookup.txt

トラバースの開始点は include/linux/fs.h0 です。カーネルにはいくつかの機能がありますが、すでに作業を行うには、 include/linux/fs.h1 ソースファイルで見つけることができます。

関数があります。<コード> include/linux/fs.h2 :

<事前> <コード> include/linux/fs.h3
 

You are looking for filp_open function. From file include/linux/fs.h:

struct file *filp_open(const char *filename, int flags, umode_t mode); 

Here is a link to function source and documentation: http://lxr.free-electrons.com/source/fs/open.c#L937

If you really need FD, you can use sys_open (not exported in newer kernels):

long sys_open(const char __user *filename, int flags, int mode); 

You can find a very good answer on a similar question: How to read/write files within a Linux kernel module?

Edit (how to get inode):

You can get cached inode from struct file:

struct file *file = ...; struct inode *inode = file->inode; 

If you want it with locking: here is a background: Documentation/filesystems/path-lookup.txt

The starting point for traversing is current->fs->root. There is a number of function in kernel, that already do the work, you can find them in fs/namei.c source file.

There is a function: kern_path:

int error; struct inode *inode; struct path path;  error = kern_path(pathname, LOOKUP_FOLLOW, &path); if (error) ...;  inode = path.dentry->d_inode; 
</div
 
 
   
   
1
 
vote

あなたのコードはdev_ioctl関数にありますか? もしそうなら、

<事前> <コード> include/linux/fs.h4

要件をロックするためのSANE文書がないようであるため、おそらく類似のコードを掘り下げて<コード> inode15 メンバーで動作する方法を確認してください。

 

Your code is in the dev_ioctl function ? If so, then

static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg)     struct dev_handle *handle;     struct inode *inode;     handle = file->private_data;         inode = file->f_inode; 

There seems to be no sane documentation for locking requirements, so you should probably try to dig up similar code and see how it operates on the f_inode member.

</div
 
 
 
 

関連する質問

4  Linuxカーネルスレッド(kthread)を終了するのを待つ方法は?  ( How to wait for a linux kernel thread kthreadto exit ) 
Linuxカーネルスレッド上でプログラミングを開始しました。私はあなたと一緒に共有したいという問題があります。私のコードは:です <プレクラス= "LANG-C Pretayprint-Override"> <コード> void do_big_things(...

3  EC2のUbuntuでカーネルをコンパイルしてください(エラーなしではなく、再起動後にイメージが含まれません)。  ( Compiling kernel in ubuntu on ec2 no errors but no image and unchanged after r ) 
VoIP通話品質を向上させるために、250Hzから1000HzのEC2上のUbuntu Lucid(10.04)サーバー上のカーネルタイマーを更新する必要があります。 私が読んだことから、それを行う方法はカーネルのソースコードをダウンロードし、それを構成して...

1  このIRQの値がどのように初期化されているのか  ( How and when value for this irq is initialised ) 
arch/arm/kernel/perf_event.c のLinuxカーネルのソースコードの一部を経て、 request_irq の設定がどのように行われたかを理解しようとしています。 <事前> <コード> static int armpmu_reser...

272  自然のCタイプはブールですか?  ( Is bool a native c type ) 
LinuxカーネルコードがBOOLを使用することに気付いたが、BOOLはC ++タイプであると考えています。標準Cの拡張(例えば、ISO C90)またはGCC拡張機能をブールしますか? ...

1  デバッグカーネルハングアップ  ( Debugging kernel hang ) 
カーネルモードドライバを使用しているアプリを実行しようとしています。システムは毎時ロックし、それを回復する唯一の方法はハードリセットです。 SYSRQが応答を停止し、Telnetセッションがハングし、どのような種類のエラーメッセージはありません。残念ながらボー...

0  / proc / io *をどのように移入しますか?  ( How is proc io populated ) 
だから私が物事を正しく理解していれば、 cat /proc/iomem は、これにマッピングされているメモリアドレスとそのデバイスレジスタを ioports にリストします。 Linuxデバイスドライバでいくつかの本を取得すると、 iomem が<コード> i...

1  文書化されていないカーネルブートパラメータ? [閉まっている]  ( Undocumented kernel boot parameter ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

6  カーネルスペースからのユーザースペース機能の実行  ( Executing a user space function from the kernel space ) 
IMは、割り込みで非常に迅速に対応できるようにする必要があるLinuxでカスタムデバイスドライバを書き込みます。これを処理するためのコードはすでにユーザー空間実装に存在しますが、それが絶えず割り込み回線の状態をチェックするソフトウェアに依存しているので遅すぎ...

1  私のAndroid携帯電話を使用して、またはGNUラジオを使用して、特定の頻度とデータレートで信号を送信できますか。  ( Can i send a signal with a certain frequency and data rate using my android phon ) 
特定のデータを特定のデータを送信したいと思っています。またはこれを行うことができるアプリはありますか? PLZヘルプ!!!! ...

0  他のディレクトリからJavaプロセスを実行できません  ( Cant run java process from another directory ) 
私はこのファイルでフォルダAを持っています: <事前> <コード> - nice-proj-5.1.2.jar - MyCLI.class フォルダのターミナルから実行されると、 <事前> <コード> java -cp /home/user123/proj...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有