タグ付けされた質問 「linux-kernel」

このタグは、Linuxカーネル自体の内部について、特にカーネルのコンテキスト内で実行されるコード(カーネルモジュールやドライバーなど)についての質問に使用します。Linuxでのユーザー空間コードの記述に関する質問は通常、代わりに[linux]とタグ付けする必要があります。Linuxカーネルの内部は常に変化しているため、関心のある正確なカーネルバージョンを含めると役立ちます。

14
Linuxでメモリをディスクに保存して後で復元することにより、プロセスを「休止状態」にする方法
Linuxでプロセスを「休止状態」にすることは可能ですか?ラップトップの「休止状態」のように、プロセスが使用するすべてのメモリをディスクに書き込み、RAMを解放します。そして、後で、「プロセスを再開」することができます。つまり、メモリからすべてのデータを読み取ってRAMに戻し、プロセスを続行できますか?

3
新しいLinuxカーネルでは、コンテキストの切り替えが非常に遅くなります
サーバーのOSをUbuntu 10.04 LTSからUbuntu 12.04 LTSにアップグレードする予定です。残念ながら、実行可能になったスレッドを実行するための待ち時間は、2.6カーネルから3.2カーネルに大幅に増加したようです。実際、私たちが得ている待ち時間の数値は信じがたいものです。 テストについてより具体的に説明します。2つのスレッドを実行するプログラムがあります。最初のスレッドは現在の時刻(RDTSCを使用したティック単位)を取得し、1秒に1回条件変数を通知します。2番目のスレッドは、条件変数で待機し、シグナルが送られると起動します。次に、現在の時刻を取得します(RDTSCを使用したティック単位)。2番目のスレッドの時間と最初のスレッドの時間の差が計算され、コンソールに表示されます。この後、2番目のスレッドは条件変数をもう一度待機します。約2秒後、最初のスレッドによって再度シグナルが送信されます。 つまり、結果として、1秒に1回、条件変数のレイテンシ測定を介してスレッド間通信を取得します。 カーネル2.6.32では、この待ち時間は2.8〜3.5 us程度であり、これは妥当です。カーネル3.2.0では、このレイテンシは40〜100 us程度に増加しています。2つのホスト間のハードウェアの違いを除外しました。それらは同一のハードウェアで動作します(ハイパースレッディング、スピードステップ、およびすべてのC状態がオフの状態で3.6 GHzで動作するデュアルソケットX5687 {Westmere-EP}プロセッサー)。テストアプリは、同じソケットの独立した物理コアで実行するようにスレッドのアフィニティを変更します(つまり、最初のスレッドはCore 0で実行され、2番目のスレッドはCore 1で実行されます)。したがって、スレッドのバウンスはありません。コアまたはソケット間のバウンス/通信。 2つのホストの唯一の違いは、1つはカーネル2.6.32-28(高速コンテキストスイッチボックス)でUbuntu 10.04 LTSを実行しており、もう1つはカーネル3.2.0-23(低速コンテキスト)で最新のUbuntu 12.04 LTSを実行していることです。スイッチボックス)。BIOS設定とハードウェアはすべて同じです。 スレッドの実行をスケジュールするのにかかる時間のこのとんでもない速度低下を説明できるカーネルの変更はありましたか? 更新: ホストとLinuxビルドでテストを実行したい場合は、閲覧用のコードをペーストビンに投稿しました。コンパイル: g++ -O3 -o test_latency test_latency.cpp -lpthread 実行(少なくともデュアルコアボックスがあると仮定): ./test_latency 0 1 # Thread 1 on Core 0 and Thread 2 on Core 1 更新2:カーネルパラメータの検索、カーネルの変更に関する投稿、および個人的な調査の結果、問題が何であるかがわかり、この質問に対する回答として解決策を投稿しました。

2
Linuxカーネルモジュール内のファイルの読み取り/書き込み
私はなぜカーネルからファイルを読み書きすべきではないかについてのすべての議論を知っています。代わりに/ procまたはnetlinkを使用してそれを行う方法。とにかく読み書きしたい。また、Driving Me Nuts-カーネルで実行してはいけないことも読ん でいます。 ただし、問題は2.6.30がエクスポートしないことsys_read()です。むしろそれはに包まれていSYSCALL_DEFINE3ます。モジュールで使用すると、次の警告が表示されます。 WARNING: "sys_read" [xxx.ko] undefined! WARNING: "sys_open" [xxx.ko] undefined! insmodリンクが正しく行われないため、明らかにモジュールをロードできません。 質問: 2.6.22以降(sys_read()/ sys_open()はエクスポートされない)でカーネル内を読み書きする方法は? 一般的に、SYSCALL_DEFINEn()カーネル内からマクロにラップされたシステムコールを使用する方法は?

3
スレッドが同じPIDを共有している場合、どのようにしてそれらを識別できますか?
Linuxでのスレッドの実装に関連するクエリがあります。 Linuxは明示的なスレッドをサポートしていません。ユーザー空間では、スレッドを作成するためにスレッドライブラリ(NPTLなど)を使用する場合があります。NPTLを使用すると、1:1マッピングがサポートされます。 カーネルはこのclone()関数を使用してスレッドを実装します。 4つのスレッドを作成したとします。それからそれはそれを意味するでしょう: 4になりtask_structます。 の内部ではtask_struct、クローンを作成するための引数に従って共有リソースのプロビジョニングが行われ(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)ます。 今私は次のクエリを持っています: 4つのスレッドは同じPIDを持ちますか?誰かが詳しく説明できる場合、PIDがどのように共有されるか。 異なるスレッドはどのように識別されますか。TID(スレッドID)の概念はありますか?

6
mongodbからのtransparent_hugepage / defrag警告を回避する方法は?
THPについてmongodbから次の警告を受け取ります 2015-03-06T21:01:15.526-0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2015-03-06T21:01:15.526-0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' しかし、私はなんとかTHPを手動でオフにした frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never] frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/defrag always madvise [never] 私は追加することによって、トリックをしたtransparent_hugepage=neverのGRUB_CMDLINE_LINUX_DEFAULTでは/etc/default/grubと追加します if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi に /etc/rc.local いったいどうすれば警告を回避できますか?

2
Makefileの?=とは
KDIR ?= $(shell uname -r) の意味は?=何ですか? :=、+=と=Stack Overflowで利用可能な別のスレッドとの違いを理解しましたが、の説明が見つかりません?=。

2
vdsoとvsyscallとは何ですか?
やった sudo cat /proc/1/maps -vv 出力を理解しようとしています。予想どおり、多くの共有ライブラリがメモリマッピングセグメントにマッピングされているのがわかります。 7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00584000-7f3c00585000 rw-p …
89 c  linux  linux-kernel  kernel  vdso 

3
指定された実行可能ファイルの外部でgdbを使用してシングルステップアセンブリコードを使用すると、「現在の関数の境界が見つかりません」というエラーが発生します
私はgdbのターゲット実行可能ファイルの外にいて、そのターゲットに対応するスタックさえ持っていません。私はx86アセンブリの専門家ではないので、とにかくシングルステップでアセンブリコードで何が起こっているのかを確認したいと思います。残念ながら、gdbはこの単純なアセンブリレベルのデバッグを行うことを拒否します。適切なブレークポイントで設定および停止できますが、シングルステップ以降を実行しようとすると、gdbは「現在の関数の境界が見つかりません」というエラーを報告し、EIPは変更されません。 追加の詳細: マシンコードはgccasmステートメントによって生成され、objdump -dの出力から、それが実行されているカーネルメモリの場所にコピーしました。ローダーを使用してオブジェクトコードを再配置されたアドレスにロードする簡単な方法は気になりませんが、ロードはカーネルモジュールで実行する必要があることに注意してください。 別の代替策は、gdbに提供する偽のカーネルモジュールまたはデバッグ情報ファイルを作成して、この領域がプログラムコード内にあると信じ込ませることだと思います。gdbは、カーネル実行可能ファイル自体で正常に機能します。 (本当に知りたい人のために、実行時にVMware VM内のLinuxカーネルデータスペースにコードを挿入し、VMwareWorkstationの組み込みgdbスタブを介してカーネルをリモートデバッグするgdbからデバッグしています。カーネルを記述していないことに注意してください。悪用;私はプロトタイプを書いているセキュリティ大学院生です。) (アセンブリ内の各命令にブレークポイントを設定できます。これは機能しますが、x86アセンブリ命令のサイズが異なり、再起動するたびにアセンブリの場所が変わるため、しばらくするとかなり面倒になります。)

7
Linuxカーネルのcontainer_ofマクロを理解する
Linuxカーネルを閲覧しているときにcontainer_of、次のように定義されているマクロを見つけました。 #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) container_ofの機能は理解できますが、理解できないのは最後の文です。 (type *)( (char *)__mptr - offsetof(type,member) );}) 次のようにマクロを使用する場合: container_of(dev, struct wifi_device, dev); 最後の文の対応する部分は次のようになります。 (struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev); 何もしていないように見えます。誰かがここの隙間を埋めてくれませんか?

2
Linuxカーネルでの浮動小数点の使用
RobertLoveの「LinuxKernelDevelopment」を読んでいて、次の文章に出くわしました。 浮動小数点の(簡単な)使用なし ユーザースペースプロセスが浮動小数点命令を使用する場合、カーネルは整数モードから浮動小数点モードへの遷移を管理します。浮動小数点命令を使用するときにカーネルが実行する必要があることはアーキテクチャによって異なりますが、カーネルは通常、トラップをキャッチしてから、整数モードから浮動小数点モードへの移行を開始します。 ユーザースペースとは異なり、カーネルはそれ自体を簡単にトラップできないため、浮動小数点をシームレスにサポートするという贅沢はありません。カーネル内で浮動小数点を使用するには、他の可能な雑用の中でも、浮動小数点レジスタを手動で保存および復元する必要があります。簡単な答えは:それをしないでください!まれな場合を除いて、カーネルには浮動小数点演算はありません。 これらの「整数」モードと「浮動小数点」モードについては聞いたことがありません。それらは正確には何であり、なぜそれらが必要なのですか?この違いは、主流のハードウェアアーキテクチャ(x86など)に存在しますか、それともいくつかのよりエキゾチックな環境に固有ですか?プロセスとカーネルの両方の観点から、整数モードから浮動小数点モードへの移行には正確に何が必要ですか?

1
画像vszImage vs uImage
それらの違いは何ですか? u-bootにはuImage形式のカーネルが必要であることを私は知っています。 私が使用するシステムは、最初にステージ1ローダーから起動し、次にu-bootを呼び出します。u-bootを破棄し、ステージ1ローダーから直接起動したい。どのタイプのカーネルイメージを使用する必要がありますか?

5
Linux I / Oスケジューラの選択
/ sys / block / [disk] / queue / schedulerに書き込むことで、実行中のカーネル上の特定のデバイスのI / Oスケジューラーを変更できると思われることを読みました。たとえば、私のシステムで見ることができます: anon@anon:~$ cat /sys/block/sda/queue/scheduler noop anticipatory deadline [cfq] デフォルトは完全に均等化キューイングスケジューラです。私が疑問に思っているのは、カスタムカーネルに4つのスケジューラーすべてを含めることに何か意味があるかどうかです。カーネルが正しいハードウェア用の正しいスケジューラー、特にフラッシュベースのドライブ用の「noop」スケジューラーと従来のドライブ用の他のスケジューラーを選択するのに十分賢くない限り、複数のスケジューラーをコンパイルすることにはあまり意味がないようです。ハードドライブ。 これは本当ですか?


2
Linuxブロックデバイスのリクエストキューを特定するにはどうすればよいですか?
ネットワーク経由でハードディスクを接続するこのドライバーに取り組んでいます。コンピューターで2つ以上のハードディスクを有効にすると、最初の1つだけがパーティションを調べて識別されるというバグがあります。その結果、hdaに1つのパーティションがあり、hdbに1つのパーティションがある場合、hdaに接続するとすぐに、マウントできるパーティションができます。したがって、hda1は、マウントされるとすぐにblkidxyz123を取得します。しかし、先に進んでhdb1をマウントすると、同じblkidが表示され、実際、ドライバーはhdbではなくhdaから読み取っています。 だから、運転手がめちゃくちゃになっているところを見つけたと思います。以下は、間違ったデバイスにアクセスしているように見える最初の場所に置いたdump_stackを含むデバッグ出力です。 コードセクションは次のとおりです。 /*basically, this is just the request_queue processor. In the log output that follows, the second device, (hdb) has just been connected, right after hda was connected and hda1 was mounted to the system. */ void nblk_request_proc(struct request_queue *q) { struct request *req; ndas_error_t err = NDAS_OK; dump_stack(); …

4
構造体の配列の最後に空の中括弧 '{}'が必要なのは何ですか?
Linuxカーネルでc コードをいくつかヒットしました。 static struct ctl_table ip_ct_sysctl_table[] = { { .procname = "ip_conntrack_max", .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, }, // ... { .procname = "ip_conntrack_log_invalid", .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = &log_invalid_proto_min, .extra2 = &log_invalid_proto_max, }, { } }; ここで、構造体の配列はで終わり{ }ます。どのような目的で追加されましたか? …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.