ホームページ >システムチュートリアル >Linux >Huawei Cloud が Linux カーネルのコンパイルとインストールを完了する (オプションのトピック)
実験では、Linux カーネルのコンパイルとインストールをマスターし、Linux システム コールの基本概念設計をマスターし、Linux システム コールを追加する必要があります。
(1) 指定したプロセスの優先度(nice 値と prio 値)を変更または返します(詳細は教科書 P328 を参照) ヒント: 参照可能なカーネル関数: set_user_nice().(2) ホスト名をカスタム文字列に変更する (オプションの質問)
1. Linux カーネルのコンパイルとインストール (Huawei Cloud を使用して、openEuler カーネルのコンパイルとインストールを完了します)
(1) システムにログインし、現在のカーネルのバージョンを確認します
[root@openEuler~]#uname-r
(2) ツールのインストールと開発環境の構築
[root@openEuler~]#yumgroupinstall-y"開発ツール"
[root@openEuler~]#yuminstall-ybc
[root@openEuler~]#yuminstall-yopenssl-devel
(3) カーネルを更新する後続の手順が失敗した場合に備えて、ブート ディレクトリをバックアップします。
[root@openEuler~]#tarczvfboot.origin.tgz/boot/
現在のカーネルバージョン情報を保存する
[root@openEuler~]#uname–r>uname_r.log
(4) カーネルソースコードを取得して解凍します
[root@openEuler~]#wget
[root@openEuler~]#unzipkernel-4.19.zip
(5)カーネルのコンパイル
[root@openEuler~]#cdkernel-kernel-4.19
[root@openEulerkernel]#makeopeneuler_defconfig
[root@openEulerkernel]#make-j4Imagemodulesdtbs
このステップでは、カーネルのイメージ、モジュール、dTBS をコンパイルします。make-j4 は 4 スレッドのコンパイルを意味します (CPU コアの数に応じて調整できます)
(6)カーネルのインストール
[root@openEulerkernel]#makemodules_install
[root@openEulerkernel]#makeinstall
注: 最後のステップ「makeinstall」中に発生するエラーは、ここでは無視できます。
(7) VNC
を使用して ECS にログインします。(8) システムを再起動します
[root@openEulerkernel]#reboot
(9) ログインして確認します
VNC ウィンドウで新しくコンパイルされたカーネルを使用してシステムを起動することを選択します
ここでコンパイルすると、バージョン 4.19.208 の新しいカーネルがすでに存在します。このカーネルを選択してログインします。
2. Linux システム コールの基本概念をマスターする
Linux システムがシステムコールを処理するプロセスとシステムコールを削減する方法。 Linux システムは何百ものシステム コールを提供します。各システム コールを一意に識別するために、Linux は各システム コールにシステム コール番号と呼ばれる一意の番号を設定します。同時に、各システム コールにはサービスが必要です。インタープリタは、その固有のサービスを完了します。機能。
ここでは詳しい説明はしません。
(焦点はシステムコールの追加方法です!!!)
リーリー
リーリー
リーリー
再起動後
リーリー
3. Linux システムコールを設計して追加する
(1) 指定したプロセスの優先度(nice 値と prio 値)を変更または返します(詳細は教科書 P328 を参照) ヒント: 参照可能なカーネル関数: set_user_nice().
リーリー
(2) ホスト名をカスタム文字列に変更する (オプションの質問)
リーリー
同様に、以下の #define__NR_syscalls296 を #define__NR_syscalls297 に変更する必要があります。
4. 実験の概要(1) 実験を行う前に、チュートリアルを読んだ後、x86 アーキテクチャか arm アーキテクチャかを明確に識別する必要があります。 ! !私はここでつまずき、Huawei Cloud を 3 ~ 4 回再構築しました
(2) VNC でログインするときに次のエラーが発生した場合は、おめでとうございます。おそらくカーネルがクラッシュしたためです。先生は、十分な速度がある限り、VNC を使用して仮想マシンをすぐに再起動できると言いました。ログインはできるのですが、クラウドホストの再構築はn回しかできませんでした。
(3) 先生の実験レポートでは Linux カーネル関数
を呼び出すために VNC ログイン が必要ですが、個人的には CloudShell を使ってコマンドを実行することをお勧めします。
(4) 最初のテストで、いきなり先生にシステムコールの関数の意味や使い方について質問され、すぐにつまづいてしまいました。以下にいくつかの内部関数の意味と使い方を掲載します。1.find_get_pid(pid)
find_get_pid はカーネル内に異なる名前空間を持っています。それぞれの名前空間内の同じプロセスの pid 値は異なる場合があります。find_get_pid はカーネル モードでプロセスの実際の pid を見つけることです
2.set_user_nice(タスク,nicevalue)
プロセスのnice値を設定するために使用されます
3.copy_to_user()
カーネル空間からユーザー空間へのコピーを完了します。ターゲット アドレス Linux オペレーティング システムのバージョン Linux システムへ、このアドレスはユーザー空間のアドレスです。ソース アドレスから、このアドレスはカーネル空間のアドレスです。データの N バイトコピーする番号。
データのコピーが成功した場合はゼロを返し、それ以外の場合はコピーに失敗したデータのバイト数を返します。
4.copy_from_user()
copy_from_user は、name で指定された文字列をユーザー空間からカーネル空間にコピーします。失敗した場合は、コピーされていないバイト数を返します。成功した場合は、0 を返します。
5.down_write()
関数 down_write() は、ライターが読み取りセマフォ sem を取得するためにこの関数を使用するときに呼び出されます。セマフォがリーダーまたはライターによって保持されている場合、Linux カーネル関数を呼び出します 、関数の呼び出しは呼び出し元をスリープ状態にし、Linux カーネル読み取りセマフォの書き込みロックを取得するためにプロセス コンテキストでのみ使用できます。
6.memcpy(str1,str2,n)
n バイトを記憶領域 str2 から記憶領域 str1 にコピーします。
以上がHuawei Cloud が Linux カーネルのコンパイルとインストールを完了する (オプションのトピック)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。