タグ

kernelに関するakaneharaのブックマーク (19)

  • Linuxのpipeの実装を見てみる - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ

    Unix V6のpipe()と比べてLinuxのpipe()どう実装しているんですかねーなんて話を最近したのでちょっと見比べてみた。 V6のpipeははじめてのOSコードリーディング 読書会 (15)でやったところなんだけど、俺は風邪ひいて家で引きこもってたので・・・ V6のpipeの挙動は大体こんな感じ。 pipeはルートディスクのストレージ領域を4096B(8ブロック)使用し実現する 4KBのデータ領域はひとつのファイルとして扱われる(inodeが割り当てられる) オンメモリではなくてストレージを経由するが、バッファサイズが小さいのでブロックデバイスのバッファキャッシュが効きやすいようになっている pipeの受け手がデータを読みだす前に他の優先度の高いプロセスがブロックデバイスを使用するとキャッシュが効かなくなる可能性あり でも、データはストレージに書かれているので内容が壊れると言った

    Linuxのpipeの実装を見てみる - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
  • Linux Kernel ~ 割り込み処理 ~ - レガシーガジェット研究所

    概要 「詳解Linux Kernel」を参考にVersion 2.6.11のコードリーディングをしていく。CPUのアーキテクチャは書籍に沿ってIntelのx86とする。 今回は割り込み処理について見ていく。(*nは参考文献のn番目に対応する) 割り込み処理 例外ではほとんどの場合その例外の発生元となっているカレントプロセスにシグナルを送信することで処理する。例外処理もシグナルを受け取るまでは遅延される。 しかし割り込みの場合には別の無関係なプロセスが動作している際に発生することがあり、単純にカレントプロセスにシグナルを送信するだけではない。 割り込みは大きく3種類に分類される。 I/O割り込み 当該割り込みでは割り込みに対応する動作を決定するために割り込みハンドラからデバイスに対して問い合わせを行う必要がある。 タイマー割り込み ローカルAPICタイマや外部タイマなどが発生させる割り込みで

    Linux Kernel ~ 割り込み処理 ~ - レガシーガジェット研究所
  • Majordomo Lists at VGER.KERNEL.ORG

    Majordomo lists at VGER.KERNEL.ORG REMEMBER: Subscription to these lists go via <majordomo@vger.kernel.org> ! Note about archives: Listed archives are those that have been reported to vger's maintainers, or that we have found out otherwise. As things are, list of archives is not complete. alsa-devel, audit, autofs, backports, bpf, ceph-devel, cgroups, cpufreq, dash, dccp, devicetree-compiler, devi

  • Linuxのシステムコール再実行について - Qiita

    また、シグナルを受信した際、プロセスは、エラー終了するかシステムコールをもう一度行うように指定できます。 これは、処理がユーザ空間に戻る際に、実行ポインタを「カーネルへ処理を移す命令」に戻すことによって実現されています。 ちょうど書くネタに困っていたこともあり(!)、今のLinux実装を調べてまとめました。 なお、調査対象およびコードを引用したLinuxのバージョンは4.18.11です。また、アーキテクチャはx86です。 システムコールから戻る箇所 システムコールを実行するメインとなる処理は以下の関数です。 #ifdef CONFIG_X86_64 __visible void do_syscall_64(unsigned long nr, struct pt_regs *regs) { struct thread_info *ti; enter_from_user_mode(); loc

    Linuxのシステムコール再実行について - Qiita
  • Linux KernelのLinked Listの実装が面白い件 - 愛と勇気と缶ビール

    最近、Robert Love先生のを暇な時にダラーと読んでいたりするわけですが、それの中にLinux Kernel内部で使われているLinked Listの実装が書いてあって面白かったので共有。 まず、Linked Listの一個一個のエントリを表すstructを定義します。 struct list_head { struct list_head *next, *prev; }; いやいやいやいや。いかにC力の低い僕でも流石にこれはあきません。騙されませんよ。前後のエントリへのポインタは確かにあるけれども、これにはデータを指すためのポインタがないじゃないの。おじいちゃんまたデータ忘れてきちゃったの?いやあねえ。 おじいちゃんは言った。「それはお前の短見というものじゃ。このLinked Listは以下のコードのようにデータ構造に埋め込んで使うものなんじゃよ。」そしてそれは正しかった。 st

    Linux KernelのLinked Listの実装が面白い件 - 愛と勇気と缶ビール
  • Linuxカーネルのソースコードを機能とレイヤーで分類して表示してくれる「Linux kernel map」

    Linuxのカーネルは膨大な数のソースコードから成り立っており、どこに何の処理が書いてあるのかぱっと見当をつけるのにはかなりコードを読み込む必要があります。「Interactive map of Linux kernel」はそのソースコードを機能とレイヤーで分類して表示してくれるサイトということで、使い勝手を試してみました。 Interactive map of Linux kernel http://www.makelinux.net/kernel_map/ サイトにアクセスし、ロードが終わると下の画像のように6列6行の表が表示されます。列が機能の分類を表しており、「インターフェース」「システム」「処理」「メモリー」「ストレージ」「ネットワーク」という分類になっています。行はレイヤーを表しており、上からシステムコールなどの「ユーザースペースインターフェース」、「バーチャル」、「ブリッジ」

    Linuxカーネルのソースコードを機能とレイヤーで分類して表示してくれる「Linux kernel map」
  • Linux kernel名物よくわからないけど便利なforeachマクロ(CPU番号編) - syuu1228's blog

    Linux kernelと言えばlist_for_eachみたいな謎のマクロでよくわからないがforeachできる事はよく知られているが、他にも色々あるのだなぁと知ったのでメモ。 #define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask) #define for_each_online_cpu(cpu) for_each_cpu((cpu), cpu_online_mask) #define for_each_present_cpu(cpu) for_each_cpu((cpu), cpu_present_mask) for_each_possible_cpuはシステムに存在可能なCPU番号をイテレート、for_each_online_cpuはシステムで今オンラインなCPU番号をイテレート、for_ea

    Linux kernel名物よくわからないけど便利なforeachマクロ(CPU番号編) - syuu1228's blog
  • 第14回「 SystemTap ノススメ」 | NTTデータ先端技術株式会社

    Tweet 今回は、カーネルに関するトラブル解析で大活躍する SystemTap についてです。SystemTap の使用を容認できるかどうかが問題事象の原因を究明できるかどうかに直結しそうな、切り札と言えるくらいに重要なツールです。導入手順と使い方については Red Hat 社のウェブサイトにある記事( https://access.redhat.com/ja/node/882873 )を参照していただくとして、ここでは実際の調査で使用できるサンプルを紹介したいと思います。 サンプル1:再起動要求をカーネルパニックに置き換える。 正常なシャットダウンシーケンスを伴わずにシステムが突然再起動するというのは、シリアルコンソールや netconsole を使ってカーネルメッセージの有無を確認することくらいしかできない、システム管理者にとって悩ましいトラブルです。しかし、SystemTap を容

    第14回「 SystemTap ノススメ」 | NTTデータ先端技術株式会社
  • Linux シグナルの基礎

    TLPI (The Linux Programming Interface) 再々。 TLPI の輪読の際に @matsumotory よりシグナルセットあたりをまとめるようにと指令が出たので、拙遅な感じでまとめました。 シグナルとは プロセス間通信の一種。「プロセスにシグナルを送信すると、そのプロセスの正常処理に割り込んで、シグナル固有の処理(シグナルハンドラ) が実行される」プロセス側では、シグナルを受信した際の動作(シグナルハンドラ) を設定することや、シグナルをブロックすることも可能。 コンソールで、プロセスを終了させるためにkill -9 <PID>とかCtrl+Cとかした際にも、対象プロセスにシグナルが送信されている。 ちなみに、PID「1」の initsystemd にkill -9 1しても何も起らない。(そういえば昔、oom-killer に init を殺された覚

    Linux シグナルの基礎
  • xv6 - Wikipedia

    xv6は、ANSI Cによる、Sixth Edition Unixのマルチプロセッサx86システムへの再実装である。xv6はMITにおけるオペレーティングシステムエンジニアリング (6.828) コースにて、教育を目的として使われている。 オペレーティングシステムの目的[編集] LinuxやBSDとは異なり、xv6は1セメスターで学習するのに十分なほどシンプルであり、Unixの重要な概念と構造を含んでいる [1]。 このコースでは、オリジナルのV6のコードを学習するのではなく、xv6を使う。それは、PDP-11マシンは簡単には手に入らないし、オリジナルのV6は非常に古いANSI C以前のC言語で書かれているためである。 セルフドキュメンテーション[編集] xv6のMakefileの面白い特徴として、ソースコード全体を読みやすい形式で掲載したPDFファイルを生成するオプションを持っていること

    xv6 - Wikipedia
  • 特定条件下のclone(2)を4倍速くする - 人間とウェブの未来

    とあるサーバで妙にシステムCPUの使用率が高い現象が置きておりました。 そこで、まずはざっくりとperf topでプロファイルをとってみると、以下のようになっていました。 22.38% [kernel] [k] copy_pte_range 18.44% [kernel] [k] zap_pte_range 11.13% [kernel] [k] change_pte_range 3.58% [kernel] [k] page_fault 3.32% [kernel] [k] page_remove_rmap また、各プロセスのstraceを眺めていると、cloneで0.05秒とかなり時間がかかっているようです。これだと単純計算で1コアで秒間20回のcloneでコア100%占有してしまう程度の非常に低速な処理しかできないことになります。 sudo strace -T -o/dev/stdo

    特定条件下のclone(2)を4倍速くする - 人間とウェブの未来
  • 「Gitポケットリファレンス」を活用してカーネルソースを読んでみよう! - めもめも

    Gitポケットリファレンス 作者: 岡隆史,武田健太郎,相良幸範出版社/メーカー: 技術評論社発売日: 2012/07/10メディア: 単行(ソフトカバー)購入: 7人 クリック: 103回この商品を含むブログ (26件) を見る こちらの書籍を著者様より献いただきました。ありがとうございます! 書は、GitHubなどの既存の共有リポジトリの使用を前提として、これから開発に参加しようという読者を想定しているため、「どういうシーンでどのgitコマンドを使えばいいのか」が明確で、わかりやすい構成になっています。実用面にフォーカスしたGitの解説書としては、今のところベストな1冊ではないでしょうか。 ところで・・・・ ちなみに私の場合は、ソースコードを書く時間よりは、読む時間の方がずっと長いのですが、実は「ソースを読むツール」としてもGitは有用です。 Gitリポジトリにはソースコードの

    「Gitポケットリファレンス」を活用してカーネルソースを読んでみよう! - めもめも
  • Linux のプロセスが Copy on Write で共有しているメモリのサイズを調べる

    Linux は fork で子プロセスを作成した場合、親の仮想メモリ空間の内容を子へコピーする必要があります。しかしまともに全空間をコピーしていたのでは fork のコストが高くなってしまいますし、子が親と同じようなプロセスとして動作し続ける場合は、内容の重複したページが多数できてしまい、効率がよくありません。 そこで、Linux の仮想メモリは、メモリ空間を舐めてコピーするのではなく、はじめは親子でメモリ領域を共有しておいて、書き込みがあった時点で、その書き込みのあったページだけを親子で個別に持つという仕組みでこの問題を回避します。Copy-On-Write (CoW) と呼ばれる戦略です。共有メモリページは、親子それぞれの仮想メモリ空間を同一の物理メモリにマッピングすることで実現されます。より詳しくは コピーオンライト - Wikipedia などを参照してください。 この CoW に

    Linux のプロセスが Copy on Write で共有しているメモリのサイズを調べる
  • Linux Insides : カーネル起動プロセス part1 | POSTD

    ブートローダからカーネルまで これまでの私の ブログ投稿 を読まれた方はご存じかと思いますが、しばらく前から低水準言語を使うようになりました。Linux用x8664アセンブリ言語プログラミングについても書いています。また、同時にLinuxのソースコードにも触れるようになりました。下層がどのように機能しているのか、コンピュータでプログラムがどのように実行されるのか、どのようにメモリに配置されるのか、カーネルがどのように処理や記憶をするのか、下層でネットワークスタックがどのように動くのかなどなど、多くのことを理解しようと意欲が湧いています。これをきっかけに、 **x8664** 版Linuxカーネルについてシリーズを書いてみようと思いました。 私はプロのカーネルプログラマではないことと、仕事でもカーネルのコードを書いていないことをご了承ください。個人的な趣味です。私は下層で何が起きているのかと

    Linux Insides : カーネル起動プロセス part1 | POSTD
  • Linux のページ回収まわりのカーネルパラメータ - ablog

    Linux(kernel 2.6.32-303 以降)のDBサーバでメモリ16GB、スワップ領域16GBの場合、ざっくりこんな感じが良いかなという妄想メモ。 vm.swapiness=1 vm.overcommit_memory=2 vm.overcommit_ratio=80 vm.min_free_kbytes=524288 vm.extra_free_kbytes=1048576(kernel 3.5以降) vm.swappiness=1 でページアウトよりページキャッシュ解放を優先させる。kernel 2.6.32-303 以降、0 にすると OOM Killer が発動しやすくなるらしいので、1 にする。 vm.overcommit_memory=2 でオーバーコミットしないようにして、OOM Killer が発動しにくくする vm.overcommit_ratio=80 で仮想

    Linux のページ回収まわりのカーネルパラメータ - ablog
  • 大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog

    以下、長々と書いてますが、結論は ”私の環境で”大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablogに書いてます はじめに awk file より cat file|awk のほうが速いという以下のブログエントリが興味深いので調べてみました。 ちなみに cat file|awk が速くなる環境は稀で、巷では awk file のほうが速い環境のほうが多いようで、どちらが速いかは環境依存です。 [root@localhost sample]# cat command1 awk '$5 ~ /((26|27|28|29|30)\/Jun|(01|02|03)\/Jul)/{ print }' sample.txt > result1.txt (中略) [root@localhost sample]# time sh command1 real 0m53.92

    大きなテキストファイルをawkで処理するときにcatで投げ込むと速い理由 - ablog
  • The Linux Kernel

    David A Rusling david.rusling@arm.comv0.8-3 January 25, 1999 JF Projectv0.8-3 December 2000 *フレーム表示* 書は、Linux カーネルの仕組みを知りたい Linux 愛好家のためのものです。これは 内部構造のマニュアルではありません。むしろ Linux で使用されている原理や メカニズムを解説したものであり、Linux の動作原理とはどういうもので、なぜそれ が採用されているのかを説明するものです。 Linux という対象は常に変化しています。書がベースにしているのは現在の安定 版である 2.0.33 のカーネルソースですが、これは個人や法人の大部分で使用されて いるのがこのバージョンだからです。 また、書は自由に配布してもらってかまわないので、一定の条件のもとにではあり ますが、複製や再配

  • 第9回 機能拡張でよく使われる共用体(union)

    構造体によく似たC言語の機能に「共用体」(union)があります。これは,IPv4をIPv6に拡張するときなど,カーネルの機能を拡張する際によく使われます。共用体の使い方とカーネルでの利用例を実際に見ていきましょう。 カーネルは,機能がよく拡張されます。例えば,ネットワーク・プロトコルの「IPv4」と「IPv6」の関係です。現在の主流はIPv4ですが, LinuxカーネルはIPv6に対応しています。ソース・コードを見ると分かるように,IPv6のコードを一から書いているのではなく,IPv4を処理する部分でIPv6と共用できるところを機能拡張しています。ここで使うのが,「共用体」(union)です。 共用体は,カーネル内部のあらゆる部分に利用されています。カーネルの読者にはとても大事なものですが,C言語の教科書の多くには詳細な解説がありません。そこでまず最初に,共用体とは何かを説明しましょう。

    第9回 機能拡張でよく使われる共用体(union)
  • process-book

    この文書はなんですか? この文書は*nix系のシステムにおけるプロセスやシグナルなどについて説明することを目的に書かれました。「プロセスとかよくわかってないからちゃんと知りたいな」みたいなひとたちが想定読者です。 書いているあいだは gist で管理されていたのですが、ボリュームが大きくなったので github で管理するように変えました。 目次 導入 プロセスの生成 プロセスとファイル入出力 ファイルディスクリプタ preforkサーバーを作ってみよう ゾンビプロセスと孤児プロセス シグナルとkill プロセスグループとフォアグランドプロセス epub と pdf epub化したもの、pdf化したものが release ディレクトリに入っています。thanks to mitukiii & moznion! ライセンス この 作品 は クリエイティブ・コモンズ 表示 - 継承 3.0 非移

  • 1