1

カーネルの勉強の過程で、私は 2 つの質問があります。

1) カーネル Oops メッセージに表示されるアドレスが仮想アドレスか物理アドレスかを知りたいのですが? (CPUが仮想アドレス空間で動作し、MMUの再マッピングを行う限り、それらは仮想であるべきだと思いますか?)

2) 私のプラットフォームは ARM ベースで、MMU をサポートしていますが、カーネル モジュールのロード先のアドレスを調べると、次のように表示されます。

# cat /sys/module/mydrv/sections/.data
0xbf00b4f4
# cat /sys/module/mydrv/sections/.text
0xbf006000

これらのアドレスは、0xffffffffa0110000、0xffffffffa011b948 のようなものであるべきではありませんか? 私の理解では、仮想メモリアドレスはより大きく、したがってより大きな仮想アドレス空間を提供するはずです? 繰り返しますが、私は初心者であり、もちろん VM と MMU を完全には理解していません :)

コメントありがとうございます。

マーク

4

1 に答える 1

2

1) カーネル Oops メッセージに表示されるアドレスが仮想アドレスか物理アドレスかを知りたいのですが? (CPUが仮想アドレス空間で動作し、MMUの再マッピングを行う限り、それらは仮想であるべきだと思いますか?)

OOPS/panic スタック トレースに表示されるアドレスはすべて仮想アドレスです。

2) これらのアドレスは、0xffffffffa0110000、0xffffffffa011b948 のようなものであるべきではありませんか? 私の理解では、仮想メモリアドレスはより大きく、したがってより大きな仮想アドレス空間を提供するはずです? 繰り返しますが、私は初心者であり、もちろん VM と MMU を完全には理解していません :)

いいえ、新しい 64 ビット armv8 アーキテクチャを使用していない限り、32 ビット アドレスしか表示されないはずです :-) したがって、答えは、使用しているアーキテクチャと、3G/1G と 2G/2G カーネル分割を使用しているかどうかによって異なります。[ほとんどの Linux マシンは、カーネルが 4G アドレス空間の上位 1G (0xc0000000 - 0xffffffff) を占有し、プロセスが下位 3G (0x00000000 - 0xbffffffff) を使用するように構成されています。ただし、一部のマシンは 2G/2G 分割で構成され、カーネルは上位 2G (0x80000000 - 0xffffffff) を占有し、プロセスは下位 2G (0x00000000 - 0x7ffffffff) を使用します。カーネル構成 VMSPLIT_3G/VMSPLIT_2G がこれを設定していると思います]。

于 2012-10-19T18:25:02.847 に答える