カーネルモジュール作成によるlinuxカーネル開発入門 - 第四回 リスト

はじめに 本記事は第三回の続きです。前回までの記事を既に見ていることが前提です。 今回はカーネル内の代表的なデータ構造であるリストについて学びます。その過程で、カーネル内においてメモリを動的に割り当てる方法についても学びます。 リストの構造 …

科学実験のようにスケジューラの挙動を観測する

はじめに 本書の主な対象読者はlinuxを含むOSのプロセススケジューラについて聞いたことがない人や、名前は知っているけど具体的に何をするものかをよく知らない人です。 linux kernelは複数プロセスを同時に動作させる(正確にはさせているように見せかける)…

ソフトウェアのサポート業務とはどのようなものか

はじめに ソフトウェアの世界にはいろいろな仕事があります。何も知らない人から見て一番脚光を浴びがちなのが開発者、とくにプログラマーでしょう。スーパープログラマーを題材とした漫画やアニメ、映画はたくさんあります。しかし、それ以外の仕事は実際や…

たのしく学ぶLinuxカーネル開発(第一回): `rm -rf /`実行時にカーネルパニックさせる

はじめに Linuxカーネル開発を学ぶためにhello worldモジュールからはじめて少しづつ強化する記事を過去にいくつか書きました。これはちゃんとやれば身に付くことは身に付くのですが、非常に地味なので、よほどカーネルに興味を持っている人以外には退屈でし…

自作OSとかLinuxカーネルについて役立った本

はじめに なんらかの理由によってOSやOSカーネルに興味を持つ人は多々います。しかし、その次のステップとしてどんな本を読めばいいんだろうと思っている人はこれまたいっぱいいます。そこで、長年Linuxカーネルにかかわってきた筆者がこれまでに読んでよか…

システムを一時的に停止させるカーネルモジュール

はじめに システムを一時的に停止させるstop-machineというカーネルモジュールを紹介します。ソースはここにあります。使いかたはREADMEを見てもらえればわかります。 Ubuntu 18.04上でlinuxカーネル4.18.0-18-genericを起動させた状態で動作検証をしました…

なんでもかんでも「バグ」ってひとくくりにしないで

はじめに プログラマがソフトウェアを作るとユーザがつきます。ユーザがそのソフトウェアを使っていて何らかの問題が発生すると「このソフトはバグってる、直して!」と言われることがままあります。それに対して「いや、仕様だから」と突っぱねられることが…

APIとかABIとかシステムコールとか

はじめに 本記事はLinux環境における次のようなことをざっくり理解するための記事です。 Application Programming Interface(API)って何? Application Binary Interface(ABI)って何? システムコールとAPIとABIの関係って? それぞれ何がどう違うの? この手の…

linuxカーネル内部インターフェースの変更例

はじめに Linuxカーネル(以下カーネルと表記)の外部ユーザ空間とのインターフェースはシステムコールが増えることはあっても既存のものが変更されることはほとんどなく、極力互換性が保たれるようになっています。しかしカーネル内部のインターフェースはめ…

Socionext SC0FQAA-BはNUMAか否か

はじめに 本記事はLinuxのプロセススケジューラから見たSocionext SC2A11の続きです。Socionext SC0FQAA-B(以下「本マシン」と記載)は24コアのSC2A11を1つ搭載しています。このマシンがNUMAかどうか、言い方を変えるとSC2A11内の各コアがすべてのメモリに等…

Ryzen1800xでキャッシュのスラッシング

ほそく 2019/2/19 追記: 当初"false sharing"と書いていたのはすべて誤りで実際は"キャッシュのスラッシング"でした。すいません。 はじめに 本記事は、AMD社のRyzen1800x(以下1800xと記載)においてキャッシュのスラッシング(以下スラッシングと記載)が発生…

WSL vs VM for 開発作業

はじめに 本記事はLinux Advent Calendar 2017の最終日、25日目の記事です。 みなさんはWindows Subsystem for Linux(WSL)というWindowsのソフトウェアをご存知でしょうか。これはUbuntu, openSUSE, あるいはSUSE Linux Enterpriseという3つのLinux distribu…

brd: メモリ上に作成するブロックデバイス

はじめに 本記事はlinuxにおいてメモリ上に作成するブロックデバイスであるbrdというカーネルの機能について説明します。 用途 ブロックデバイスを直接しようする各種ファイルシステムやDB、partedなどのパーティショニングツールのテストが主な用途でしょう…

Goでdirect I/O

はじめに 本記事はGoでlinuxのdirect I/Oを使う方法について書いたものです。A Tour of Goを全部終えた人なら読めると思います。 ソフトウェアバージョン OS: Ubuntu 16.04 kernel: 4.4.0-83-generic go: 1.9 きっかけ Linuxのdirect I/Oは、read/write時用…

Windows Subsystem for Linuxとguest/native Ubuntuの性能をざっくりと比較

(2017年12月25日注) 本記事より新しいバージョンのWindowsについての類似記事を書きましたので、本記事のかわりにそちらをごらんください。 はじめに わたしの手持ちのノートPCにはWindows10が入っています。もっぱらWindows Subsystem for Linux(WSL, いわ…

ASLRとKASLRの概要

はじめに 本記事はlinuxに存在する1Address Space Location Randomization(ASLR)、およびKASLR(Kernel ASLR)という、やたら長い名前のセキュリティ機能を紹介するものです。メモリアドレスの概念やC言語ポインタが理解できれば読める内容だと思います。 ASLR…

カーネルの観点から見たLinuxKit

はじめに Docker社はDockerCon2017において、Dockerコンテナの実行にフォーカスした軽量Linuxである、LinuxKitをリリースしました。 以下関連URLです。 Docker、「LinuxKit」を発表。コンテナランタイムのためだけにゼロから開発されたセキュアなLinux Subsy…

壊れたパッチと、その対処方法

はじめに 本記事は、何らかの理由によってパッチの内容が壊れてしまう理由と、その対処方法について述べます。IT系に限っても「パッチ」という言葉には様々な意味がありますが、本記事で言うパッチとは、diffコマンドやgit format-patchなどによって作成した…

linux kernelのコードネームは無視していい

Linux Kernelにはバージョン名(本記事執筆時点では4.x)に加えてコードネームが存在します。Linux 4.10-rc6 Released, Now Codenamed The "Fearless Coyote"のように、記事のタイトルにコードネームを持ってきたり、コードネームが記事の中に記載されたりする…

カーネルモジュール作成によるlinuxカーネル開発入門 - 第三回 デバッグ用インターフェース

はじめに 本記事は第二回の続きです。前回までの記事を既に見ていることが前提です。 今回は、今後凝ったカーネルモジュールを作るにあたって必要になってくる、デバッグに有用なdebugfsというファイルシステムについて学びます。debugfsはカーネルとユーザ…

bashの組込みコマンド自作によるスクリプトの高速化

はじめに bashには次の2つの理由によって、組み込みコマンド(builtin command)というものが存在します。 スクリプトの高速化のため。組み込みコマンドであれば通常のコマンドを実行する場合に比べてプロセスの生成コスト(fork()/exec())が削減できる bash自…

他人の書いたソフトウェアのバグへの対処例

はじめに 本記事は、他人の書いたソフトウェアのバグに遭遇したときにどうするかという流れを、実例を基にして、ストーリー仕立てでなるべく具体的に書きました。このようなときの対処に不慣れな人に、実際のデバッグ、バグレポート、および修正案の提出まで…

カーネルモジュール作成によるlinuxカーネル開発入門 - 第二回 一定時間後に処理をする(タイマー)

はじめに 本記事は第一回の続きです。前回までの記事を既に見た上で開発環境ができていることを前提としています。 前回書いたコードはモジュールをロードした時とアンロードしたときだけ動いていました。今回は、ある時点から一定時間後に所定の処理をする…

カーネルモジュール作成によるlinuxカーネル開発入門 - 第一回 hello world

はじめに 本記事の内容はUbuntu16.04でのみ確認しています。同名の電子書籍においてはUbuntu 18.04に対応しています。 本記事の目的は、linuxのカーネルモジュール(以下カーネルモジュール)というものの作成を通じてlinuxカーネル(以下カーネル)の開発に最低…

お手軽Linuxカーネル開発/自動テスト

はじめに これはLinux Advent Calendar 2016 14日目の記事です。 本記事では、ワンコマンドでお手軽にlinuxカーネル開発/自動テスト環境を構築する方法を紹介します。その後開発、自動テストの流れについてもチュートリアル形式で紹介します。本記事ではelkd…

スクリーンキャストを採取する簡単なbashスクリプト

はじめに 既存の単純なコマンドを組み合わせてスクリーンキャストを採取する方法を紹介します。 git repoはここです。本体は高々20行のbash scriptであるsimple-screencast1つだけです。 実行環境と必要なパッケージ 2016/12/04時点での最新のdebian testing…

GNU linker scriptでhello world

はじめに みなさんはGNU linker(以下ld)やlinker scriptという言葉をご存知でしょうか。組み込み系のかたやOS屋さん以外のかたにとっては、直接使うものではないので、馴染みのないものだと思います。ldの役割は、皆さんが書いたソースファイルからコンパイ…

LinuxにおけるOOM発生時の挙動

はじめに これはLinux Advent Calendar 2015 3日目の記事を2016/2/2に編集したものです。 Linuxにおいてシステムの物理メモリが枯渇したOut-Of-Memory(OOM)という状態になった際の挙動について説明しています。OOMに関連が深いsysctlパラメタを紹介するとと…

linux kernelのmakeターゲットについてのあれこれ

はじめに 本記事は、Linux Advent Calendar 2014 7日目の記事を2016/2/2に編集したものです。linux kernelをビルドする際に使用するmakeのターゲット(以下"makeターゲット"と記載)について、よく使われる便利なもの、面白いもの、小咄などの紹介を目的としま…

linuxのstable kernel reviewに参加してみませんか

はじめに この文書は2013 Kernel/VM Advent Calendarの2日目のために書いたものを2016/2/2に編集したものです。 Linux の stable kernel というカーネルのリリース作業、およびそれに関わると、何がいいかということを説明します。自分がかつて2年ほどこの作…