livaの雑記帳

livaの雑記帳

OSとか作ってみたい

qemuのNVMeが微妙なlegacy割り込みをする話

uio_pci_genericで割り込みが取れない時に確認すべきことってなんなんだ...。OSレベルまでIRQが届いていることは /proc/interrupts で確認できたんだけど…。(もう2日くらい悩んでる)— hikalium (@hikalium) 2017年12月8日 こんな呟きを見かけたので、原因…

USB3.0のデバドラを書いてみた

ザ!車輪の再発明!!って感じですが、いつものごとく懲りずにやってます。 3ヶ月くらい、ありとあらゆる事を放り出してずっとUSBのデバドラ書いてたのですが、途中ソウルジェムを濁らせたりしながらも、ようやく動いたのでブログに書いて供養しようと思い…

uio_pci_genericでデバドラを書く<その3>

その2はこちら。 今回は厳密にはuio_pci_genericの話ではないのだけども、uioでデバドラを書く上で必須となるであろうお話。 当たり前だけど、DMAができないと多くのデバドラは書けない。 DMAするためには良さげなページと物理アドレスが欲しいですよね。 …

uio_pci_genericでデバドラを書く<その2>

その1はこちら。 今回はxHCIのレジスタ空間を触ってみる。 参考になるのは、DPDKのソースとか。 前回やった通り、PCIのレジスタ空間は/sys/class/uio/uio0/device/configをopenしてread/writeすれば良かったのだが、BARが指すPCIデバイスのレジスタ空間につ…

uio_pci_genericでデバドラを書く<その1>

男もすなるuioといふものを、女もしてみむとてするなり。 uio、流行ってますね。というか、今時Ring0でデバイスを制御しても新鮮味がないです。 なのでuioを使ってパパっとデバドラを書けるようにならなきゃなぁ、というぼんやりとした焦りを感じていたので…

Toy OS meets Rump Kernel

Raphine(僕の自作OS)上でRump Kernelを立ち上げる事ができるようになった。 Rump Kernelとはなんぞやという話を簡単にすると、 NetBSDベースのLibraryOS NetBSDのカーネルとアプリケーションをstatic linkして1つのバイナリにできる。(Unikernel) Linux…

c++でfinalつけれる時はつけよう、という話

仮想関数を使うとvtableを呼び出すからオーバーヘッドが生じるのは当たり前の話。だから仮想関数にしなくて良い時は仮想関数を使いたくない。 一方で、インタフェースを明示するためには仮想関数を使わなければいけない。インターフェースをソース内で明示し…

雑記(4月〜7月)

xv6、kernelmemfs使えばオンメモリで動くのか #liva_notebook— Liva (@liva_jy) 2017年4月26日 新マシンで動作検証した結果、見つけた新しいバグ。PCIの初期化をACPICAの初期化後にやろうとすると、ACPICAがPCIを叩いて死ぬっていう。 #liva_notebook— Liva …

Unikernelのすゝめ

以下の記事を読んだ。Single address spaces: design flaw or feature? UnikernelというとMirageOSの論文で最初に出てきた概念で、Rump KernelにもUnikernelで動かすモードがあるのだけど、今回はRump Kernelの事は忘れて、本来のUnikernelの話。(このリポ…

Rump Kernelを実機で動かす

Unikernelをまだ動かしてなかったので、動かす。 ↓これ通りにやれば良い。 Tutorial: Building Rumprun Unikernels · rumpkernel/wiki Wiki · GitHub $ git clone http://repo.rumpkernel.org/rumprun$ cd rumprun$ git submodule update --init$ ./build-rr…

Rump Kernelの起動コードを読む

Rump Kernelのソースコードを読んでいく。 unikernel版(?)で、platformはhw(ベアメタル上で動作する版) ベースとなるコードはここ。 GitHub - rumpkernel/rumprun: The Rumprun unikernel and toolchain for various platforms 僕はアーキテクチャspecific…

Rump Kernelを触った備忘録

いろいろ思う所があって、Rump Kernelを触っている。 Rump KernelはNetBSDベースのlibrary OS(詳しくはおるみんさんの記事を参照)で、2つの使い方がある。 ・basic Rump Kernel (何か公式の呼び名があるのだろうか?) NetBSDカーネルをserverとして立ち…

LinuxのCPU hotplugについて調べてみる。

諸事情によりLinuxのCPU hotplugについて調べてみたくなったので。 とりあえず試してみたいので、やり方を調べた。 NAKAMURA Minoru's Diary (2006年3月) 要するに、rootで以下のようにすれば良いとの事。 # echo 0 > /sys/devices/system/cpu/cpu1/online /…

multibootカーネルにおける画面描画

multiboot specification(このブログでは全てv2を指す)に則ってカーネルを作るとブートローダ周りの諸々を手抜きできるのだけど、今回は特に画面描画辺りのHowToを軽くまとめておく。 最初にmultiboot specificationのおさらいをしておくと、 elfでカーネ…

UEFI対応(その2)

これの続き pf2フォントの解析ができたので、UEFIからブートしようと頑張る。 ACPICAの初期化でクラッシュするので原因究明 UEFI環境下(qemu with OVMF)でACPICAの初期化で落ちる気がするんだけど、ACPICAの問題なのか、それとも移植の問題なのか・・・(8割…

自作OSにおけるUEFI対応戦略

たまにはtwitterのまとめじゃなくて、ちゃんとした記事でも。 自作OS界隈でUEFI流行ってるというか、なんかUEFIすごーい!って崇めてる人が多いようなのでその雑感。 UEFIとは 最近主流のブートファームウェア。BIOSの高機能版。 最近のUEFIマザーは大体BIOS…

grubのpf2ファイルの解析

UEFIサポートによりフレームバッファにテキストを描画しなければならなくなったので、grubのpf2ファイルを使って描画する事にしてみた。 UTF-32ってのが良い。vga/textだとasciiしか描画できない。 pf2ファイルのCHIXエントリ内にあるoffsetはたぶんファイル…

UEFI対応(その1)

諸事情により、UEFIに対応したい。 現状grub-pcからのmultiboot2仕様による起動なので、grub-efiに載せ替えれば動くだろと思ったら動かなかった。 gdiskをスクリプトから使う時はsgdiskが便利 #liva_notebook— Liva (@liva_jy) 2017年4月2日 とりあえずこの…

自作osでlinuxのhello worldバイナリを動かす

elfのロードまではできているので、実際に実行して、linuxシステムコールを処理する云々の話。 newlib static linkしたelfを実行するといきなりdup2が呼ばれる。かつ呼び出した関数がunameらしい。とりあえずソース特定せねば #liva_notebook— Liva (@liva_j…

自作OSにUSBを実装する

はじめに この記事は自作OSでUSBキーボードを実装しようとして半年くらい四苦八苦していた経緯の備忘録です。時系列で書いてくので、読みにくかったらごめんなさい。 USB周りの経験値がゼロな状態から実装した結果、遠回りやら勘違いやらいろいろしているの…

I/O APICのEOIが動かない

お、IOAPICのEOI registerの実装が入ってたのか、これは最新版を使うしかあるまい https://t.co/09mUxTV4NG #liva_notebook— Liva (@liva_jy) 2017年3月19日 正直に言うと、EOI registerを使わない手法がバグってる #liva_notebook— Liva (@liva_jy) 2017年3…

雑記(3月)

忘れないようにメモ #liva_notebook https://t.co/e1pabD3HJ3— Liva (@liva_jy) 2017年3月19日 今日のデバッグでdeassertされないPCI割り込みによって無限に割り込みが発生するバグが再発してしまったので、ついでにそれも修正してしまう #liva_notebook— Li…

USBキーボードのデバッグ

ここ最近USBの実機テストを行ってきたのだけど、今日もその続き #liva_notebook— Liva (@liva_jy) 2017年3月19日 USBキーボードからのパケット(実機)、1つのキーを押している時はTransfer Descriptor内にキーデータが入らない(1つ処理されて割り込みは…

2017/3

書き溜めた知見(というよりは独り言)を転記 3/18 割り込み周りのデバッグをする場合は、HPETを使おう HPETならFSB割り込みとI/O APIC経由の割り込みの両方をサポート FSB割り込みはPCIeのMSIのデバッグに使える PCIで割り込みが出ない場合、デバイス(PCI…

自作OSに10GbE NICを移植する

(この記事は古いサイトから移行したものです) Raph Kernelでintel X540-T2を動かすために、slank君と一緒にixgbeドライバを実装しました。 10GbEってのはやはり夢がありますね。ボトルネックを筋肉で解決する感じの脳筋プレイ、嫌いじゃないです。大艦巨砲…

2016/8

書き溜めた知見(というよりは独り言)を転記 8/28 cpuid 1における謎な例外発生は単純なプログラミングミスだった。関数ポインタのポインタでコールバック呼び出しをしていたのだけど、実体となる関数ポインタ変数自体がスタックに置かれているので、そのポ…