Linux内核编程实战经验谈
来源:
作者:
时间:2007-01-09
Tag:
点击:
| (5)重启系统 |
| 当重启后出现 lilo: 提示时输入新内核的标号(按TAB键可显示所有的标号): |
| 以上步骤在pentium Ⅲ/64M/20G、Red Hat Linux 6.0(2.2.5-15)机上测试通过。 |
| 在实际编程中,尤其是当我们需要增加或完善系统功能的时候,我们经常会用到系统调用函数。系统调用函数通常由用户进程在用户态下调用,内核通过system_call 函数响应系统调用产生的软中断,在正确访问核心栈、系统调用开关表之后陷入到操作系统内核中进行处理。 |
| 系统调用是用户进程由用户态切换到核心态的一种常见方式。利用编写系统调用函数来直接调用了部分操作系统内核代码,也是Linux内核编程者必修之功。下面笔者以在Linux中创建一个名为print_info的系统调用函数为例,来说明如何为内核增加系统调用。 |
| # cd /usr/src/linux/kernel |
| asmlinkage int sys_print_info(int testflag) |
| printk(" Its my syscall function!n"); |
| 该函数有一个int型入口参数testflag,并返回整数0。 |
| # cd /usr/src/linux/arch/i386/kernel |
| 把函数的入口地址加到sys_call_table表中: |
| arch/i386/kernel/entry.S中的最后几行源代码修改前为: |
| .long SYMBOL_NAME(sys_sendfile) |
| .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */ |
| .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */ |
| .long SYMBOL_NAME(sys_vfork) /* 190 */ |
| .long SYMBOL_NAME(sys_ni_syscall) |
| .long SYMBOL_NAME(sys_sendfile) |
| .long SYMBOL_NAME(sys_ni_syscall) /* streams1 */ |
| .long SYMBOL_NAME(sys_ni_syscall) /* streams2 */ |
| .long SYMBOL_NAME(sys_vfork) /* 190 */ |
| .long SYMBOL_NAME(sys_print_info) /* added by I */ |
| # cd /usr/src/linux/include/asm |
| 把增加的sys_call_table表项所对应的向量,在include/asm/unistd.h中进行必要申明,以供用户进程和其他系统进程查询或调用。 |
| #define __NR_print_info 191 /* added by I */ |