在现有的系统中添加一个不用传递参数的系统调用。这个系统调用的功能是实现遍历系统中的所有进程。实验主要内容:
sudo apt-get install libncurses5-dev //如果没有ncurses库,则安装
#su //输入密码,用户权限改为root权限。或用sudo命令
#mv linux-3.6.8.tar.bz2 ~ //把内核代码文件移到主目录。
# cd ~ //进入主目录
# tar jxvf linux-3.6.8.tar.bz2 //解压内核包,生成的内核源代码放在linux.3.6.8目录中
# cd linux-3.6.8
/usr/include/asm-generic/unistd.h
include/asm-generic/unistd.h
/* mm/fadvise.c */
/*
#define __NR3264_fadvise64 223
__SC_COMP(__NR3264_fadvise64, sys_fadvise64_64, compat_sys_fadvise64_64)
*/
#define __NR_rksyscall 223
__SYSCALL(__NR_rksyscall, sys_rksyscall)
arch/x86/kernel/syscall_table_32.S
修改编号223对应的代码段:
# 222 is unused
# 223 is used now
223 i386 mysyscall sys_rksyscall
224 i386 gettid sys_gettid
225 i386 readahead sys_readahead
asmlinkage int sys_mysyscall(void)
{
//在此处加入遍历进程的代码
struct task_struct *p;
printk("********************************************\n");
printk("------------the output of rkcall------------\n");
printk("********************************************\n\n");
printk("%-20s %-6s %-6s %-20s\n","Name","pid","state","ParentName");
for(p = &init_task; (p = next_task(p)) != &init_task;)
printk("%-20s %-6d %-6d %-20s\n",p->comm , p->pid, p->state, p->parent->comm);
return 0;
}
cp /boot/config- .config // 为键盘上按键,或使用
cp /boot/config-`uname -r` .config //使用系统的原配置文件
make menuconfig // 同时生成.config文件
若在3.6.8内核编译存在错误
“ERROR:”__modver_version_show” [drivers/staging/rts5319/rts5319.ko] underfined”。
则在make menuconfig 做如下修改:
Device drivers ---
Staging drivers--
Realtek RTS5139 USB card reader support
中把 [M] 改为 [ ](3.6.8内核此时看说明,按键盘上的N),即不编译成模块
sudo make 或 sudo make -j2(-j2为开启双线程编译)(此步需要1-2小时不等)
# sudo make modules_install
# sudo make install
查看及修改启动选项# gedit /boot/grub/grub.cfg
重新启动
sudo reboot
//启动时忽略错误信息提示
启动后查看内核版本号
uname -r
3.6.8
#include
#include
//系统调用号根据实验具体
//#define __NR_ mysyscall 223
//数字而定
int main()
{
syscall(__NR_mysyscall); /*或 syscall(223) */
//在此加入在屏幕输出每个进程相关信息的代码;
//要求从/var/log/message 文件中读出信息。
}
//编译运行
gcc -o test test.c
./test
dmesg //查看进程信息