x86におけるメモリアクセス権のルール

x86

定期的に忘れる気がするのでメモ.SDM Volume 3A 4.1.3, 4.6参照. 用語 supervisor mode access CPL < 3 でのアクセス user mode access CPL == 3 でのアクセス supervisor mode address page entryのU/S bitが一つでも0である領域*1 user mode addres super…

Ownership is theft? TockのTakeCellについて

tockというrust製の組み込み向けOSがあります. このtockの作成者らが2015年にOwnership is Theft: Experiences Building an Embedded OS in Rust (PLOS 2015)という論文を発表しました.そこでは著者がtockを開発する上で嵌ったownershipに関する問題と,そ…

cBPFプログラムをLLVM IRに変換する

最近Linuxでいろいろと大活躍のBPF (Berkeley Packet Filter)には主に2種類あって,一番最初に提唱されlibpcapなどで利用されるcBPF (classic BPF)と,主にLinux内で現在利用されている,cBPFをベースに拡張したeBPF (extended BPF)があります. cBPFのプロ…

LinuxのBPF : (5) eBPFによるLinux Kernel Tracing

eBPFによるカーネルトレース 一番最初に書いた通り,eBPFはLinuxのトレーサとして利用できます. カーネルがeBPFプログラムを実行する場合,BPFインタプリタにctxが渡されます(jit化されている場合も同様です). https://github.com/torvalds/linux/blob/v…

LinuxのBPF : (4) ClangによるeBPFプログラムの作成と,BPF Compiler Collection (BCC)

Clangを利用したeBPFプログラムの作成 eBPFへのコンパイル llvm IRの出力 eBPFアセンブリの出力 eBPFプログラムの出力 カーネルで動作するeBPFプログラムの例 skbuffからのロード eBPF mapの処理 BPF Compiler Collection (BCC) インストール bccによるプロ…

LinuxのBPF : (3) eBPFの基礎

はじめに(注意) extended BPF (eBPF) eBPF map eBPFプログラムの例 eBPFのmapの作成 eBPFプログラムの作成 eBPFフィルタプログラムの利用 setsockoptの挙動 JIT ソース まとめ はじめに(注意) ちょうど一年ぐらい前にLinuxのBPFについて記事を書いていま…

nomによるnumpyデータのパース

nom nomはrust製のパーサコンビネーターライブラリです. 個人的にはno_stdでの動作をサポートしてる点が嬉しいです. 今回勉強のためにnomでnumpyのファイル(のヘッダ)をパースしてみます. numpyのフォーマット 今回は以下のようにして作成したデータを…

[rust]ZST/DSTによるflexible array memberの実現

flexible array memberとは ZSTを使う方法 DSTを使う方法 flexible array memberとは flexible array memberとはずばり,C言語で以下のようなサイズ定義を持たない構造体メンバのことです(C99から標準). struct X{ size_t len; char value[]; } この構造…

rustで動的にバッファを確保する方法

Boxを使う Vecを使う std::heap::Allocを使う placement-in を使う mallocを使う 1. Boxを使う rustで動的にメモリを確保する方法といってまず思いつくのはBoxを使う方法だと思います.例えば,以下のようにすれば長さ1000のu8のバッファを確保できます. le…

rustをnostdで使う

nostdとは rustは他の多くの言語と同様,標準ライブラリ(std)が同包されており,通常はそれを使ってプログラミングをおこないます.しかしながら,stdの多くの機能はOSの機能を利用しているため,OSそのものを開発したいとか,あるいはOSが存在しない環境で…

rustのGUIライブラリconrodの使い方

所用でrustのGUIライブラリについて調べる機会がありました.特にこれといったGUIライブラリはまだないような気がします. 普段自分がネイティブなGUIアプリケーションを作成する場合はQtを使います.rustからQtを呼び出すのはいくつか試みがあって,disasse…

DPDKのmbufの構造

DPDKではパケットをmbufというデータ構造で管理しています. mbufについては http://dpdk.org/doc/guides/prog_guide/mbuf_lib.html にまとまっていますが,ここでは具体的なmbufの構成や使われ方についてみていきたいと思います. mempoolのおさらい mbufは…

DPDKにおけるメモリ管理

DPDKにおいてどのようにメモリが使用されるかをここにまとめたいと思います. なお,ここに書いてあるものはあくまで私がコードを読んで解釈した結果になります. DPDKのバージョンは17.05,OSはLinuxを対象としています. 全体像 DPDKでは独自のメモリアロ…

DPDKにおけるhugepageの初期化部分

DPDKはhugepageをデフォルトで利用しています.ここではDPDKにおけるhugepageの初期化部分についてまとめようと思います. OSはLinux , DPDKのバージョンはv17.05-rc2です. 初期化のおおまかな流れ librte_eal/linuxapp/eal/eal.c:rte_eal_init()がDPDKの基…

/proc/pid/pagemapの話

前回 /proc/pid/pagemap について簡単に触れたので,実際にpagemapを読み取るときどういうことが起きるか少し追ってみようと思います. /proc/pid/pagemapに関する操作はカーネルのfs/proc/task_mmu.c内でproc_pagemap_operationsに定義してあります. https…

仮想アドレスから物理アドレスを求める

××な理由で仮想アドレスではなく実際の物理アドレスを求めたいことがあると思います. linuxの場合,カーネルからならvirt2phys()等使えますが,ユーザランドからはそのような関数はありません. その代わり, /proc/self/pagemap を参照して解決することが…

I/O APICについて

前回LAPICについて書きました.LAPICは今ではCPU内に埋め込まれており,IntelのSDMにその使用方法が書いてあります.一方でI/O APICは今ではチップセットに埋め込まれているため,I/O APICに関して知りたい場合はチップセットのデータシートを見ることになり…

per cpu data シンボルのアドレス

kallsymsを見てみると,メモリ先頭のユーザ空間のアドレスにあるシンボルが複数存在していることが確認できます. % sudo cat /proc/kallsyms | head 0000000000000000 A irq_stack_union 0000000000000000 A __per_cpu_start 0000000000004000 A exception_…

X540のMSI-X設定

実際のデバイスでMSI-Xの設定の確認をしてみます. 今手元にX540があるので,それで実際に確認してみます. 文献 X540の仕様は以下から入手できます. Intel Ethernet Controller X540: Datasheet 7.3章にX540におけるMSI-Xについて書いてあります.また,9.…

MSI/MSI-Xとx2APIC

MSI (Message Signaled Interrupts) はPCI Technology Specificationが策定した,PCI/PCIeで利用される割り込み方法の一つです.最初から存在したpin-basedな割り込み(INTx割り込み)と比べ,MSIを利用する利点として以下が挙げられます. pin-base割り込み…

Local APICについて

APICは今のx86アーキテクチャで使用されている割り込みコントローラのことです.仕様は, Intel SDM 10章 などに書いてあります.以下,図はSDMから引用しています. APICは各コアごとに存在するLocal APICと,外部からの割り込みを担当するI/O APICに分かれ…

x86_64 Linuxでの仮想アドレス/物理アドレス

Linux Device Driver Chapter 15では Linuxで利用されるアドレスを以下の5種類に分類しています. User virtual address Physical address Bus address Kernel logical address Kenerl virtual address User virtual addressはその名の通りユーザプロセスが…

rustでCで書いた関数を呼ぶ / Cからrustで書いた関数を呼ぶ

rustからCの関数を呼ぶ方法(あるいは,その逆)は公式のドキュメント (https://doc.rust-lang.org/book/ffi.html)に書いてあるのでそれを読めばいいんで すが,自分で書いたCの関数を呼ぶ方法について直接は書いてないのでここに簡単に まとめてみます. ru…

cpuidでAVX2に対応しているか調べる

intelの以下のページに方法とコードが書いてあります. software.intel.com AVX2等は以下のCPUIDで調べることができます. CPUID.(EAX=01H, ECX=0H):ECX.FMA[bit 12]==1 CPUID.(EAX=07H, ECX=0H):EBX.AVX2[bit 5]==1 CPUID.(EAX=07H, ECX=0H):EBX.BMI1[bit 3…

LinuxのBPF : (2) seccompでの利用

seccompについて seccompのプログラム 特定のシステムコールのみ許可する libseccomp ここまでのまとめ 参考文献 seccompについて seccomp (Secure Computingの略らしい)は,Linuxにおいてサンドボックスを実現するために プロセスのシステムコールの発行を…

LinuxのBPF : (1) パケットフィルタ

はじめに BPFの基礎 BPFの構造 BPFでのフィルタリング レジスタマシン LinuxでのBPF BPFを利用したパケットフィルタリング libpcapとBPF ここまでのまとめ 参考文献 その他参考URL はじめに BPFはBerkeley Packet Filterの略で,1993年に効率的なパケットフ…

LaTeX-suite じゃない vim-latex を使ってvimによるLaTeX作成環境を整える

2017-1-7 追記 このページに今でも検索から辿り着く方がいるようなので追記. 以下で説明しているvim-latexですが,Latex-Suiteと名前が被っているということで2015年3月にvimtexに名称が変わりました. github.com それに伴い変数のprefixがg:latex_... = .…