XV6の入出力
inb, outb
◆入出力の方法
- CPU が持つ入出力命令を使うもの。 どのデバイスをアクセスするかは、ポート番号で指定する。
- 通常のメモリアクセスの命令を使うもの(memory mapped I/O)。 どのデバイスをアクセスするかは、番地で指定する。
x86ではポートマップドのIN, OUT命令セットが存在する。
Linux における入出力命令を使った入出力は、inb() と outb() で行われる。
outb(unsigned char value, int port) ポート番号 port に 1 バイトの value を出力する unsigned char inb(int port) ポート番号 port から 1 バイトの value を入力してその値を返す
x86では、IDEやUARTはinbやoutb命令で操作できるが(つまりポートマップドI/O)、MIPSやRISC-Vではそうはいかない。メモリマップに、これらのモジュールを定義しておかなければならない。 http://msyksphinz.hatenablog.com/?page=1461085200
xv6
オリジナル (port-mapped I/O)
/uart.c
void uartputc(int c) { int i; if(!uart) return; for(i = 0; i < 128 && !(inb(COM1+5) & 0x20); i++) microdelay(10); outb(COM1+0, c); }
/mips.h
static inline void outb(ushort port, uchar data) { asm volatile("out %0,%1" : : "a" (data), "d" (port)); }
xv6/uart.c at ff2783442ea2801a4bf6c76f198f36a6e985e7dd · guilleiguaran/xv6 · GitHub
nyuichi/xv6 (memory-mapped I/O)
/uart.c
uartputc(int c) { int i; if(!uart) return; while(*(int*)SERIALWE == 0) microdelay(); *(int*)SERIAL = c; }
/memorylayout.c
#define SERIAL 0x80001000
https://github.com/nyuichi/xv6/blob/94d02ecb2b9492365574f2166cf29ce5a170abf5/uart.c#L34
nullpo-head/xv6-mips (memory-mapped I/O)
/uart.c
#define COM1 0x3f8 ..... ..... void uartputc(int c) { int i; if(!uart) return; for(i = 0; i < 128 && !(inb(COM1+5) & 0x20); i++) microdelay(10); outb(COM1+0, c); }
/mips.h
static int io_port_base = 0xb4000000; ..... ..... static inline void outb(ushort port, uchar data) { *((uchar *) (io_port_base + port)) = data; }
GitHub - nullpo-head/xv6-mips: A MIPS port of xv6
呼び出し
console.printf() --> console.consputc(c) --> uart.uartputc(c) --> uart.cgaputc(c)
WIP ハードウェア資源は足りる?
MIPS/LinuxがDE-10 Liteで動くかという問題
- 出力:
- メモリ:
特にディスプレイ出力どうするの
ttyとpts
わかりやすい。
より実装よりの図解とか。
kernelのconsole設定
http://archive.linux.or.jp/JF/JFdocs/Remote-Serial-Console-HOWTO/configure-kernel.html
JF: Linux Kernel 3.x/2.6 Documentation: serial-console.txt
initとgetty
http://www.gcd.org/sengoku/docs/NikkeiLinux01-03.pdf
Linux/MIPS のFDC
Fast Debug Channel - LinuxMIPS
[PATCH 7/9] tty: Add MIPS EJTAG Fast Debug Channel TTY driver
MIPSアーキテクチャ上にLinuxを初期インストールするには「ブートローダ」が重要
とりあえず、既存のMIPS CPUリポジトリを使ってFPGA実機でLinux動作させようと思ったが...
Q. そもそも、LinuxカーネルイメージをFPGA(上のMIPS CPU)に転送しても、どうやって起動(or インストール)するのだろう?
A1. ブートローダが鍵になるっぽい。
xv6のテキストAppendix-B "The Boot Loader" を翻訳しました - FPGA開発日記
パタヘネ本には特にブートシーケンスの説明はなかったから、あくまでプロセッサ側は愚直にProgramCounterに従って命令を実行するのみで、ブートローダ自体はソフトウェア層で実装するもの、という理解。
U-Boot
- serial console support
- integrated shell alike setup interface
- optional password protectection and timeout for acces to setup interface on boot
- editable configuration space
- downloads software trough tftp servers
- flash routines for EEPROMS of misc technology including NANDs
- runs test applications directly
- boots Linux
http://blog.techlab-xe.net/archives/4208
Linux Boot sequence on MIPS??
Re: Linux Boot sequence on MIPS??
ブートローダもCPUアーキテクチャに依存する
http://www.cqpub.co.jp/interface/sample/200511/if0511_chap1.pdf
YANONやU-BootというのはMIPSアーキテクチャに対応したOSSブートローダ、といった位置づけだろうか。
initramfsとは
第384回 Initramfsのしくみ:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
カーネルはブートローダーによって起動されたあと,ルートファイルシステムをマウントするために,サポートしているすべてのディスクデバイスのドライバを持っている必要があります。
しかしながらこのドライバをすべてカーネルに組み込んでしまうと,カーネルが肥大化してしまいます。しかもそのほとんどは,今使っているディスクデバイスでは不要なドライバです。必要なドライバを必要に応じてロードする仕組みとして「カーネルモジュール」がありますが,今度はその「カーネルモジュール」をどこに保存するのかという問題が発生します。当然のことながら,この時点でルートファイルシステムにはアクセスできません。
そこで出てくるのが「Initramfs」という仕組みです。
Ubuntuに限らずほとんどのLinuxディストリビューションでは,「ミニルート」とも呼ばれるメモリ上に展開可能な,小さなサイズのルートファイルシステムを持っています。「Initramfs」は,現在はデスクトップLinuxでもっとも使われているミニルートのファイルフォーマットの1つです
機械学習(サポートベクターマシン)でBitcoin相場を予測する
scikit-learnを使って勉強中