大地资源网视频在线观看新浪,日本春药精油按摩系列,成人av骚妻潮喷,国产xxxx搡xxxxx搡麻豆

您現(xiàn)在的位置:智能制造網(wǎng)>技術(shù)中心>Linux啟動(dòng)過(guò)程中硬件模塊的加載

直播推薦

更多>

企業(yè)動(dòng)態(tài)

更多>

推薦展會(huì)

更多>

Linux啟動(dòng)過(guò)程中硬件模塊的加載

2009年03月25日 08:33:52人氣:972來(lái)源:浙江啟揚(yáng)智能科技有限公司

linux啟動(dòng)過(guò)程中硬件模塊的加載

前言:我覺(jué)得我的文章相對(duì)來(lái)說(shuō)都是比較淺顯的。一些初學(xué)者可以看看,對(duì)于高手來(lái)說(shuō),如果你們不吝嗇時(shí)間的話(huà),希望也能幫我看看,指點(diǎn)一下其中的錯(cuò)誤。這也是我到這里來(lái)和大家交流的目的。

閱讀linux內(nèi)核啟動(dòng)代碼的直接動(dòng)力是我想編寫(xiě)rtl8019as的網(wǎng)卡驅(qū)動(dòng)程序(2.4.18內(nèi)核只支持了cs8900a)。既然要寫(xiě)驅(qū)動(dòng),我就想知道它是怎么樣被加載的,好奇心驅(qū)使我先去搞定這個(gè)問(wèn)題。

 

 

       拿到2.4.18的軟件包,一萬(wàn)多個(gè)文件,我不知怎么下手。所幸手頭有這么三件工具助我入門(mén):

 

 

1,一塊移植好linux的開(kāi)發(fā)板,通過(guò)它可以看到linux啟動(dòng)過(guò)程打印的消息。

 

 

2,  google,網(wǎng)上關(guān)于linux的資料真是太多了!!!

 

 

3,  windows文件搜索引擎,通過(guò)它可以知道在那些文件中打印出那些消息。

 

 

很快,我就找到了linux啟動(dòng)的總的入口,/arch/arm/boot/compressed/head.s

 

 

head.s完成的工作主要是底層寄存器、mmu的一些設(shè)定以及kernel的解壓縮。匯編文件中調(diào)用的c代碼大多位于該目錄下misc.c文件,比如decompress_kernel

 

 

當(dāng)然,這部分不是重點(diǎn),head執(zhí)行完畢以后就跳到start_kernel(),這才是我們的重點(diǎn)所在,這個(gè)函數(shù)位于文件/init/main.c中。這個(gè)文件是啟動(dòng)的主線(xiàn)!!!

 

 

       start_kernel中,依次執(zhí)行各個(gè)初始話(huà)函數(shù),這里具體我沒(méi)有看,一直到zui后rest_init(),在這個(gè)函數(shù)里啟動(dòng)了一個(gè)init線(xiàn)程,而主線(xiàn)程自己則進(jìn)入了idle狀態(tài)。所以我們關(guān)心一下init線(xiàn)程做了什么事情,看文件zui后init函數(shù)。

 

 

       在這個(gè)函數(shù)里面,先lock_kernel,然后調(diào)用do_basic_setup,在這個(gè)函數(shù)里面又是一堆的初始化,有一個(gè)函數(shù)要引起我們的注意:do_initcalls。看看它干了什么:(這之后的東西在下文文件系統(tǒng)中講解)

 

 

       static void __init do_initcalls(void)

 

 

 

{

 

 

 

              initcall_t *call;

 

 

 

              call = &__initcall_start;

 

 

 

              do {

 

 

 

                     (*call)( );

 

 

 

                     call++;

 

 

 

              } while (call < &__initcall_end);

 

 

 

              /* make sure there is no pending stuff from the initcall sequence */

 

 

 

              flush_scheduled_tasks();

 

 

 

}

 

 

 

很難相信,我們關(guān)心的外圍模塊的驅(qū)動(dòng)就是被這一段程序加載的。怎么回事?我們慢慢來(lái)看:

 

 

首先看__initcall_start__initcall_end,找遍了所有c代碼,沒(méi)有它們的定義。后來(lái)在vmlinux-armv.lds.in文件中找到了它們:

 

 

__initcall_start = .;

 

 

 

*(.initcall.init)

 

 

 

__initcall_end = .;

 

 

 

這個(gè)文件是和link相關(guān)的文件,它決定代碼在load環(huán)境中的位置,就好比ads中的scf文件。我們還是先看.initcall.init的含義吧,它在/include/linux/init.h中定義:

 

 

#define __init_call __attribute__ ((unused,__section__ (".initcall.init ")))

 

 

 

參考gcc說(shuō)明,這段話(huà)的意思就是說(shuō)所有以__init_call前綴定義的函數(shù)在鏈接過(guò)程中都放到名字為.initcall.init的段(section)里面。ok,有點(diǎn)味道了,也就是說(shuō),如果我們給一個(gè)函數(shù)冠以__init_call,那么它在編譯鏈接的時(shí)候就會(huì)放到.initcall.init這個(gè)段里面。而上面這段循環(huán)所做的事情就很清楚了,它從段的首地址開(kāi)始,依次執(zhí)行每一個(gè)函數(shù),直到段尾為止。

 

 

這個(gè)時(shí)候,我們應(yīng)該在想,那些要注冊(cè)的外圍模塊的初始化程序是不是都是定義成__init_call類(lèi)型的呢?正如我們所料,查看各個(gè)模塊我們會(huì)發(fā)現(xiàn)其初始化函數(shù)x會(huì)被定義成為module_init(x),在/include/linux/init.h中它定義如下:

 

 

       #define module_init(x)  __initcall(x);

 

 

 

#define __initcall(fn)    static initcall_t __initcall_##fn __init_call = fn

 

 

 

     這段代碼說(shuō)module_init(x)等價(jià)于__initcall(x),而__initcall(x)表示函數(shù)x是靜態(tài)的具有__init_call性質(zhì)的函數(shù)(這里名字比較多,容易看亂),因此在鏈接時(shí),它會(huì)被放在.initcall.init段中。只要x函數(shù)運(yùn)行起來(lái)了,那就可以注冊(cè)設(shè)備、中斷入口、中斷服務(wù)函數(shù)了。接下來(lái)的事情就好辦了。

 

 

       搞清出設(shè)備如何被加載以后,我們還需要知道另外一個(gè)問(wèn)題:怎樣把一個(gè)模塊的驅(qū)動(dòng)程序加載到內(nèi)核里面呢?so簡(jiǎn)單,make menuconfig,把對(duì)應(yīng)設(shè)備打開(kāi)。但是能不能再具體一點(diǎn)呢,我們做這么一個(gè)改動(dòng),怎么映射到編譯&鏈接過(guò)程呢。我這個(gè)人就是喜歡找麻煩,因此又在網(wǎng)上搜啊搜,而且用了zui笨的方法,看看make menuconfig前后那些文件的修改日期發(fā)生了變化。zui終還是找到了一點(diǎn),/sc-ripts下的文件是用來(lái)支持各種config模式的(當(dāng)然包括menuconfig),核心代碼在kconfig中。在每個(gè)驅(qū)動(dòng)設(shè)備的文件夾下(比如netmtd)都有一個(gè)叫config.in的文件,這些文件定義了我們?cè)?font face="times new roman">menuconfig畫(huà)面中看到的目錄結(jié)構(gòu)&選項(xiàng)。

 

 

       眼睛看到的畫(huà)面總歸都是虛的,這些改動(dòng)究竟反映到了哪里去了呢??jī)蓚€(gè)文件:./config/include/linux/ autoconf.h。我們做完menuconfig以后,所有改動(dòng)就反映到了這兩個(gè)文件中,這兩個(gè)文件的內(nèi)容是一致的。在我們做編譯的過(guò)程中,頂層的makefile文件從autoconf.h文件中讀取各項(xiàng)宏定義然后傳遞給子一層的makefile,這些makefile根據(jù)宏定義選擇那些.o文件被鏈接進(jìn)來(lái)加到內(nèi)核中。

 

 

       好了,知道這些我就知道怎么給8019添加驅(qū)動(dòng)了,yy一下:

 

 

1,首先要有驅(qū)動(dòng)程序代碼,8019.c

 

 

 

2,修改net目錄下的config.in文件中添加一項(xiàng),

 

 

     dep_tristate "    rtl8019 support" config_rtl8019 $config_isa

 

 

 

3,打開(kāi)menuconfig,將rtl8019 support選擇y,保存推出后autoconf文件中應(yīng)該

 

 

就有了一個(gè)宏定義:#define config_rtl8019

 

 

 

4,打開(kāi)net目錄下的makefile,添加:

 

 

       obj-$( config_rtl8019) += 8019.o

 

 

 

5,make dep; make zimage;搞定!

 

 

 

 

 

注:在menuconfig中選擇m y的區(qū)別:

 

 

              y: 模塊驅(qū)動(dòng)編譯到內(nèi)核中,啟動(dòng)時(shí)自動(dòng)加載

 

 

              m:模塊會(huì)被編譯,但是不會(huì)被編譯到內(nèi)核中,只是生成.o文件,我們可以收集這些.o文件做到linux的文件系統(tǒng)中,然后用insmod實(shí)現(xiàn)動(dòng)態(tài)加載。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

全年征稿/資訊合作 聯(lián)系郵箱:1271141964@qq.com

免責(zé)聲明

  • 凡本網(wǎng)注明"來(lái)源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請(qǐng)必須注明智能制造網(wǎng),http://m.xashilian.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
  • 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
  • 本網(wǎng)轉(zhuǎn)載并注明自其它來(lái)源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類(lèi)作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品來(lái)源,并自負(fù)版權(quán)等法律責(zé)任。
  • 如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

<
更多 >

工控網(wǎng)機(jī)器人儀器儀表物聯(lián)網(wǎng)3D打印工業(yè)軟件金屬加工機(jī)械包裝機(jī)械印刷機(jī)械農(nóng)業(yè)機(jī)械食品加工設(shè)備制藥設(shè)備倉(cāng)儲(chǔ)物流環(huán)保設(shè)備造紙機(jī)械工程機(jī)械紡織機(jī)械化工設(shè)備電子加工設(shè)備水泥設(shè)備海洋水利裝備礦冶設(shè)備新能源設(shè)備服裝機(jī)械印染機(jī)械制鞋機(jī)械玻璃機(jī)械陶瓷設(shè)備橡塑設(shè)備船舶設(shè)備電子元器件電氣設(shè)備


我要投稿
  • 投稿請(qǐng)發(fā)送郵件至:(郵件標(biāo)題請(qǐng)備注“投稿”)1271141964.qq.com
  • 聯(lián)系電話(huà)0571-89719789
工業(yè)4.0時(shí)代智能制造領(lǐng)域“互聯(lián)網(wǎng)+”服務(wù)平臺(tái)
智能制造網(wǎng)APP

功能豐富 實(shí)時(shí)交流

智能制造網(wǎng)小程序

訂閱獲取更多服務(wù)

微信公眾號(hào)

關(guān)注我們

抖音

智能制造網(wǎng)

抖音號(hào):gkzhan

打開(kāi)抖音 搜索頁(yè)掃一掃

視頻號(hào)

智能制造網(wǎng)

公眾號(hào):智能制造網(wǎng)

打開(kāi)微信掃碼關(guān)注視頻號(hào)

快手

智能制造網(wǎng)

快手ID:gkzhan2006

打開(kāi)快手 掃一掃關(guān)注
意見(jiàn)反饋
關(guān)閉
企業(yè)未開(kāi)通此功能
詳詢(xún)客服 : 0571-87858618
主站蜘蛛池模板: 满城县| 固安县| 高雄县| 临江市| 蓬安县| 延吉市| 青州市| 楚雄市| 讷河市| 宁阳县| 彭阳县| 汾西县| 衢州市| 灌云县| 兖州市| 太和县| 沂南县| 宿松县| 湘乡市| 鄂托克前旗| 舟曲县| 云林县| 库车县| 开江县| 商城县| 呼玛县| 乌兰浩特市| 龙江县| 马关县| 桑植县| 抚远县| 玉溪市| 镇赉县| 天全县| 平泉县| 海丰县| 卢湾区| 麻栗坡县| 宣恩县| 房产| 商丘市|