CentOS7.9 で io.Copy がハングする:splice システムコールと古い Linux カーネルの相性問題

事象の概要 Go 1.21.0〜1.21.4 でコンパイルした TCP プロキシが CentOS 7.9(カーネル 3.10.0)上で動作中、io.Copy が永遠に戻らなくなるケースが発生しました。 原因は net.TCPConn.ReadFrom が内部的に使う splice が SPLICE_F_NONBLOCK フラグを失ったことで、ノンブロッキング動作が無効になり、古いカーネルでブロックしていたためです。 Go 1.21.5 で該当フラグが ...

7月23日 22:50 投稿

epoll のカーネルソースを読むための準備

はじめに epoll は Linux カーネル 2.6 で導入された I/O イベント通知機構で、select(2) や poll(2) の代替として利用されます。本記事では、epoll のソースコードを読む前に理解しておくべき基礎知識を整理します。 従来の I/O マルチプレクサの問題点 select(2): 最大 1024 個のファイル記述子しか扱えず、毎回ユーザ空間とカーネル空間の間でデータをコピーする必 ...

6月7日 16:24 投稿

Linux platform デバイスドライバの設計と実装

Linux カーネルにおけるデバイスドライバは、モジュール性と再利用性を高めるために「分離」と「階層化」の設計原則に基づいて構築される。特に、I2C や SPI といったバスに接続されるデバイスだけでなく、SoC 内蔵のペリフェラル(例: GPIO、タイマ、UART など)に対しても、統一された抽象化フレームワークが必要となる。そのため、Linux は物理的なバスを持たないデバイ ...

5月28日 01:16 投稿