亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Linux添加內核系統調用報告

系統 1842 0

原創作品,轉載請標明出處 http://blog.csdn.net/yming0221/archive/2011/06/21/6559767.aspx

Linux內核添加系統調用

一、環境說明

?操作系統:Ubuntu 11.04

?舊內核版本:2.6.38.9

?新內核版本:2.6.39

?編譯器版本:GCC 4.5.2

二、實驗目的

?掌握內核的編譯方法

?深入理解內核編譯的原理

?掌握給內核添加系統調用的方法

?了解系統調用的運行機制

?學會在用戶態調用系統調用

三、實驗原理

系統調用:Linux內核中用戶實現系統程序的一組子程序

一個程序的虛擬地址空間分為用戶態和內核態,而用戶進程要想進入內核就要通過系統調用或以內核模塊的形式添加到內核。

下圖展示了系統調用的實現過程(注:該圖來源于網絡資料):

1、C程序通過包含頭文件#include<syscall.h>通過源文件追蹤,找到syscall()函數其實位/usr/include/unistd.h中
如下:
extern long int syscall (long int __sysno, ...) __THROW;
該函數使用INT 0x80軟中斷內核將系統調用號傳遞給保存到eax中,然后將按系統調用號來查找系統調用表中的相應index的函數入口地址。來執行服務例程。
#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
其實是通過宏定義定義系統調用函數
位于./kernel/sys.c中
SYSCALL_DEFINE1(my_traverse_process,int,num)
{
..................................
}
SYSCALL_DEFINE1后的‘1’它表示該系統調用有一個參數,后面參數的含義依次是函數名、參數類型、參數名
該函數執行完畢后,執行syscall_exit并將值返回。
INT 0x80之所以能夠執行,因為系統在啟動時將0x80設置了系統調用中斷門。
三、步驟索引
?編譯升級內核
?添加系統調用后重新編譯內核
?編寫用戶程序調用自己添加的系統調用
四、實驗步驟
1、編譯內核
?從下載Linux內核版本2.6.39
?解壓內核到任意目錄(這里不用必須解壓到/usr/src/下,Linus也說不必那樣做,況且自己也試驗成功)
(*)注:這樣有個缺點,那就是在裝玩模塊后,系統會在/lib/modules/2.6.39/下創建該源碼的軟鏈接用于以后用戶編譯內核使用,當用戶無意將其刪除時,將會造成無法編譯自己的模塊。
?進入內核目錄
?首先配置make menuconfig配置裁剪內核(如果沒有什么必要可以復制/boot/config-***,這是現在的內核配置)
cp /boot/config-*** ./.config
?開始編譯,可以執行make all,當然也可以分步完成
make dep
make clean
make bzImahe
make modules
?安裝內核驅動
make modules_install
?安裝內核
make install
?生成引導鏡像文件,并將其復制到/boot目錄下
mkinitramfs -o initrd.img-2.6.39 2.6.39
cp initrd.img-2.6.39
?最后更新grub
update-grub
?啟動新的內核,成功。
2、修改內核源碼,添加系統調用
?首先打開文件./arch/x86/include/asm/unistd_32.h在最后添加系統調用號,如下(最后一行):
#define __NR_name_to_handle_at 341
#define __NR_open_by_handle_at 342
#define __NR_clock_adjtime 343
#define __NR_syncfs 344
#define __NR_my_traverse_process 345 /*This is added by yan,this is a test for system call*/
?打開./arch/x86/kernel/syscall_table_32.S(最后一行)
.long sys_prlimit64 /* 340 */
.long sys_name_to_handle_at
.long sys_open_by_handle_at
.long sys_clock_adjtime
.long sys_syncfs
.long sys_my_traverse_process
?打開./include/linux/syscalls.h添加系統調用函數的聲明
asmlinkage long sys_my_traverse_process(int num); /*This is added by yan*/
?打開./kernel/sys.c文件添加其實現函數
SYSCALL_DEFINE1(my_traverse_process,int,num)
{
struct task_struct *pos;
struct list_head *current_head;
int count=0;
printk("Traversal module is working../n");
current_head=&(current->tasks);
list_for_each_entry(pos,current_head,tasks)
{
count++;
printk("[process %d]: %s/'s pid is %d/n",count,pos->comm,pos->pid);
}
printk(KERN_ALERT"The number of process is:%d/n",count);
printk(KERN_ALERT"This is a sample test output from kernel!/nAnd this is added by yan/n");
return (long)num;
}
注:該函數的功能是遍歷系統中的進程,并輸出進程名和進程號,并返回輸入的參數值。
?重新編譯內核,這次只需編譯內核,驅動部分沒有改變不用再編譯一遍,以節省時間。
make bzImage
?然后執行 cp ./arch/x86/boot/bzImage /boot/vmlinuz替換原來的內核重新啟動。
?在用戶態編寫程序調用如下:
#include <stdio.h>
#include <unistd.h>
#include <syscall.h>
#define __NR_my_traverse_process 345
int main(void)
{
int input;
printf("Input a num");
scanf("%d",&input);
long a=syscall(__NR_my_traverse_process,input);
printf("The return from kernel is %ld/n",a);
return 0;
}
然后gcc -o traverse_process traverse_process.c
執行./traverse_proces
?執行dmesg命令查看系統調用的執行情況
五、實驗結果
系統調用添加成功。

Linux添加內核系統調用報告


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久青草视频免费观看青 | 久久亚洲精品中文字幕亚瑟 | 免费一级特黄欧美大片久久网 | 九九热精品视频在线播放 | 一区二区三区日韩精品 | 日韩天天干 | 99热这里只有精品第一页 | 日日干夜夜拍 | 波多野结衣在线观看3人 | 国产黄mmd在线观看免费 | 91欧美在线视频 | 日本精品中文字幕在线不卡 | 四虎影视国产精品永久在线 | 天天添天天干 | 国产福利视频在线播放 | 国产精品一区牛牛影视 | 高清视频在线播放 | 成人午夜毛片 | 天天操夜夜骑 | 99热久久精品最新 | 五月中文字幕 | 7777精品久久久大香线蕉 | 色综合久久88一加勒比 | 日韩不卡一区二区三区 | 按摩理论片 | 日日舔夜夜操 | 国产一区二区三区免费在线观看 | 91精品国产自产91精品 | 福利一区在线视频 | 色偷偷91久久综合噜噜噜噜 | 看全色黄大色黄大片色责看的 | 亚洲rv国产rv日本rv | 亚洲国产婷婷香蕉久久久久久 | 8050午夜一级全黄毛片 | 国产福利视频一区二区三区 | 成人亚洲精品7777 | 99热精品在线免费观看 | 久久精品欧美日韩精品 | 五月婷婷在线观看视频 | 国产免费变态视频网址网站 | 日本免费小视频 |