割り込みがうまくいかない。

キーボード割り込みのみを有効にした状態で、キーを押すと以下の画像のように

一瞬画面がおかしくなり、正常な関数が呼ばれない。

本来、呼ばれるはずの関数ではCLI命令(CPUレベルで割り込みを禁止する命令)が呼ばれるため、それ以降、割り込み自体が起こらなくなるはずなのに相変わらずキーを押すたびに画面がおかしくなるのでおそらく呼ばれるはずの関数は呼ばれていないと考えた。

f:id:m011501945:20190611024201g:plain

割り込み発生時

割り込みは、GDTとIDTの設定が間違っていなければ少なくとも割り込みベクタ番号に対応した関数は呼ばれるはずである。

そこでデバッグをした軌跡を以下に続ける。

まずqemuでGDTRレジスタとIDTRレジスタにどんなアドレスが入っているか調べた。

f:id:m011501945:20190611024959p:plain

GDTとIDTが設定されている。

GDTは0x1041a0、IDTは0x104200というアドレスが設定されていることが分かる。

まずはGDTから見てみる。

f:id:m011501945:20190611025140p:plain

GDTのアドレスからバイナリダンプ

1041a0からの8バイトはnullディスクリプタ、続いての8バイトがカーネルのコードディスクリプタ、その次の8バイトがカーネルのデータディスクリプタである。

カーネルのコードディスクリプタはベースアドレス0で大きさが0xffffである。

つまりメモリ全体をコードディスクリプタとしている。データセグメントも同様。

おかしいところは無いように思う。

4つ目は気にしないで頂きたい(デバック中の名残)

 

次はIDTを見てみる。

f:id:m011501945:20190611025735p:plain

IDTのバイナリダンプ

0x104200からIDTは始まっているが、そこは割り込みベクタ番号0から31までの設定なので気にしなくて良い。

割り込みベクタの32番の設定が104300から8バイト、33番の設定が104308から8バイトでされている。

32番はタイマ割り込み、33番がキーボード割り込みである。

今は、キーボード割り込みしか受け付けないようにしているため32番は気にしなくて良い。

セグメントセレクタは0x08、つまりカーネルのコードディスクリプタを指している。

33番の設定をみると割り込みハンドラは0x100938をコールするようになっている。

f:id:m011501945:20190611030501p:plain

0x100938の関数

上の画像はカーネルマップで見た0x100938に配置されている関数である。名前がタイマ割り込みとなっているが、実際はCLIする関数である。

本当に困った。

私の目からはちゃんと設定されているようにしか見えない・・・。

他にどのような原因があるでしょうか?

もしかしたらここが変な可能性あるとか思いついた方いましたらご教授お願いします・・・。

f:id:m011501945:20190611031449p:plain

そのほかの情報

上の画像ではちょっとGDTとIDTが変わってしまっているが多分問題ないです。

コンパイルしたらちょっと変わっただけです。

またコンパイルは-O2というオプションで最適化してコンパイルしている。

 

 

以下は使っているリンカスクリプト

SECTIONS
{
. = 0x100000;
.text :
{
_text_start = .;
*(.text)
_text_end = .;
}

.rodata :
{
_rodata_start = .;
*(.rodata)
_rodata_end = .;
}

.data :
{
_data_start = .;
*(.data)
_data_end = .;
}

.bss :
{
_bss_start = .;
*(COMMON)
*(.bss)
_bss_end = .;
}
_end = .;
}

自作OSでの謎(メモリマップ取得)

0xe820機能でメモリマップを取得するとbiosがメモリの予約領域やフリー領域を教えてくれるが、そのメモリマップは連続ではない。(一部は連続してたりする)

例えば、取得するマップの1要素目のベースアドレスが、0x0で長さが0x100 だとしよう。 2要素目のベースアドレスは0x100で長さが0x200だとしよう。

これはメモリの領域が連続している。

初めは0番地から100番地分の情報をくれたので、次は100番地から200番地分の情報を教えてくれた。ここまでで、0番地から300番地までの情報を知ることができた。

次の3要素目は300番地から何番地分の情報を教えてくれるのかなーと期待していると

急に500番地から100番地分の情報を教えてきたりする。

300番地から500番地までの200番地分のメモリ空間は一体なんなのだろう

とりあえず物理メモリ管理では予約領域として使えないようにしておいたが・・・

あの領域は何なのか知っている人いれば教えて頂けると嬉しいです。

 

 

 

you are trying to add a non-nullable field が出た時。

you are trying to add a non-nullable field はdjangoですでに作成しているDBのテーブルのスキーマを変更しようとすると出るはずです。

class User(models.Model):

         user_firstname = models.CharField(max_length=40)

上記のテーブルを作成します。

その後、これを変更して

class User(models.Model):

         user_firstname = models.CharField(max_length=40)

         user_lastname = models.CharField(max_length=20)

このようにします。これをmakemigrationsするとタイトルのエラー?が出ます。

エラーというより聞かれているだけなのですが、要はuser_firstnameしか無かった時に登録されたレコードにuser_lastnameが追加されるけどその値はどうする?と聞かれています。(ちなみにレコードを1つも登録していなくてもこれは聞かれます。)

解決するにはデフォルトを設定してあげるか、nullを許可すれば解決します。      user_lastname = models.CharField(max_length=20,null=True)

または、

user_lastname = models.CharField(max_length=20,default=ここは自分の好きなデフォルト値)

こんな感じで設定すると大丈夫です。

 

virtualboxとDocker for windowsを共存させてしまってvirtualboxのインスタンスが起動しなくなった場合。

はい、やらかしました。

もともとvirtualboxが入っているpcにdocker入れてしまってvirtualbox起動しなくなりました。

これの解決策書きます。

まず、仮想化支援機能をBIOS画面から無効にしてから再起動。そのあともう一度BIOSから有効にします。

次にwindowsのコントロールパネルからプログラムを選んでwindows機能の有効化無効化を選択する。一覧からHyper-Vチェックボックスを外して再起動。

virtualboxを再インストールしてインスタンス立ち上がるか検証。だめなら、そのインスタンスの設定が32bitに変更されてないか確認。されてたら64bitに戻す。

 

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied

djangoでこのエラーが出た時は自分でカスタムユーザーを再定義した場合に起こることが多いようです。

自分もよく分かっていないのですが、先にadminのデータベース設定が適用されてしまうことが原因なのかな?

とりあえず解決策だけ書いておきます。

プロジェクトのsetting.pyのINSTALLED_APPSの中のdjango.contrib.adminをコメントアウトしてからmakemigrationsしてmigrateしてください。migrateしたら先ほどのコメントアウトを外して元に戻してください。

INSTALLED_APPS = [
...
#‘django.contrib.admin’,
...
]

docker-composeをインストールする際のエラー unexpected token 'newline' 予期しないトークン

環境 ubuntu14.04

 

curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s-uname -m` -o /usr/local/bin/docker-compose

↑のコマンドを実行したと思いますが、下のようにして実行し直すと治ります。

curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose

 

上のコマンドではhtmlをダウンロードしてきてしまいます。

下のコマンドでバイナリを持ってきましょう。