在线亚洲黄色-在线亚洲观看-在线亚洲电影-在线亚洲成人-岛国大片在线观看免费版-岛国大片在线播放高清

linux編譯內核及添加系統調用2

導讀longsys_add_key。.longsys_request_key。.longsys_keyctl。.代表當前地址,sys_call_table代表數組首地址。這個表依次保存所有系統調用的函數指針,以方便總的系統調用處理函數(system_call)進行索引。調用具體的實現在kernel/sys.c中。asmlinkagelong。sys_getuid16(void)。{;returnhig2lowuid(current_uid)。}; 。剛才我們提到,這一指令使用中斷/異常向量號128(即16進制的80)將控制權轉移給內核,那么中斷向量是怎么形成的。它的定義在(arch/i386/kernel/traps.c)中。void__inittrap_init(void)。{;

?.longsys_add_key.longsys_request_key.longsys_keyctl.代表當前地址,sys_call_table代表數組首地址。這個表依次保存所有系統調用的函數指針,以方便總的系統調用處理函數(system_call)進行索引。調用具體的實現在kernel/sys.c中。asmlinkagelongsys_getuid16(void){returnhig2lowuid(current_uid);}?剛才我們提到,這一指令使用中斷/異常向量號128(即16進制的80)將控制權轉移給內核,那么中斷向量是怎么形成的。它的定義在(arch/i386/kernel/traps.c)中。void__inittrap_init(void){……set_trap_gate(0,÷_error);set_trap_gate(1,&debug);set_intr_gate(2,&nmi);set_system_gate(3,&int3);/*int3-5canbecalledfromall*/set_system_gate(4,&overflow);set_system_gate(5,&bounds);set_trap_gate(6,&invalid_op);set_trap_gate(7,&device_not_available);set_trap_gate(8,&double_fault);set_trap_gate(9,&coprocessor_segment_overrun);set_trap_gate(10,&invalid_TSS);set_trap_gate(11,&segment_not_present);set_trap_gate(12,&stack_segment);set_trap_gate(13,&general_protection);set_intr_gate(14,&page_fault);set_trap_gate(15,&spurIoUs_interrupt_bug);set_trap_gate(16,&coprocessor_error);set_trap_gate(17,&alignment_check);set_trap_gate(18,&machine_check);set_trap_gate(19,&simd_coprocessor_error);set_system_gate(,&system_call);……}上一句就是設置system_call的值。SYSCALL_VECTOR的值就是0X80.那么概括起來,系統調用的過程大致如下:(1)系統調用初始化在traps.c中,系統在初始化程序trap_init()中,通過調用set_system_gate(0x80,*system_call)完成中斷描述表的填充。這樣當每次用戶執行指令int0x80時,系統能把控制轉移到entry.S中的函數中去。(2)系統調用執行system_call會根據用戶傳進來系統調用號,在系統調用表system_call中尋找到相應偏移地址的內核處理函數,進行相應的處理。當然在這個過程之前,要保存環境(SAVE_ALL)。(3)系統調用的返回系統調用處理完畢后,通過sys_call_exit返回。返回之前,程序會檢查一些變量,相應地返回。不一定是返回到用戶進程。真正返回到用戶空間時,要恢復環境(restore_all)。用戶程序中系統調用的過程在前面提到system_call會根據用戶傳進來系統調用號,在系統調用表system_call中尋找到相應偏移地址的內核處理函數,進行相應的處理。那么系統調用號怎么產生,在include/asm-i386/unistd.h中可以看到系統調用號的定義。#define__NR_restart_syscall0#define__NR_exit1#define__NR_fork2#define__NR_read3#define__NR_write4#define__NR_open5#define__NR_close6#define__NR_waitpid7#define__NR_creat8#define__NR_link9……#define__NR_mq_open277#define__NR_mq_unlink(__NR_mq_open+1)#define__NR_mq_timedsend(__NR_mq_open+2)#define__NR_mq_timedreceive(__NR_mq_open+3)#define__NR_mq_notify(__NR_mq_open+4)#define__NR_mq_getsetattr(__NR_mq_open+5)#define__NR_sys_kexec_load283#define__NR_waitid284/*#define__NR_sys_setaltroot285*/#define__NR_add_key286#define__NR_request_key287#define__NR_keyctl288#defineNR_syscalls289此處的代碼是從2.6.11中的代碼,其中系統調用號已到了288,并且與前面system_call中的相對應。每一個系統調用號前都是相應函數名加了__NR_。內核跟用戶程序的交互,其實有標準C庫作為它們之間的橋梁。標準C庫把用戶希望傳遞的參數裝載到cpu的寄存器中,然后觸發0X80中斷。當從系統調用返回的時候(sys_call_exit),標準C庫又接過控制權,處理返回值。對于__NR_,標準C庫會作相應處理。轉換成相應函數。對于系統函數的調用,有幾個通用的宏在include/asm-i386/unistd.h中定義。#define__syscall_return(type,res)do{if((unsignedlong)(res)>=(unsignedlong)(-(128+1))){errno=-(res);res=-1;}return(type)(res);}while(0)#else#define__syscall_return(type,res)return(type)(res)#endif#define_syscall0(type,name)typename(void){long__res;__asm__volatile("int$0x80":"=a"(__res):"0"(__NR_##name));__syscall_return(type,__res);}這是無參函數調用的形式。#define_syscall1(type,name,type1,arg1)typename(type1arg1){long__res;__asm__volatile("int$0x80":"=a"(__res):"0"(__NR_##name),"b"((long)(arg1)));__syscall_return(type,__res);}這是含一個參數的調用形式,……標準C庫會把我們的調用如pause()轉換成相應的形式。pause()intpause(void){long__res;__asm__volatile(“int$0x80”:”=a”(__res):””(__NR_pause));__syscall_return(int,__res);}進入內核調用過程。基礎知識介紹完了,下面來進行我們的實驗:準備如果你安裝的系統包含內核源文件,一般在/usrc路徑下可以看到,那么可以直接跳到步驟3進行內核修改。??首先下載最新的linux2.6.37內核,先修改/usrcnux下的Makefile文件,將內核版本修改成自己的。把2.6.37中Makefile文件頭幾行為:VERSION?=?2PATCHLEVEL?=?6SUBLEVEL?=?37EXTRAVERSION?=?.1我們可以修改成自己版本(2.6.37.rangercyh):VERSION?=?2PATCHLEVEL?=?6SUBLEVEL?=?37EXTRAVERSION?=?rangercyh??下載源代碼如果系統不包含源文件,則需要在網站上下載系統源代碼。在官方網站上下到類似?linux-2.6.37.1.tar.gz的代碼后(大概有70兆左右),放在/usrc/?的目錄下,然后解壓,解壓后會出現文件夾?linux-2.6.37.1。不過貌似最新的代碼已經出到2.6.38了。?

為你推薦
資訊專欄
熱門視頻
相關推薦
win8怎么查看顯示器分辨率 Linux下Vim工具常用命令 win8觸摸板怎么樣設置圖 VNC遠程連接Linux系統設置 LINUXscp命令 ftp530沒有權限 Linux設備文件和普通文件 Linux下配置VNC Linux多命令順序執行 etcfstab文件出錯無法進入Linux系統 Win81Update無法啟動命令幫修復辦法 win81語言包安裝如何操作win881語言包安裝辦法 linux下使用tar命令 win8系統虛擬內存來擴大存儲空間怎么設置 Win8開啟tablet輸入面板的方法 vim配置2 Linux網絡基礎之網絡IP筆記 linux中export用法 Win81Update如何禁用OneDrive同步服務 win8操作系統如何打開xv格式文件 LinuxSSH無密碼login Win8系統怎么樣合并多個txt文件 Ubuntugrubrescue主引導修復 Linux系統怎么架設共享文件服務器 Windows7設置蘋果綠 linux批量重命名 Linux系統下軟件包的制作方法和過程2 解答功能升級解決Win81Update更新問題的辦法 設置多次開機密碼輸入錯誤就鎖定電腦 win81電源管理在何處 不用360如何去除Windows7快捷方式箭頭 Win8鼠標取消單擊鎖定的方法 修改linux下命令提示行路徑長度 Win8系統屏幕亮度調節不了怎么辦 windows7設置防火墻以禁止其他主機訪問本機某 輸入法詞庫導出到其他輸入法的方法輸入法詞庫 Win8軟鍵盤在哪Win81屏幕鍵盤怎么打開的辦法 讓Windows8異地更新計算機的桌面背景 linux下lftp連接ftp服務器上傳下載命令 win8無法關機怎么辦windows8系統關機教程
Top 主站蜘蛛池模板: 波多野氏免费一区 | 国产成人乱码一区二区三区在线 | 国产精品久久久久国产精品 | 日韩综合图区 | 福利一区福利二区 | 在线国产观看 | 国产 日韩 欧美 亚洲 | 国产成人精品久久亚洲高清不卡 | 91精品观看91久久久久久 | 久久无码精品一区二区三区 | 亚洲视频欧洲视频 | 亚洲国产精品婷婷久久 | 国产一区二区在线播放 | 午夜精品一区二区三区在线视 | 国产毛片一区二区三区精品 | 国产日韩中文字幕 | 成人一级视频 | 毛片一区二区三区 | 国产精品ⅴ视频免费观看 | 在线日韩亚洲 | 91香蕉国产亚洲一区二区三区 | 精品欧美一区二区三区精品久久 | 羞羞色院91精品网站 | 91精品专区 | 日韩精品第一 | 日韩电影院 | 极品美女一区二区三区 | 国产麻豆精品免费密入口 | 中文国产成人精品少久久 | 广东东莞一级毛片免费 | 久久久久久久国产高清 | 国产高清在线看 | 亚洲日韩欧美视频 | 欧美色欧美亚洲另类 | 国产精品成人一区二区 | 国产ssss在线观看极品 | 国产一区二区日韩欧美在线 | 久久久一区二区三区 | 亚欧国产 | 日韩专区在线 | bb毛片 |