freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)大綱畢業(yè)論文-資料下載頁

2025-06-28 09:51本頁面
  

【正文】 v數(shù)組傳遞到它的shell參數(shù)??蓞⒖既缦麓a:  int main( int argc, char *argv[] ) {    char repTypeName[16]?!       ?/ 決定報(bào)告類型    reportType = STANDARD?!   trcpy( repTypeName, “Standard” )?!   f ( argc 1) {      sscanf( argv[1], “%c%c”, amp。c1, amp。c2 )?!     f ( c1 != ““ ) {        fprintf( stderr, “usage: observer [s] [l int dur] \n” )?!       xit(1)?!           if ( c2 == ‘s’ ) {        reportType = SHORT。        strcpy( repTypeName, “Short” )。      }      if ( c2 == ‘l’ ) {        reportType = LONG?!       trcpy( repTypeName, “Long” )?!       nternal = atoi( argv[2] )。        duration = atoi( argv[3] )?!         }    …  }  在得到今天的當(dāng)前時(shí)間并打印出一個(gè)包含你所檢查機(jī)器名字的問候之后,就完成了初始化工作?! nclude sys/  …  // 完成初始化  gettimeofday( amp。now, NULL )。 //得到當(dāng)天時(shí)間  printf( “Status report type %s at %s\n”, repTypeName, ctime( amp。( ) ) )?! ?/ 得到主機(jī)文件名并打印它  thisPorcFile = fopen( “/proc/sys/kernel/hostname”, “r” )。  fgets( lineBuf, LB_SIZE+1, thisPorcFile )。  printf( “Machine hostname: %s”, lineBuf )。  fclose( thisPorcFile )。  現(xiàn)在可以準(zhǔn)備開始工作,也就是說,通過使用各種/proc文件開始讀取內(nèi)核變量。上述代碼段包含一個(gè)如何讀取/proc/sys/kernel/hostname文件的例子??梢杂盟鳛樵屯ㄟ^讀取其他的偽文件來完成練習(xí),這需要對/proc進(jìn)行一些探索以及在研究不同的目錄時(shí)對各種偽文件進(jìn)行檢查。  在C部分中將要計(jì)算平均負(fù)載。對于這個(gè)問題,代碼需要睡眠一段時(shí)間,醒來后采樣當(dāng)前平均負(fù)載,然后再返回睡眠狀態(tài)。這里是一段可以完成該工作的代碼:  while( iteration duration) {    sleep( interval )。    sampleLoadAvg()。    iteration += interval?!  實(shí)驗(yàn)四 系統(tǒng)調(diào)用1.實(shí)驗(yàn)?zāi)康摹 W(xué)習(xí)如何產(chǎn)生一個(gè)系統(tǒng)調(diào)用以及怎樣通過內(nèi)核往內(nèi)核中增加一個(gè)新函數(shù)從而在內(nèi)核空間中實(shí)現(xiàn)對用戶空間的讀/寫。2.問題陳述A) 設(shè)計(jì)并實(shí)現(xiàn)一個(gè)新的內(nèi)核函數(shù)pedagogictime(),該函數(shù)通過使用一個(gè)引用參數(shù)的調(diào)用返回當(dāng)前的系統(tǒng)時(shí)間。如果flag參數(shù)是TRUE,那么內(nèi)核函數(shù)就把當(dāng)前的系統(tǒng)時(shí)間打印在stdout上。函數(shù)具有如下原型:  int pedagogictime( int flag, struct timeval *current_time )?! ⌒潞瘮?shù)基本上和gettimeofday()類似,當(dāng)然忽略時(shí)區(qū)參數(shù),并有一個(gè)標(biāo)志來控制把信息打印到控制臺(tái)。該函數(shù)如果執(zhí)行成功,就返回TRUE;否則就返回FLASE。B) 編寫一個(gè)用戶空間程序來測試pedagogictime()。3.解決方案 系統(tǒng)調(diào)用表  Linux通過陷阱指令調(diào)用內(nèi)核空間的系統(tǒng)調(diào)用。在i386硬件中,陷阱指令實(shí)際上會(huì)將ISR地址指向system_call()匯編程序的入口地址,從而激發(fā)0x80中斷。這些代碼使用一個(gè)參數(shù)作為sys_call_table(在arch/i386/kernel/)的偏移量。這個(gè)系統(tǒng)調(diào)用表的定義如下(可能與你的內(nèi)核版本相關(guān)):  .data  ENTRY(sys_call_table)    .long SYMBOL_NAME(sys_ni_call) /* 0 */    .long SYMBOL_NAME(sys_exit)    .long SYMBOL_NAME(sys_fork)    .long SYMBOL_NAME(sys_read)    .long SYMBOL_NAME(sys_write)    .long SYMBOL_NAME(sys_open)    …    .long SYMBOL_NAME(sys_signalstack)    .long SYMBOL_NAME(sys_sendfile)    .long SYMBOL_NAME(sys_ni_call)    .long SYMBOL_NAME(sys_ni_call)    .long SYMBOL_NAME(sys_fork)    /* 注意!!這不是精確的——我們只要確保具有足夠的”sys_ni_call”條目。所以     當(dāng)我們每次增加一個(gè)新的系統(tǒng)調(diào)用時(shí),如果你發(fā)現(xiàn)這沒有縮小,請不必驚慌。 */    .rept     .long SYMBOL_NAME(sys_ni_call)    .endr  表項(xiàng)1包含了exit()系統(tǒng)調(diào)用(名為sys_exit的內(nèi)核函數(shù))的地址,表項(xiàng)2包含了fork()系統(tǒng)調(diào)用的地址,依此類推。 定義系統(tǒng)調(diào)用編號(hào)  系統(tǒng)調(diào)用是在sys_call_table中定義的。這樣當(dāng)增加一個(gè)新的系統(tǒng)調(diào)用時(shí),就必須在這個(gè)表中增加一個(gè)表項(xiàng)??梢酝ㄟ^在arch/i386/kernel/,如下所示:  .data  ENTRY(sys_call_table)    .long SYMBOL_NAME(sys_ni_call) /* 0 */    .long SYMBOL_NAME(sys_exit)…    .long SYMBOL_NAME(sys_ni_call) /* 190 */    .long SYMBOL_NAME(sys_my_new_call) /* 191 */    .endr  以上操作增加一個(gè)使用191參數(shù)的陷阱來調(diào)用新的內(nèi)核函數(shù)sys_my_new_call()。注意通過編輯這個(gè)文件,就改變了原始內(nèi)核源代碼拷貝。,以便恢復(fù)系統(tǒng)之用。  這個(gè)新的系統(tǒng)調(diào)用可以通過使用系統(tǒng)調(diào)用syscall()進(jìn)行調(diào)用,syscall()使用系統(tǒng)調(diào)用表的一個(gè)表項(xiàng)編號(hào)和參數(shù)作為參數(shù)然后中斷進(jìn)入內(nèi)核?! 榱水a(chǎn)生系統(tǒng)調(diào)用stub以便普通C函數(shù)調(diào)用可以進(jìn)行新的系統(tǒng)調(diào)用,還需要編輯如下所示的include/asm/,這樣這個(gè)系統(tǒng)調(diào)用才能使用?! efine __NR_exit 1  define __NR_fork 2  define __NR_read 3  define __NR_write 4  define __NR_open 5  …  define __NR_sched_get_priority_min 160  define __NR_sched_rr_get_interval 161  define __NR_nanosleep 162  define __NR_mremap 163  define __NR_poll 168  define __NR_getpmsg 188  define __NR_putpmsg 189  define __NR_vfork 190  define __NR_my_new_call 191 引用用戶空間內(nèi)存地址  函數(shù)可能有一個(gè)通過引用調(diào)用的參數(shù),內(nèi)核函數(shù)需要把信息寫入該參數(shù)中的用戶空間地址。也就是說,這個(gè)參數(shù)是一個(gè)指針,它指向在調(diào)用函數(shù)中聲明的一個(gè)變量。內(nèi)核函數(shù)是在內(nèi)核數(shù)據(jù)段中執(zhí)行的,因此內(nèi)存變換機(jī)制不允許正在內(nèi)核空間執(zhí)行的進(jìn)程在不改變保護(hù)機(jī)制的狀態(tài)下寫入用戶數(shù)據(jù)段。在內(nèi)核中從用戶空間內(nèi)存讀出數(shù)據(jù)或者寫入數(shù)據(jù)時(shí),內(nèi)核都應(yīng)該首先使用下面的函數(shù)進(jìn)行檢查,來看一下這些地址是否合法的在用戶虛擬地址空間中定義:  verify_area( int type, const void *addr, unsigned long size )?! ≡摵瘮?shù)檢查讀操作(type被設(shè)置為VERIFY_READ)和寫操作(type被設(shè)置為VERIFY_WRITE)的有效性。參數(shù)addr定義了要驗(yàn)證的地址,參數(shù)size是內(nèi)存中要驗(yàn)證的字節(jié)數(shù)。如果允許對這塊內(nèi)存區(qū)域進(jìn)行操作,那么verify_area()就返回0;否則就返回非0值。下面是一個(gè)典型的代碼段,它驗(yàn)證內(nèi)核對一個(gè)長度為buf_len的buf內(nèi)存塊的讀能力?! lag = verify_area( VERIFY_READ, buf, buf_len )?! f ( flag ) {    … // 錯(cuò)誤——不能讀取緩沖區(qū)  }  如果內(nèi)核可以讀/寫這段內(nèi)存塊,那么就使用下面這兩個(gè)函數(shù)來實(shí)際讀寫用戶地址空間。  memcpy_fromfs( void *to, void *from, unsigned long n )。  memcpy_tofs( void *to, void *from, unsigned long n )?! emcpy_fromfs()用于讀用戶空間地址,memcpy_tofs()用于寫用戶空間地址。參數(shù)to是數(shù)據(jù)拷貝操作的目的地址,參數(shù)from是數(shù)據(jù)拷貝操作的源地址,參數(shù)n是要拷貝的字節(jié)數(shù)。 內(nèi)核printk()函數(shù)  當(dāng)編寫內(nèi)核代碼時(shí),開發(fā)和調(diào)試程序經(jīng)常想把信息打印到stdout上。當(dāng)然,實(shí)現(xiàn)內(nèi)核的軟件不能使用stdio程序庫,也就是說不能使用printf()向stdout寫入信息。因此,內(nèi)核程序員自己開發(fā)了printf()的內(nèi)核版本,稱為printk()。printk()與printf()的用法類似。 組織方案  為了使第一個(gè)內(nèi)核函數(shù)能夠正常工作,需要學(xué)習(xí)很多細(xì)節(jié)內(nèi)容。因此建議大家采用保守的、循序漸進(jìn)的策略來開發(fā)自己的第一個(gè)內(nèi)核函數(shù)。這里是一些指導(dǎo):  對于第一個(gè)調(diào)試版本來說,應(yīng)該著重于能使系統(tǒng)調(diào)用接口正常工作。它不使用參數(shù),也不要返回任何值。相反,函數(shù)應(yīng)該在函數(shù)體中只執(zhí)行一個(gè)printk(),這樣你就可以看到已經(jīng)在內(nèi)核中成功實(shí)現(xiàn)了一個(gè)完整的函數(shù)并且系統(tǒng)調(diào)用接口可以正常工作了?! 〗酉聛?,建立程序的一個(gè)過渡版本,它可以把一個(gè)參數(shù)傳遞進(jìn)內(nèi)核(通過值調(diào)用),但是并不希望內(nèi)核把任何內(nèi)容寫回用戶空間。  第3個(gè)版本是一個(gè)簡單的通過引用調(diào)用的調(diào)用。必須使用verify_area()來引用用戶空間,使用memcpy_fromfs()從用戶空間中讀取信息,并在調(diào)用返回時(shí)使用memcpy_tofs()把數(shù)據(jù)寫入用戶空間?! ∵@里是一個(gè)內(nèi)核函數(shù)可以參考的代碼框架?! nclude sys/  include linux/  include linux/  asmlinkage int sys_pedagogictime( int flag, struct timeval *thetime )  {    int write_ok?!   ?* 從內(nèi)核變量xtime中獲得系統(tǒng)時(shí)間。讀取xtime可能不會(huì)引起同內(nèi)核其他部分的     競爭狀態(tài),但是你應(yīng)該謹(jǐn)慎并且在讀取共享變量時(shí)阻塞中斷。 */    cli()。 /* 禁止中斷 */    …    sti()。 /* 允許中斷 */    /* 加載編碼時(shí)間 */    write_ok = verify_area( VERIFY_WRITE, … )?!   f ( write_ok ) {      printk( “skelcall: Cannot write into user space\n.” )?!     eturn?!       …    /* 如果標(biāo)記為TRUE,輸出時(shí)間 */    printk( … )。    return 0。  }  將sys_pedagogictime()。,備份原始文件以確保完成本實(shí)驗(yàn)后可以恢復(fù)系統(tǒng)?! ∽詈螅匦戮幾g內(nèi)核,并寫一個(gè)用戶空間程序來測試新的系統(tǒng)調(diào)用pedagogictime()。注意!本實(shí)驗(yàn)產(chǎn)生一個(gè)新的內(nèi)核,在你的LILO中新加入一個(gè)啟動(dòng)選項(xiàng)來作為本實(shí)驗(yàn)的調(diào)試內(nèi)核。袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃螞肂莈蒂螄羋芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羈莀蒈羃膇芆蕆蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃蠆羆艿薃袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃螞肂莈蒂螄羋芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羈莀蒈羃膇芆蕆蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃蠆羆艿薃袁節(jié)膅薂羄肅蒃薁蚃芀荿薀螆肅芅蕿袈羋膁蚈羀肁蒀蚇蝕襖莆蚇螂肀莂蚆羅袂羋蚅蚄膈膄蚄螇羈蒂蚃衿膆莈螞羈罿芄螁蟻膄膀螁螃羇葿螀裊膃蒅蝿肈羆莁螈螇芁芇莄
點(diǎn)擊復(fù)制文檔內(nèi)容
法律信息相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1