最近、TCP/IP スタックを自作しており、少し動くようになってきたので、それについて記事にしてみようと思いました。主に、ポータブル(特定の CPU、NIC、OS、ライブラリ、コンパイラ機能に依存しない)かつマルチコア環境で利用できる実装があればいいなと…
OS のメモリ管理の仕組みについて調べたことをまとめました。読んでいただくと、以下のようなことについて少し詳しくわかるかもしれません。 あるユーザー空間プロセスが他のユーザー空間プロセスのメモリにアクセスできない理由 ユーザー空間プロセスがカー…
前回の記事で紹介しました Zpoline というシステムコールフックの仕組みだと、バイナリ書き換え後の関数を、システムコールフックから呼び出してしまうと、デッドロックもしくは無限ループが発生することがあるという問題がありました。結果として、システム…
新しい高性能で汎用的なシステムコールフックの仕組みを作ってみました。モチベーションとして、システムコールをフックしてユーザー空間でエミュレートしたくなったのですが、現状、性能と汎用性を両立する仕組みがなさそうだったので、新しい方法を考えま…
Linux のカーネルハックの実践的な入門方法について書いてみようと思います。カーネルハックをすると、OS の機能を改変したり、追加したりできます。OS の機能の例としては、スケジューラ、メモリ管理機能、ネットワークスタック、ファイルシステム、デバイ…
カーネルハックの入門的な内容について、あまりまとまった情報がないように思ったので、記事にしてみようと思いました。これから勉強を始めてみようと思われる方の参考になれば幸いです。 ユーザー空間とカーネル空間 Linux のような UNIX 系 OS では、ユー…
ファイルを mmap した仮想メモリアドレスの上で、データ構造を操作して、そのままファイルに保存したいと思われたことはありませんでしょうか。実際にやってみようとすると、mmap された仮想メモリ領域の空き空間の管理を自分で行わなければならず、ファイル…
ファイルを mmap した仮想メモリアドレス空間の上でデータ構造の操作を行い、変更をそのままファイルへ保存したいと思ったことはありませんでしょうか。面倒な点として、mmap されたファイルは、次回以降 mmap されたときに、同じ仮想メモリアドレスにマップ…
Optimistic, Latch-Free Index Traversal (OLFIT) という手法を提案している、Cache-Conscious Concurrency Control of Main-Memory Indexes on Shared-Memory Multiprocessor Systems という論文を参考に、マルチコア環境でスケールするB木を書いてみました…
fsync について調べたことをまとめます。特に、最新の研究も含めて、ジャーナリングやメタデータの整合性について書いていこうと思います。読んでいただけると、ファイルシステムが裏でどのようにデータを永続ストレージへ書き出しているかについての理解が…
ファイルシステムのメタデータについて調べたことを書いてみようと思います。勉強のためにファイルシステム関連の資料を見ていると、メタデータの種類に関して列挙しているものはたくさん見つかったのですが、それらがどのように保存されるかについての記述…
ファイルシステムについて勉強したことについて書いてみようと思います。今回は、概観について、ふわっと理解できるような資料になるように書いていきたいと思います。 読んでいただくと、read、write システムコールの裏側で何が起きているか若干想像がつく…
OS のプロセススケジューラの実装について調べました。UNIX や Linux のような洗練された OS のスケジューラの実装はとても複雑で理解するのが大変ですが、スケジューラ実装の根本的なコンセプト自体は、少し単純化して表現できそうに思いました。今回は、実…
仮想 I/O の高速化手法についてまとめました。特にネットワーク I/O の高速化について調べました。 デバイスの仮想化 仮想マシンが利用するネットワークカードは多くの場合、QEMU のようなエミュレータによってエミュレーションされており、物理的なネットワ…
ネットワークスタックの高速化手法についてまとめました。これらの手法が提案された背景には、10Gb NIC 等の高性能なハードウェアの値段が下がり、汎用化が進んだ一方で、汎用 OS のネットワークスタック実装では、それらの性能を十分引き出せないという問題…
netmap のようなパケット I/O フレームワークが、どのように NIC からパケット転送を行っているのかについてまとめました。以前のエントリー*1で、Intel NIC でパケットを転送するために、デバイスドライバがどのような処理をしているのかを見ました。今回は…
Linux の NIC のデバイスドライバが、どのようにデータを送信するのかについてまとめました。特に Intel NIC のドライバについて見ていきます。Intel の 1Gb NIC のデータシートが次の URL *1 で見つかりますので、それも参考にしながら見ていただければと思…
以前のエントリー*1で、netmap API を使ったアプリケーションを作成する方法やデータ構造についてとりあげました。今回は少しレイヤーを下げて、カーネルのどのような機能を使って、netmap API が作られているのかについてまとめました。Linux カーネルハッ…
netmap を使ったアプリケーションで、パケットの送受信を行う方法について、netmap で利用されるデータ構造と一緒にまとめました。 netmap API を使ったプログラミング netmap では socket と read( )/write( ) システムコールを使ったネットワーク通信が遅…
netmap のサンプルアプリケーションの bridge と、FreeBSD の IP ファイアーウォールのユーザー空間実装である netmap-ipfw を動かしてみます。netmap bridge を動かすnetmap bridge は netmap レポジトリの apps/bridge ディレクトリにあります。 この実装…
netmap の使い方について、学術的なコンセプトと一緒にまとめました。 インストールの方法から、基本となるパケット生成アプリケーションである、pkt-gen の使い方までについて書きました。 netmap とは? ピサ大学の研究グループ*1が開発しているパケット I…
ブログを開設しました。学んだ技術について書いていこうと思います。