关于函数调用的参数传递
前几天和王老师在调式一个程序,调试结果怎么都不正确。其实形式很简单: printf("%d; %d", sum(), m); m是一个静态变量,在sum中改变,但是打印结果还是没有变化。 当然在后来我又作了一个测试发现在gcc编译的程序中他是以左优先的,也就是先打印计算m的结果,让后在计算sum的结果,再打印。
May 26, 2009
对audit_context结构的注释
/* The per-task audit context. */ struct audit_context { int dummy; /* must be the first element */ int in_syscall; /* 1 if task is in a syscall 该值是:1 则表示任务在系统调用中 */ enum audit_state state, current_state; //审计级别 有AUDIT_DIABLED:不实用审计 //AUDIT_BUILD_CONTEXT:创建审计数据结构并做填充 //AUDIT_RECORD_CONTEXT:创建审计数据结构并作填充,在系统调用开始和结束时都做记录。 unsigned int serial; /* serial number for record */ struct timespec ctime; /* time of syscall entry */ int major; /* syscall number :系统调用号*/ unsigned long argv[4]; /* syscall arguments :系统调用传递的参数*/ int return_valid; /* return code is valid */ long return_code;/* syscall return code */ u64 prio; int name_count; //记录了多少个文件对象,即下面这个names的实际个数 struct audit_names names[AUDIT_NAMES]; //记录所审计的文件系统对象的名字 char * filterkey; /* key for rule that triggered record */ struct path pwd; struct audit_context *previous; /* For nested syscalls */ struct audit_aux_data *aux; //保存附加的审计数据 struct audit_aux_data *aux_pids;//保存在审计时所收到系统信号的进程的进程号 struct sockaddr_storage *sockaddr;//网络部分审计数据保存 size_t sockaddr_len; /* Save things to print about task_struct */ //以下这些都和task_struct中相应的数据项基本一致 pid_t pid, ppid; uid_t uid, euid, suid, fsuid; gid_t gid, egid, sgid, fsgid; unsigned long personality; int arch; pid_t target_pid; uid_t target_auid; uid_t target_uid; unsigned int target_sessionid; u32 target_sid; char target_comm[TASK_COMM_LEN]; struct audit_tree_refs *trees, *first_trees; int tree_count; int type; //一下所记录的pid,gid等和task_struct中记录的一样 union { struct { int nargs; long args[6]; } socketcall; struct { uid_t uid; gid_t gid; mode_t mode; u32 osid; int has_perm; uid_t perm_uid; gid_t perm_gid; mode_t perm_mode; unsigned long qbytes; } ipc; struct { mqd_t mqdes; struct mq_attr mqstat; } mq_getsetattr; struct { mqd_t mqdes; int sigev_signo; } mq_notify; struct { mqd_t mqdes; size_t msg_len; unsigned int msg_prio; struct timespec abs_timeout; } mq_sendrecv; struct { int oflag; mode_t mode; struct mq_attr attr; } mq_open; struct { pid_t pid; struct audit_cap_data cap; } capset; }; int fds[2]; #if AUDIT_DEBUG int put_count; int ino_count; #endif }; 看完本文有收获?请分享给更多人 关注「黑光技术」,关注大数据+微服务
May 10, 2009
让人疯狂的”五一“三天(3)
五月三号:兄弟聚会 早上10点半了才起来,洗洗刷刷到了11点,回到学校已经快到12点了,感坐下来,打开电脑,收看了一下邮件。蟋蟀就来电话了“快来,吃饭!”,“好,马上到。”干脆利嗦,没什么好犹豫的,再说说好和小方她们去大唐遗址公园的,不过那要到下午5,6点了才去的,兄弟们的聚会还是一定要参加的。我们高中就是一个班,现在又在同一座城市里。不能回家,也得让我们有点在家的感觉阿。
May 4, 2009
让人疯狂的”五一“三天(2)
五月二号:小方回来 前几天小方说要回来了,博士终于考完了,在等成绩,需要放松一下心情,也是故地重游。这一天她是终于来了。不过前几天也是发生了一点小意外。我的手机两天了有信号,但是就是收不到什么电话和信号,以至于把给她买票的事耽误了,最后她只买到5号回去的票。不过我还是心里窃喜的,可以多留几天么。。。呵呵。
May 4, 2009
自定义ELF文件中的section
在看内核代码的时候发现,原来ELF文件的section是完全可以自己定义的。当然这只是作新的增加。 今天请教了王老师,并做了一个简单的测试。但是具体的用意还有点不是很清楚,还有待继续分析ELF文件。
April 30, 2009
内核审计系统初步分析(1)
最近一段时间在看内核关于审计的东西,今天作一点最近看的整理,内核的审计系统也算是比较新的东西了,还有内核跟踪一类的动西,也是在2。6。30中才看到有独立的目录了。 其实内核的审计还是没有跳出对进程的管理,也主要是是对每个进程的活动情况进行记录。在struct thread_info结构中的flags项中有增加了许多的内容,其中就有几个标志就是关于是否启用内核审计的。如下面的几项:
April 27, 2009
系统调用简单分析
#define CFI_STARTPROC .cfi_startproc //用在每个函数的开始,用于初始化一些内部数据结构 #define CFI_ENDPROC .cfi_endproc //在函数结束的时候使用与.cfi_startproc相配套使用 #define CFI_DEF_CFA .cfi_def_cfa //定义计算CFA的规则 #define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register //xx reg ,offset reg中的值保存在offset中,offset是CFA的 #define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset //xx offset 修改计算CFA的规则,reg中的值不发生变化,之改变offset #define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset //与上面相似但是修改前面一个offset #define CFI_OFFSET .cfi_offset //xx reg ,offset reg中的值保存在offset中,offset是CFA的 #define CFI_REL_OFFSET .cfi_rel_offset #define CFI_REGISTER .cfi_register #define CFI_RESTORE .cfi_restore #define CFI_REMEMBER_STATE .cfi_remember_state #define CFI_RESTORE_STATE .cfi_restore_state #define CFI_UNDEFINED .cfi_undefined .macro RING0_INT_FRAME CFI_STARTPROC simple CFI_SIGNAL_FRAME CFI_DEF_CFA esp, 3*4 /*CFI_OFFSET cs, -2*4;*/ CFI_OFFSET eip, -3*4 .endm # system call handler stub ENTRY(system_call) RING0_INT_FRAME # can't unwind into user space anyway pushl %eax # save orig_eax //保存原来的eax中的值 CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL //保存系统寄存器信息 GET_THREAD_INFO(%ebp) //获取thread_info结构的地址 # system call tracing in operation / emulation testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) //检测thread_info中的相关标志看是否有系统跟踪 jnz syscall_trace_entry //有系统跟踪则先执行系统跟踪的代码,然后转跳回来(这在syscall_trace_entry中有写的) cmpl $(nr_syscalls), %eax //比较请求的系统调用号和最大系统调用号(验证系统调用号是否有效) jae syscall_badsys //如果请求系统调用号无效则退出 syscall_call: call *sys_call_table(,%eax,4) //跳转到系统调用表中,系统调用表是4字节对齐。 movl %eax,PT_EAX(%esp) # store the return value syscall_exit: LOCKDEP_SYS_EXIT //用于调试使用,只有在开启调试的时候才会去检测系统调用深度 DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt # setting need_resched or sigpending # between sampling and the iret //#define ENABLE_INTERRUPTS(x) sti //#define DISABLE_INTERRUPTS(x) cli TRACE_IRQS_OFF //关闭中断跟踪 movl TI_flags(%ebp), %ecx // testl $_TIF_ALLWORK_MASK, %ecx # current->work //检测是否可以返回用户空间 jne syscall_exit_work syscall_exit_work: testl $_TIF_WORK_SYSCALL_EXIT, %ecx jz work_pending TRACE_IRQS_ON //开启系统中断跟踪 ENABLE_INTERRUPTS(CLBR_ANY) # could let syscall_trace_leave() call # schedule() instead //允许中断 movl %esp, %eax call syscall_trace_leave jmp resume_userspace END(syscall_exit_work) 看完本文有收获?请分享给更多人 关注「黑光技术」,关注大数据+微服务
April 25, 2009