日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2018-2019-1 20189210 《LInux内核原理与分析》第六周作业

發(fā)布時(shí)間:2025/3/16 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2018-2019-1 20189210 《LInux内核原理与分析》第六周作业 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

系統(tǒng)調(diào)用實(shí)驗(yàn)(下):
將第四章的兩個(gè)實(shí)驗(yàn)集成到MenuOS系統(tǒng)中,將其作為MenuOS系統(tǒng)的兩個(gè)命令,新版本的menu中已經(jīng)把兩個(gè)系統(tǒng)調(diào)用添加進(jìn)去了,只需重新克隆一個(gè)新版本的menu。

使用make rootf 打開menu鏡像,可以看到MenuOS菜單中新增了兩條命令,time和time-asm。

使用gdb跟蹤系統(tǒng)調(diào)用內(nèi)核函數(shù)sys_time
同第二個(gè)實(shí)驗(yàn),打開gdb,在函數(shù)中設(shè)置斷點(diǎn),按c繼續(xù)執(zhí)行,在斷點(diǎn)處停下來,可以用list查看這段代碼。
(實(shí)驗(yàn)樓的環(huán)境非???#xff0c;經(jīng)常崩壞)

使用s進(jìn)行單步執(zhí)行,會(huì)進(jìn)入get_seconds()函數(shù),使用finish將函數(shù)執(zhí)行完,之后再單步執(zhí)行,一直到return i代碼獲取時(shí)間數(shù)值。
繼續(xù)單步執(zhí)行,將顯示Cannot find bounds of current function,這是因?yàn)閟ys_time返回后進(jìn)入?yún)R編代碼處理gdb無法繼續(xù)跟蹤。

執(zhí)行int 0x80之后執(zhí)行system_call對(duì)應(yīng)的代碼,在system_call處設(shè)置斷點(diǎn)后執(zhí)行,發(fā)現(xiàn)函數(shù)無法在處停止,說明system_call是一個(gè)特殊的函數(shù),實(shí)際上其不是一個(gè)函數(shù),只是一段匯編代碼的起點(diǎn),gdb不能跟蹤它。

系統(tǒng)調(diào)用的工作,一旦在start_kernel初始化好了以后,運(yùn)行到init x80指令之后,立刻跳轉(zhuǎn)到systime_call這個(gè)位置,entry(system_call),中斷系統(tǒng)調(diào)用處理過程,存在保護(hù)現(xiàn)場,恢復(fù)現(xiàn)場的功能, sys_call_table(%eax,4) 系統(tǒng)調(diào)用表,eax傳過來的是系統(tǒng)調(diào)用號(hào)
syscall_after_call: 保存返回值
syscall_exit: 處理退出工作 有可能發(fā)生進(jìn)程調(diào)度,有可能處理信號(hào)
restore all 返回用戶態(tài)

system_call的代碼:
ENTRY(system_call)
RING0_INT_FRAME
ASM_CLAC
pushl_cfi %eax //保存系統(tǒng)調(diào)用號(hào);
SAVE_ALL //可以用到的所有CPU寄存器保存到棧中
GET_THREAD_INFO(%ebp) //ebp用于存放當(dāng)前進(jìn)程thread_info結(jié)構(gòu)的地址
testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
jnz syscall_trace_entry
cmpl $(nr_syscalls), %eax //檢查系統(tǒng)調(diào)用號(hào)(系統(tǒng)調(diào)用號(hào)應(yīng)小于NR_syscalls),
jae syscall_badsys //不合法,跳入到異常處理
syscall_call:
call *sys_call_table(,%eax,4) //合法,對(duì)照系統(tǒng)調(diào)用號(hào)在系統(tǒng)調(diào)用表中尋找相應(yīng)服務(wù)例程
movl %eax,PT_EAX(%esp) //保存返回值到棧中
syscall_exit:
testl $_TIF_ALLWORK_MASK, %ecx //檢查是否需要處理信號(hào)
jne syscall_exit_work //需要,進(jìn)入 syscall_exit_work
restore_all:
TRACE_IRQS_IRET //不需要,執(zhí)行restore_all恢復(fù),返回用戶態(tài)
irq_return:
INTERRUPT_RETURN //相當(dāng)于iret

使用流程圖來理解system_call流程

小結(jié):
系統(tǒng)調(diào)用是特殊的中斷函數(shù),是多種中斷處理過程的集合。通過INT指令發(fā)起調(diào)用,通過IRET指令用于返回系統(tǒng)調(diào)用到用戶態(tài)結(jié)束。
init ox80是通過中斷向量將信息傳遞給system_call,system_call是通過系統(tǒng)調(diào)用號(hào)于sys_syz()進(jìn)行通信

轉(zhuǎn)載于:https://www.cnblogs.com/20189210mujian/p/9976965.html

總結(jié)

以上是生活随笔為你收集整理的2018-2019-1 20189210 《LInux内核原理与分析》第六周作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。