、メンバーが呼ぶ存在に気づい(続き):構造体net_device *次の、ハァッ、ハァッ、それに非常に精通し、それはネットワークデバイスのリストを作成し、それを使用することです。各ネットワーク機器活性化されると、(ドライバー/ネット/net_init.c)トラッキング機能)(register_netdevを呼び出します:int型register_netdev(構造体net_device * DEV){int型ERR; rtnl_lock(); /**名の場合{ERR = dev_alloc_name(DEV、DEV->名);書式文字列発信者が*名割り当て* /IF(名前、 '%')strchr(DEV->)を行うために私たちを希望する場合(ERR< 0) 。ジャンプアウト;}
/**戻る互換フックは2.5でこれを殺す* /
IF(DEV->名[0] == 0 | | DEV->名[0] == ''){ERR = dev_alloc_name(DEV、" ETH%D");(ERR<場合; 0)後藤出;} ERR = register_netdevice(DEV);アウト:rtnl_unlock( );戻りERR;}トレースする:register_netdevice(構造体net_device * DEV)(ネット/コア/dev.c)のint register_netdevice(構造体net_device * DEV){構造体hlist_head *ヘッドと、構造体hlist_node * P; INT RET; BUG_ON(dev_boot_phase ASSERT_RTNL(); /* net_deviceが永続的な場合、これは致命的になります。* /BUG_ON(dev-> reg_state!= NETREG_UNINITIALIZED); spin_lock_init(& dev-> queue_lock); spin_lock_init(& dev->); xmit_lock); dev-> xmit_lock_owner = -1; #ifdef CONFIG_NET_CLS_ACTspin_lock_init(& dev-> ingress_lock);#endifret = alloc_divert_blk(dev); if(ret)gout out; dev-> iflink = -1; /*初期化は、この機能が利用可能である場合* ///DEV場合 - > initが割り当てられ、この関数は次の場合に呼び出される(DEV-> INIT){RET = DEV-> INIT(DEV); IF(RET) {(RET> 0)であればRET = -EIO;後藤out_err;}} //(dev_valid_name(DEV->!名)){RET = -EINVAL場合名が有効と判定された場合、ジャンプout_err;} //であります場合(DEV-> iflink == -1)のifIndex = dev_new_index();デバイスは、> indexdev-割り当てられDEV-> iflink = DEV->のifIndex; /*名前の存在をチェック* ///すべてのネットワークハッシュdev_name_headとして主キーの名前を提示する装置であって、変数名に対応するハッシュアレイでは、リストがすでにこのネットワークデバイス名、エラー終了ヘッド= dev_name_hash(DEV->のカーネルが含まれている場合//見出されます。 Name); hlist_for_each(p、head){struct net_device * d = hlist_entry(p、struct net_device、name_hlist); if(!strncmp(d-> name、dev-> name、IFNAMSIZ)){ret = -EEXIST; goto文out_err;}} /*違法SG + CSUMの組み合わせを修正* /IF((DEV->機能&#038; NETIF_F_SG)&#038;&#038;(DEV->機能&#038;(NETIF_F_IP_CSUM |。! NETIF_F_NO_CSUM | NETIF_F_HW_CSUM))){printk("%s:チェックサム機能がないため、NETIF_F_SGを削除します。\\ n"、dev-> name); dev-> features& =〜NETIF_F_SG;} /** nil rebuild_headerルーチン* *それは呼び出されず、場合* ///デフォルトはrebuild_headerが割り当てられているだけでバグトラップとして使用する決してべきである(DEV->! rebuild_header)DEV->。rebuild_header = default_rebuild_header; /**レジストリでデフォルトの初期状態であること* * /set_bit(__ LINK_STATE_PRESENT、& dev-> state); dev-> next = NULL; dev_init_scheduler(dev); write_lock_bh(& dev_base_lock); //初期化、struct net_device ** dev_tail =&#038; dev_base; //これは、実際のコード手段です:devがノードリストの尾* dev_tail = DEVを率いdev_baseチームを追加しました。dev_tail =&#038; DEV->次; //このノードがに追加されます主キーhlist_add_headの名前リストアレイdev_name_headハッシュで(&#038; DEV-> name_hlist、ヘッド)アレイはdev_index_head //の主キーに加え、このノードのシリアル番号をリスト
日々の作業や実験では、仮想マシンのクローン作成または移行が必要になることがよくあります。 Linux仮想マシンを移行した後、システムにはeth0がもうないことがわかりますが、それはeth1になり、ネッ
Linuxの起動プロセスは何ですか? grubブートを使ってシステムの起動を完了する方法は?私が二重システムをインストールする前にこれらの問題は徹底的に研究されていません。 grubを介したLinuxの起動を理解し、Linux オペレーティングシステム
を理解するのを助け、また基本的な知識を普及させることができます^ _ ^。
図に示すように、これはハードディスクのLinuxパーティションの概略図です。 boot、root
Od -Ax -tx1z -vはMBR構造を導入します。GRUB(Grand Unified Bootloader)について話しましょう。現在のほとんどのLinuxシステムはこのブートローダを使って
でのprintf出力文字列の色フォーマット: printf(&quot; \\ 033 [単語の背景色;フォントの色m文字列\\ 033 [0m]); printf(&quot; \\ 033 [
初心者のLinux子供用シューズアプリケーションにはこの経験があります。Linuxに最初に連絡したときは、SWAPスペースの割り当てがどれほどよいのかわかりません。たとえば、当時のOracle10gの