版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
課程設計說明課程名稱 操作系統(tǒng)課程設 業(yè):物聯(lián)網工 班級 2012級2設計人 2012010519102015116一、課程設計題目:Linux二、設計原始資料:1OperatingSystemConceptAbrahamSilberschatz 5、Linux六、命題發(fā)出日期: 設計要 總 proc偽文件系統(tǒng)及CMOS實時信 設計要 總 使用seq-file機制proc進程信 設計要 總 設計要 總 設計要 總 總 1、通過完成一個簡單的Linux內核模塊的添加和運行工作,了解并21、完成kello.c2kello.cMakefile3、完成kello.ko456kello.c代碼的修改,使其能夠在用戶界面上輸出信息,以及一定1、用gedit編輯工具完成kello.c2kello.cMakefile與普通C語言撰寫的應用程序o.c相比,內核模塊的編譯比較復雜,這是因為在編譯的過需要當前內核模塊的支持。我們需要首先編寫一個Makefile文件,與kello.c的編寫一樣,可以vi工具或者gedit代碼撰寫完成后,文件保存為Makefile與kello.c文件放置在同一個文件夾下?,F(xiàn)在我們可以開始LKM的編譯了。首先執(zhí)行l(wèi)s命令,查看并確認kello.c和Makefile存在當期工作 下,然后運行make指令。 sudoinsmodkello.ko sudormmoddmesg4、LKMkello.cMakefile文件。其內容如下:obj-:=KDIR:=/lib/modules/$(suname-r)/build:=$(spwd)$(MAKE)-C$(KDIR)SUBDIRS=$(PWD)rm-r-f.tmp_versions*.mod.c.*.cmd*.o*.symvers對該文件的解釋是這樣的:KERNELRELEASEMakefile中定義的一個變量,在第一次執(zhí)行此Makefile時,KERNELRELEASE沒有被定義,所以make將執(zhí)行else之后的內容。如果make的目標是clean,直接執(zhí)行clean操作,然后結束。當沒有make的目標時,make執(zhí)行默認操作,即default后的指令,此時-C$(KDIR)指明跳轉到內核源 下那里的=$(PWD)表明需要返回到當前 繼續(xù)讀入、執(zhí)行當前的Makefile。當 返回時,KERNELRELEASE已被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續(xù)else之前的內容。else之前的內容為kbuild語法的語句,指明模塊源碼中各文件的依賴關系,以及要生成的目標模塊名,obj-m:=kello.o表示編譯連接后將生成kello.o模塊,而kello.o文件默認則是由kello.c文件編譯生成的。5在內核中定義了0~7總計8staticchar*log_level[]={KERN_EMERG0,表示等級最高。此時調用printkprintk(“<0>o,studentsfromSDUST!Thisisinkernelspace!\n"printk(KERN_EMERG"\no,studentsfromSDUST!Thisisinkernelspace!\n");6、intk函數(shù)還可以輸出相關參數(shù),例如如下printk(KERN_DEBUG"Wearehere:%s:%dat%s()/n",FILE ,LINE ,FUNCTION 其中FILE 表示源代碼文件,以絕對路徑的方式出現(xiàn),LINE 表示這行printk允許在這個源代碼文件中的第幾行,這是一個很好的給出調測點位置的信息。這個同樣可以用在用戶程序。另外DATE 和TIME也是經常使用用的兩個。這4個宏,在debug中會經常使用。還有一個常用的是FUNCTION 表示處在哪個函數(shù)中,也是比較好的定位方式。這些宏均可以在用戶程序中使用,對debug非常有幫7kello.c代碼的修改,使其能夠在用戶界面上輸出信息,以及一定運行結果及分1、用gedit編輯工具完成kello.c2kello.c代碼對應的Makefile上述代碼撰寫完成后,文件保存為Makefile與kello.c文件放置在同一個文件夾下?,F(xiàn)在我們可以開始LKM的編譯了。首先執(zhí)行l(wèi)s命令,查看并確認kello.c和Makefile存在當期工作 下,然后運行make指3、完成kello.ko4printk(“<0>o,studentsfromSDUST!Thisisinkernelspace!\n"printk(KERN_EMERG"\no,studentsfromSDUST!Thisisinkernelspace!\n");5kello.c代碼的修改,使其能夠在用戶界面上輸出信息,以及總本次設計的重點有兩個的c庫。MakefileMakefile文件的撰寫是內核編程必要的procCMOS1LKM機制添加系統(tǒng)功能,并支持應用程序使用該功2Linuxmycatproc3LKM模塊,并對比,更深刻地理解內核模塊編1、在Linux中有一個應用非常廣泛令:cat,它的作用很多,其中一個2mycat.c代碼的編輯,$gccmycat.c-o文件編譯成功后,按著文件中說明的方法運行$./mycat<filename>可以是mycat.cpp或其他文件的名稱。請觀察命令3、對照代碼、結合操作系統(tǒng)課程內容、以及圖2.1,4、運行本節(jié)命令,5、代碼編輯完成后,請保存為cmos.c。然后在相同文件夾下編輯Makefile文件,內容如下:Makefile保存后,在同一 下運行make;如果報錯,請根據(jù)錯誤提示修改;如果一切順利,那么就生成了cmos.ko文件,可以使用ls命令查看。這表示初步的編譯已經通過了。確認cmos.ko生成后,可以通過如下命令來添加該LKM模塊:$sudoinsmodcmos內核源文件,Makfile6cmos.ko內核模塊,cat、mycat應用程序進1$cat$cat$cat$cat$cat$cat$cat$cat2、完成如下代碼的撰寫,mycat.c#include<fcntl.h>//foropen()#include<stdio.h>//forperror()#include<unistd.h>//forread(),write(),close()intmain(intargc,char*argv[]){inti,fd,ch;//declarelocalvariablesfor(i=1;i<argc;i++){fd=open(argv[i],O_RDONLYif(fd<0){perror(argv[i]);continue;while(read(fd,&ch,1)==1)write(STDOUT_FILENO,&ch,1);close(fd);}}文件保存后,可以按著文件頭部注釋中說明的方法進行編譯,$gccmycat.c-o文件編譯成功后,按著文件中說明的方法運行$./mycat<filename>mycat.cpp或其他文件的名稱。觀察命令運行后的3、運行本節(jié)命令,查看輸出結果。$catproc/cpuinfoCPU(型號,,緩存大小等)$cat/proc/modules-$cat/proc/meminfo-$cat/proc/iomemIO$cat/proc/self/maps-cat$cat/proc/devices-$cat/proc/filesystems-$cat/proc/version-4、代碼編輯完成后,cmos.c。然后在相同文件夾下編輯obj-m:=cmos.oKDIR:=/lib/modules/$(suname-r)/buildPWD:=$(spwd)$(MAKE)-C$(KDIR)SUBDIRS=$(PWD)rm-r-f.tmp_versions*.mod.c.*.cmd*.o*.symversMakefile保存后,在同一下運行make;如果報錯,請根據(jù)錯誤提示修改;如果一切順利,cmos.ko文件,ls命令查看。這表示初步的編譯已經通過了。確認cmos.ko生成后,可以通過如下命令來添加該LKM模塊:$sudoinsmod 下查看是否生成了cmos偽文件,也可以使用dmesg來查看內核日志中的模塊添加信息。一切順利沒有問題,我們可以運行如下命令來RTC信息了:$cat/proc/cmos你的顯示器上的輸出結果是什么?是不是RTC信息不斷的在刷屏?按<Ctrl>+C組合鍵,可以停止刷屏。查看我們的cmos.c內核源文件,可以確認我們確實是只想輸出一次RTC信息啊,但為什么一直在不斷的輸出呢?現(xiàn)在再嘗試使用我們自己開發(fā)的mycat應用程序來查看RTC輸出:$./mycat5、“新內核新特性:ubuntu14.04LTSproc特性”刪除了老內核環(huán)境支持的多個版本的proc創(chuàng)建方法。目前3.13.0proc_create,其函數(shù)原型為staticinlinestructproc_dir_entry*proc_create(constchar*name,umode_tmode,structproc_dir_entry*parent,conststructfile_operations*proc_fops){returnproc_create_data(name,mode,parent,proc_fops,}該函數(shù)是一個內聯(lián)函數(shù)(inline),proc_creat_dataproc_creat-data的原型如下externstructproc_dir_entry*proc_create_data(constchar*,umode_t,structproc_dir_entry*,conststructfile_operations*,void*);所以嚴格的說,在版本的Linux內核中,proc偽文件事實上只有一新版本的Linux內核刪除了在ubuntu12.04LTS(Linux3.2.0內核)經常使用的proc直接讀和寫的函數(shù)。也就是說,在ubuntu12.04LTS中我們使用一個proc自定義的讀函數(shù)就可以正確的讀出相關信息了。為此,在新版Linuxprocseq_file機制綁定在一起了。也就是說,在Linux新版本的內核中proc偽文件的讀寫等操作都是根據(jù)seq_file機制來進行的。運行結果及分1、$cat$cat$cat$cat$cat$cat$cat$cat2、$sudoinsmod3、嘗試使用自己開發(fā)的mycat應用程序來查看RTC$./mycat總/proc偽文件系統(tǒng)提供了一個基于文件形式的Linux內部接口。它可些狀態(tài)往往都是處于內核空間的,對程序員來說是作系統(tǒng)隔絕開的。通過本次設計,我們可以看到為了解決應用程序與內核數(shù)據(jù)的問題,也即我們不可能讓一個類似于cat的應用程序直接去讀CMOS中的RTC信息,我們添加了一個cmos.ko內核模塊,該模塊創(chuàng)建了一個名為cmos的proc偽文件,通過這個偽文件我們就可以直接從硬件設備CMOS中RTC信息了。當用戶程序,比如cat,要打開/proc/cmos偽文件或者/proc/cmos的信息時,cat程序中的標準庫函數(shù)把相應的操作參數(shù)傳遞給操作系統(tǒng)內核對應的LKM模塊,也即我們編寫的cmos.ko,由cmos.ko調用相應的內核操作函數(shù)打開該設備或者相關信息,然后把操作結果返1、通過使用seq-file機制proc進程信息,了解seq_file機制,理解Linux重要的內核數(shù)據(jù)結構task_struct;2、通過利用seq_fileproc偽文件,Linux內核task_structPCB(ProcessControlBlock)的信息。1、了解seq_file2、實現(xiàn)procseq_file32步輸出結果進行分析,查看并分析查看/proc/tasklist的信息4、重新編輯編輯代碼并運試新的tasklist模塊,并用mycat和cat命1、編輯tasklist.c內核代碼,添加到當前內核中運行,并且通過mycat和cat命令查看/proc/tasklist的信息。實現(xiàn)proc偽文件與seq_file機制的綁定,通過proc偽文件tasklist當前系統(tǒng)中進程的pid、狀態(tài)、進程名稱等信 在my_proc_entryproc_create(modname0NULL&my_proc);中傳遞了參數(shù)&my_proc作為定義的proc偽文件tasklist的操作函數(shù),它的具體staticconststructfile_operationsmy_proc{.owner= = = =.release=其中my_open函數(shù)是自己寫的,但是只有一句就是調用seq_open函數(shù)。seq_open通常在打開文件的時候使用;seq_read,seq_lseek和seq_releaseread,llseekrelease,由頭文件seq_file.h定義,在seq_file.c中實現(xiàn)。2、查看/proc/tasklist的信息,3、重新編輯代碼并運試新的tasklist模塊,并用mycat和cat命令分1是否存在差異,并分析。運行結果及分11procseq_file機制是這樣綁定在一起的文件級別的操作綁定。proc在創(chuàng)建后,seq_file機制支持的打開、讀、寫(seq_open、seq_read、seq_write)等函數(shù)進行文件級別的操作;工作,那么我們就需要自己重寫這些函數(shù),這些函數(shù)都需要在file_operations結構體中,并在proc文件創(chuàng)建時作為參數(shù)傳遞進去,即proc_create中記錄級別的遍歷操作。如果在遍歷seq_file對象時需要完成我們自己的工作,那么就需要定義我們自己的遍歷操作函數(shù),即:start、next、stop和show四個函數(shù),并且把相關的操作函數(shù)放在seq_operations結構體中,這個結構體需要作為參數(shù)在proc偽文件打開時傳遞進去,即seq_open的22通過重寫cmos內核代碼,讓其不再刷屏,mycat函數(shù)能夠33./mycat/proc/tasklist1中,讀一次相當于調用上面的四個函數(shù),之前自己寫的procread065,所以會一直讀,會刷屏。Mycat1,而myprocread直接返回總在使用seq-file機制proc進程信息的設計中通過創(chuàng)建一個內核模塊,利用proc偽文件系統(tǒng)以及seq_file機制,我學會了怎樣去查看進程的信息。在這其中比較困惑的是proc怎樣和seq_file機制綁定在一起的。概括來說,procseq_open、seq_read、seq_write等函數(shù)來進行操作,所以創(chuàng)建proc文件時要在proc_create中傳入需要使file_operations作為參數(shù),其中的操作函數(shù)可以自己重新定義。在遍歷proc文件中的每個記錄時需要使用seq_operations中指定的四個操作函數(shù)(必須指定,而且也只有四個):start、show、next和stop,這個結構體需要在打開proc文件時作為參數(shù)傳遞給seq_open函數(shù)。事實上,在本章實驗中我們遍歷進程Linux進程控制塊結構task_struct時其實使用的是task_struct鏈表自帶的遍歷機制,比如宏定義next_task、初始位置init_task等。1、通過POSIX多線程創(chuàng)建,了解基于POSIX多線程編程下加鎖和不加鎖兩種情況的區(qū)別,理解并掌握POSIX多線程環(huán)境下利用同步機制解2、通過Linux多線程創(chuàng)建,了解基于Linux多線程編程下加鎖和不加鎖兩種情況的區(qū)別,理解并掌握Linux多線程環(huán)境下利用同步機制解決多1、掌握基于POSIX會IEEE開發(fā)的標準族,部分已經被ISO接受為國際標準。IEEEStd.1003.1-1990或POSIX.1為操作系統(tǒng)的服務例程提供了源代碼級別的C2、掌握基于Linux雖然Linux支持POSIX的多線程編程,但是Linux也有自己一套用于基于POSIX多線程編1、基于POSIX在主線創(chuàng)建一個新的線程,完成一個從1到UPPER(指定的累加2、基于POSIX在主線創(chuàng)建兩個新線程,合作完成一個從1到UPPER(指定的累3、基于POSIX常見的機制是同步機制在主線創(chuàng)建兩個新線程使用基于互斥鎖的同步機制合作完成一個從1到UPPER(指定的累加次數(shù)上限)的累加工作,1、基于Linux定次數(shù)的累加工作,指定累加次數(shù)為upper。也就是說最終累加結果為:2、基于Linux多線程編程:TestAndSet在主線創(chuàng)建四個新的進程,分別使用臨界區(qū)模型完成對一個共享變量counterupper。3、基于Linux線程主動放棄CPUintnanospleep(conststructtimespec*req,structtimespec一行則是用于說明使用的tsStruct結構體timespecStructtime_ttv_sec;/*seconds秒Longinttv_nsec;/*nanoseconds納秒}nanosleep函數(shù)功能是暫停某個線程直到規(guī)定的時間后恢復,參數(shù)seq就是要暫停的時間其中req->tv_sec是以秒為單位而tv_nsec以納秒為單位,范圍是[0, ]。由于調用nanosleep是使用線程進入TASK_RUNNING狀態(tài),這就意味著有可能會沒有等到規(guī)定的時間就因為當然是在rem不為空的情況下。運行結果及分12345、TestAndSet6總本次多線程環(huán)境下的競爭條件與同步機制設計對Linux支持的線程創(chuàng)建機制進行了一個簡單的對比分析。其中pthread函數(shù)庫支持用戶級的線mutexspinlocksemaphoreLinuxLinuxclone的線程由內核實現(xiàn)調度。根據(jù)內核數(shù)據(jù)的粒度不同、范圍不同,Linux同步機制同樣有的選擇,包括原子操作、內存屏障、自旋鎖、信號量1、通過對進程控制塊task_struct中的mm_struct變量mm的操作,了棧、以及引入的動態(tài)庫等。2、通過mm中的vm_struct變量mmap的操作,了解每個段的運行情1mm.cMakefile21mm.cMakefile圖5.1是Operatingsystemconcepts中的一個關于內存地址映射的基本示意圖。它說明了在In IA32結構中從邏輯地址到物理地址的映0MAX-1,MAXpagingpaging
圖 兩線程使用互斥鎖同步完成一個計數(shù)工selector1613TIIA328k8kRPL。段寄存
16位16位段基地址全局段表寄全局段表寄存5.2從邏輯地址到線性地址(虛擬地址)5.2·CPUselector:offset”·在段寄存器中裝入段選擇符,同時把32位地址偏移量裝入某個寄存器·根據(jù)選擇符中的索引值、TI及RPL值,再根據(jù)相應描述符表中的段地址和段界限,進行一系列檢查;如果該段無問題,就取出相應的描述·將描述符中的32位段址和放在ESI、EDI等中的32位有效地址相32page頁頁0圖5.3 Linux線性空間在32位平臺上為4GB的固定大小。linux內核將這4G字節(jié)的空間分為兩部分。內核使用最高的1G字節(jié)(從虛地址0xC 0xFFFFFFFF,地址0x 因為每個進程可以通過系統(tǒng)調用進入內核,因此,Linux內核空間由系統(tǒng)內的所有進程共享。于是,從具體進程的角度看,每個進程可以擁有4G(0~3G,在系統(tǒng)啟動時,Linux內核映像被裝入到物理地址0x 地方,即1MB開始區(qū)間前面1M空間留做他用。Linux內核映像應該在虛內存的內核空間中,所以程序在內映像時在所有的符號地址加上一個偏移量0xC 對比較簡單的。給定一個虛地址X,其對應的物理地址為“X-PAGE_OFFSET”;反之,給定一個物理地址Y,則其對應的虛地址為“Y+PAGE_OFFSET相對于內核空間而言,Linux形成的空洞(holes)則可以放入動態(tài)文件。盡管每個用戶進程可以擁3GBLinux每個Linux進程都需要創(chuàng)建多個段,這些段對應不同的虛擬區(qū)域。一個虛存區(qū)域是虛存空間中的續(xù)區(qū)域,在這個區(qū)域中的信息具有相同的操作和特性。Linuxtaskstructstructvolatile unsigned structmm_struct structthread_struct /*其他省略task_struct被稱為進程控制塊PCB,因為它記錄每一個進程所mmstruct,被稱為“內存描述符”。mmstructLinux在Linux系統(tǒng)中,進程控制塊task_struct是內核中的數(shù)據(jù)結mmmm_struc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 圣誕節(jié)幼兒園創(chuàng)意活動策劃5篇
- 2025年植物油及其制品項目規(guī)劃申請報告模式
- 2025年油煙凈化設備項目提案報告
- 2025年氣動球閥項目提案報告模稿
- 2025年制藥用水設備項目申請報告模范
- 關于高中目標作文集錦五篇
- 物業(yè)主管轉正報告
- 健康促進倡議書范文匯編6篇
- 文明禮儀演講稿范文合集八篇
- 畢業(yè)大學生實習周報【五篇】
- 2024年-電大《中央銀行理論與實務》期末復習資料(作業(yè)、藍本、學習指導(黃本)、試卷)8
- 2024年度物業(yè)管理服務合同糾紛調解協(xié)議3篇
- 《全國較大事故案例》課件
- 2024-2025學年上學期天津初中地理七年級期末模擬卷1
- 2025版國家開放大學法學本科《國際私法》歷年期末紙質考試多項選擇題題庫
- 甘肅蘭州生物制品研究所筆試題庫
- 梅花鹿養(yǎng)殖基地建設項目可行性研究報告
- 《面向生鮮食品配額優(yōu)化的時間序列數(shù)據(jù)分析與應用》
- 網球俱樂部合伙合同模板
- 職工子女教育資助管理制度
- 小學校門口突發(fā)問題應急預案(5篇)
評論
0/150
提交評論