Linuxカーネルの浮動小数点演算のサポートに関する簡単な説明

Linuxカーネルの浮動小数点演算のサポートに関する簡単な説明

現在、ほとんどの CPU は浮動小数点ユニット (FPU) をサポートしています。FPU は、プロセッサ コアの外部に独立したコプロセッサとして配置されます。ただし、組み込みプロセッサでは浮動小数点演算はほとんど使用されないため、一部の組み込みプロセッサでは浮動小数点コプロセッサが削除されています。

X86 プロセッサには通常 FPU が搭載されています。ただし、ARM PPC MIPS プロセッサには FPU がありません。

Linux カーネルが浮動小数点演算を処理する方法については、FPU のあるプロセッサとないプロセッサの観点から説明できます。

(以下は私の個人的な知識のまとめです。あまり調べたわけではありません。間違いがあれば指摘していただき、一緒に学んでいただければ幸いです。)

1. FPU搭載プロセッサの場合

1 Linux カーネルの場合、カーネル自体はデフォルトで -msoft-float オプションでコンパイルされ、デフォルトでソフト浮動小数点プログラムとしてコンパイルされます。ソフト浮動小数点とは、gcc コンパイラが浮動小数点演算 (glibc ライブラリによって提供) をシミュレートし、浮動小数点演算コードを固定小数点演算に置き換えることを意味します。

FPU を搭載したプロセッサの場合、通常は arch/xxx/Makefile にあるコンパイル オプション -msoft-float を削除できます。カーネルをハード浮動小数点としてコンパイルする、つまりプロセッサの浮動小数点命令で浮動小数点を計算させる。

ハード浮動小数点演算は、シミュレートされた固定小数点演算よりも確実に効率的です。 (カーネルコードには通常浮動小数点演算がないので、効率は大きく影響を受けません)

2 カーネル上で実行されるアプリ、特に浮動小数点演算を多く含む QT などのグラフィックス プログラムの場合、プロセッサが浮動小数点演算と浮動小数点演算命令をサポートしているため、直接コンパイルできます。

2. FPUのないプロセッサの場合

1 Linux カーネルの場合、コンパイル時にデフォルトで -msoft-float オプションが使用され、プログラムはデフォルトでソフト浮動小数点プログラムとしてコンパイルされます。Linux カーネルのコンパイルはライブラリのリンクに依存せず、カーネルは対応するシミュレートされた浮動小数点 ABI を実装します。

2 カーネル上で実行されるアプリの場合、浮動小数点演算を処理する方法は 2 つあります。

(1)カーネルはソフト浮動小数点をシミュレートします。

アプリケーションは、ハード浮動小数点を使用して直接コンパイルされます (コンパイラは、デフォルトでハード浮動小数点プログラムにコンパイルします)。

カーネルに関しては、私が知っている PPC MIPS プロセッサはすべて、特別な浮動小数点演算例外処理を備えています。プログラムが浮動小数点命令に遭遇し、浮動小数点命令を実行できない場合、ハードウェアは対応する割り込み例外を生成します。カーネル浮動小数点例外ハンドラは、命令の内容に基づいてソフト浮動小数点シミュレーション演算を実行し、演算結果を返してから、実行をユーザー空間に戻します。

ARM の場合、例外導入で浮動小数点計算の例外エントリは見つかりませんでしたが、カーネルはソフト浮動小数点もサポートしています。

ARM Linux カーネルを構成する場合、次の構成が表示されます。

 メニュー「浮動小数点エミュレーション」
 コメント「少なくとも 1 つのエミュレーションを選択する必要があります」
 設定 FPE_NWFPE
  ...

これは、カーネル内のシミュレートされた浮動小数点プロセッサを構成するために使用されます。

ARM が例外シミュレーション ソフト浮動小数点のサポートをどのように実装するかについては、時間があるときに arch/arm/nwfpe のコードで具体的な実装を注意深く読む必要があります。

この方法の利点は、アプリケーションを再コンパイルする必要がなく、カーネル内で浮動小数点シミュレーションをオンにするだけで済むため、非常に便利であることです。

しかし、欠点も明らかです。浮動小数点演算ごとに割り込み例外がトリガーされ、ユーザー空間とカーネル空間が切り替わり、実行効率が低すぎます。

(2)ソフト浮動小数点を使用してアプリを再コンパイルする

これにより、上記の問題を回避できます。アプリをコンパイルするときに、glibc ライブラリに接続する必要があります。--msoft-float を使用して、固定小数点演算の代わりに glibc のシミュレートされた浮動小数点を使用します。これの利点は、実行パフォーマンスが向上することです。

しかし、欠点は、異なるコンパイルオプションの使用により、使用されるABIが変わる可能性があることです。ライブラリまたはアプリケーションが同じコンパイルオプション(異なるABI)を使用しない場合、

システムの実行中に予期しない状況が発生し、クラッシュする可能性もあります。

PPC プロセッサの最近のデバッグ記録によると、カーネルは正常に起動し、コンソールに入りましたが、特定のアドレスで停止しました。ユーザー空間には浮動小数点演算が多数ありました。IC を照会したところ、FPU が削除され、プロセッサの浮動小数点例外が有効になっていないことが判明しました。

この方法では、浮動小数点命令に遭遇しても、プロセッサは例外をトリガーせず、命令の実行方法を認識できません。

したがって、カーネルを移植するときには、プロセッサに FPU があるかどうかも理解する必要があります。プロセッサが FPU を削除し、コアが対応する処理を実行しない場合 (浮動小数点例外を有効にする)、APP の浮動小数点命令の結果は予測できません。この場合、ソフト浮動小数点ツール チェーンを使用して APP をコンパイルできます。

ちょっとした考えです:

プロセッサの場合、プロセッサ設計に浮動小数点例外がある場合 (MIPS PPC には両方に浮動小数点例外があります)、FPU に接続することもできます。

FPU に接続した後、浮動小数点例外はプロセッサ コアでシールドされる必要があります。そうしないと、浮動小数点演算によって依然として浮動小数点例外が生成され、FPU は実質的に意味を持たなくなります。

FPU がない場合、プロセッサ コアで浮動小数点例外を有効にする必要があります。そうしないと、上記で発生した問題と同じ問題が発生します。プロセッサは浮動小数点命令の実行方法を知らないため、結果は予測できません。

Linux カーネルの浮動小数点演算サポートに関する上記の簡単な説明が、私が皆さんにお伝えしたいことのすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COM をサポートしていただければ幸いです。

以下もご興味があるかもしれません:
  • Linux システムに gcc と kernel-devel をインストールする方法
  • カーネルが提供するインターフェースを使用してプロセス番号(pid)を出力します。
  • Linuxカーネルで関数呼び出しスタックを出力する方法についての簡単な説明
  • Linuxカーネルで関数ポインタに対応する関数名を出力する方法
  • NEONを使用してカーネル状態のアルゴリズムを高速化する方法を学ぶ
  • Ubuntu の kvm コマンドラインで 64 ビット Ubuntu をインストールするときに発生する「Ubuntu ツリーの hvm カーネルが見つかりません。」という問題の分析
  • CentOS7 カーネル カーネル5.0 バージョンアップグレード
  • LinuxカーネルとSVNバージョン間の競合の解決策

<<:  WeChatアプレット+EChartsで動的更新プロセス記録を実現

>>:  MySQL 5.7.20 解凍版のインストールとルートパスワードの変更に関するチュートリアル

推薦する

MySQL 8.0.17 解凍版のインストールと設定方法のグラフィックチュートリアル

インストール中に遭遇した問題を記録しておきますので、皆様のお役に立てれば幸いです。 1. ダウンロー...

HTML でスクロールバーを使用する際のヒントを共有する

今日、牛南ニュースリリースシステムについて学んでいたとき、牛南先生はスクロールバーに関するいくつかの...

Win10 64 ビットで圧縮パッケージを使用して最新の MySQL 8.0.18 をインストールするチュートリアル (画像とテキスト付き)

WIN10 64ビットに最新のMySQL8.0.18をインストールダウンロード公式サイトから最新バ...

jQueryは時間セレクタを実装する

この記事の例では、参考までに時間セレクターを実装するためのjQueryの具体的なコードを共有していま...

img 画像タグに alt 属性を付与する必要がありますか?

img 画像タグに alt 属性を追加しますか?画像 img タグの alt 属性を見落とすことはよ...

N キロメートル以内のデータを検索する MySQL の簡単な例

地球の円周率と半径、検索ポイントの経度と緯度から、検索ポイントと検索データテーブル間の距離はNキロメ...

Linux 環境に nginx をインストールするチュートリアル

目次1. 必要な環境をインストールする //gccをインストールする yum で gcc-c++ を...

Windows での MySQL の使用: 自動スケジュールバックアップの実装

1. バックアップスクリプトを書く 著者:www.yumi-info.com 日付:20171222...

Nginx サーバーが Systemd カスタム サービス プロセス分析を追加

1. nginxを例に挙げるyumコマンドを使用してNginxをインストールしましたSystemd ...

MySQL で乱数を生成し、文字列を連結する方法の例

この記事では、MySQL が乱数を生成し、文字列を連結する方法について例を使用して説明します。ご参考...

NFS サーバーの原理と、その構築、構成、展開の手順を簡単に分析します。

目次NFS サービスの概要NFS とは何ですか? NFS マウントの原則NFS サーバーはデータ転送...

Linux の権限管理コマンド (chmod/chown/chgrp/unmask) の詳細な説明

目次chmod例権限に関する特別な注意分析するチョーンchgrp umask Linux オペレーテ...

mysql5.6 以前のデータベースで json をクエリする方法

MySQLにデータを保存するとき、乱雑であまり使用されないデータがJSONフィールドに投げ込まれるこ...

HTMLにおける絶対パスと相対パスの違いの分析

図に示すように: 1 つのページには多数のファイルが接続されているため、ファイルを参照するときには、...