首页 > 编程知识 正文

c++11特性(802.11n信道)

时间:2023-05-04 07:50:30 阅读:79256 作者:1723

1.中断描述表

% 20 % E4 % b8 % e9 % a2 % E5 % 85 % E5 % 88 % 97 % E5 % 87 % ba % E4 % b8 % ad % E6 % ad % E6 % 20e % 90 % E4 % b8 % C3 % B7 _ error % 29 % 3b % 2f % E8 % AE % be7 % BD % AE % e9 % a4 % E6 % 93 % E4 % 20 % BC % E3 % 80 % E4 % bb % canbecalledfromall % 2a % 2f % 0a set _ system _ gate % 284 % 2c overflow % 29 % 3b % 0a set _ system % 284 % 2c overflow % 29 ot _ available % 29 % 3b % 0a set _ trap _ gate % 288 % 2c double _ 2c % 203 b % 0a set _ trap _ gate % 2810 % 2c invalid _ 2c 2c通用_保护% 29 % 3b % 0a set _ trap _ gate % 2814 % 2c page _ fault % 29 % 3b % 0a set _ trap _ gate % 20 % 29 8d % 8f % E5 % a4 % 20t _ trap _ gate % 2839 % 2c % C2 % B6 llel _ interrupt % 29 % 3b % 2f % E8 % AE % be7 % BD % AE % E5 % B2 % E8 % a1 % E5 % 25 % 20ac % E4 % bb % b6irq4% E4 % BF % a1 % E5 % 8f % B7 % 29 % E3 % 80 % 82 % 0a set _ intr _ gate % 2222306; 7 % a1 % AC % E4 % bb % bairq3% E4 % BF % 25 % 20et _ system _ gate % 280 X80 % 2c system _ call % 29 % 3b % 0a set _ intr _ 46 % 29 % E3 % 80 % 82 % 0a set _ trap _ gate % 280 x26 % 2c floppy _ interrupt % 20ad % e9 % 97 % A8 int0x 26 % 2838 % 29 % E3 tem _ call : %0acmpeax %2CNR _ system _ calls-1 % 3b % 2f % E8 % B0 % 83 % E7 % 94 % 25 % 20 % 9a % 84 % E8 % all 0 % 9f % E6 % AE % b5 % E5 % af % 84 % E5 % ad % 98 % E5 % 99 % A8 % E5 % 80 % BC % E3 % 80 % 82 % 0a pushes % 0a pushes % 0 E5 % 87 % BD % 20b % 2f % 2f push % ebx % 2c % ecx % 2c % edxasparameters %0apushebx % 3b % 2f %2ftothesystemcall %0amovedx % ae6 % a5 % b5 % b5 % a5 % a5 % a5 % 25 % 206 % AE % b5 % E6 % 8f % E8 % BF % B0 % E7 % AC % a6 % 29 % E3 % 80 % 0a moves b5 % 28 % E5 % B1 % 80 % e9 % 83 % A8 % E6 % 86f % E8 % 20 % B0 % E7 % AC % a6 % 29 % E3 % 80 % 0a % 3b % 2f % E4 % b8 % e9 % e % 20 % eax %2a4 % E3 % 80 % 82 % E5 % 8f % 82 % 25 % 20 % 3b % 2f % E5 % af % B9 % E5 % ba % 94 % E7 % 9a % 84c % E7 % A8 % % E4 % b8 % aa % E5 % 8c % 85 % E6 % 8b % ac72 % b8 % 25 % 20 % BD % E6 % 95 % B0 % E7 % 9a % 84 % E5 % 9c % B0 % E5 % 9d % 80 % E5 % 85 % a5 % E6 % A0 % E3 % 80 % 82 % 25 amoveax % 2c _ currrr % 20 % 9b % E7 % A8 % ef % BC % 89 % E6 % B0 % E6 % 8d % aee 7 % E8 % BF % 90 % E8 % a1 % E7 % 8a8% BC % BC % E7 % ba % 207 % 8a % B6 % E6 % 80 % 81 % 28状态% E4 % b8 % 8d % E7 % ad %

dword ptr [counter+eax],0 ;// counter     je reschedule ;// 以下这段代码执行从系统调用C 函数返回后,对信号量进行识别处理。 ret_from_sys_call: ;// 首先判别当前任务是否是初始任务task0,如果是则不必对其进行信号量方面的处理,直接返回。 ;// 103 行上的_task 对应C 程序中的task[]数组,直接引用task 相当于引用task[0]。     mov eax,_current ;// task[0] cannot have signals     cmp eax,_task     je l1 ;// 向前(forward)跳转到标号l1。 ;// 通过对原调用程序代码选择符的检查来判断调用程序是否是超级用户。如果是超级用户就直接 ;// 退出中断,否则需进行信号量的处理。这里比较选择符是否为wxdgtx代码段的选择符0x000f ;// (RPL=3,局部表,第1 个段(代码段)),如果不是则跳转退出中断程序。     cmp word ptr [R_CS+esp],0fh ;// was old code segment supervisor ?     jne l1 ;// 如果原堆栈段选择符不为0x17(也即原堆栈不在用户数据段中),则也退出。     cmp word ptr [OLR_DSS+esp],17h ;// was stack segment = 0x17 ?     jne l1 ;// 下面这段代码(109-120)的用途是首先取当前任务结构中的信号位图(32 位,每位代表1 种信号), ;// 然后用任务结构中的信号阻塞(屏蔽)码,阻塞不允许的信号位,取得数值最小的信号值,再把 ;// 原信号位图中该信号对应的位复位(置0),最后将该信号值作为参数之一调用do_signal()。 ;// do_signal()在(kernel/signal.c,82)中,其参数包括13 个入栈的信息。     mov ebx,[signal+eax] ;// 取信号位图??ebx,每1 位代表1 种信号,共32 个信号。     mov ecx,[blocked+eax] ;// 取阻塞(屏蔽)信号位图??ecx。     not ecx ;// 每位取反。     and ecx,ebx ;// 获得许可的信号位图。     bsf ecx,ecx ;// 从低位(位0)开始扫描位图,看是否有1 的位, ;// 若有,则ecx 保留该位的偏移值(即第几位0-31)。     je l1 ;// 如果没有信号则向前跳转退出。     btr ebx,ecx ;// 复位该信号(ebx 含有原signal 位图)。     mov dword ptr [signal+eax],ebx ;// 重新保存signal 位图信息??current->signal。     inc ecx ;// 将信号调整为从1 开始的数(1-32)。     push ecx ;// 信号值入栈作为调用do_signal 的参数之一。     call _do_signal ;// 调用C 函数信号处理程序(kernel/signal.c,82)     pop eax ;// 弹出信号值。 l1: pop eax     pop ebx     pop ecx     pop edx     pop fs     pop es     pop ds     iretd

中断服务程序执行的流程(不分析退出函数的情况):

进入中断服务程序前,硬件会保存相应的一些寄存器,如下图所示:

1.软件上保存用户态寄存器。如ds,es,fs,edx,ecx,ebx。

相当于现在保存在堆栈上的顺序为:ss,esp,eflags,cs,eip,ds,es,fs,edx,ecx,ebx。不过由于显示调用过push,那么在中断程序返回前需要pop,其他的寄存器仍然由硬件自己处理。

2.根据eax,也就是从应用层传过来的参数,定位到sys_call_table中的函数,例如sys_fork,sys_signal等并执行。

3.根据当前任务状态,执行任务调度程序。

4.根据系统调用程序情况,执行信号处理函数do_signal()。

信号处理相关的:

#define SA_NOCLDSTOP 1    // 当子进程处于停止状态,就不对SIGCHLD 处理。 #define SA_NOMASK 0x40000000  // 不阻止在指定的信号处理程序(信号句柄)中再收到该信号。 #define SA_ONESHOT 0x80000000 // 信号句柄一旦被调用过就恢复到默认处理句柄。 #define SIG_DFL ((void (*)(int))0)  /* default signal handling */ // 默认的信号处理程序(信号句柄)。 #define SIG_IGN ((void (*)(int))1)  /* ignore signal */ // 忽略信号的处理程序。

关于do_signal()还是有点复杂的,所以这里说明一下:

首先应用层调用signal(),经过库函数分解后,变成:

Sig:信号值

func:执行的信号函数

Asm汇编格式提一下:

__asm__ ("InstructionList":Output:Input :Clobber/Modify);

在进入中断前,先设置如下内容:

Eax=NR_signal

Ebx=sig

Ecx=func

Edx=sig_restore

另外,sig_restore函数如下:

之后,先调用sys_signal()函数,之前的栈情况如下:

Ebx=sig

Ecx=func

Edx=sig_restore

int sys_signal (int signum, long handler, long restorer)

于是:

Ebx=signum=sig

Ecx=handler=func

Edx=restore=sig_restore

之后,进入中断程序以及进入到do_signal():

其实,信号函数基本上是在模拟硬件中断的过程,信号函数就是一个软件中断,在执行完信号函数后,需要继续按照原来的步骤继续运行。

这里说需要按照原来的执行步骤继续运行,那么就需要保存好原来的eip值。

现在需要在退出内核态进入用户态后,执行信号服务函数,所以将eip指向了信号处理函数,

继续分析,如果直接返回,则直接弹出所有进入system_call入栈的值。

那么,按照这个逻辑顺序,会进入用户态程序,然后执行了eip指向的函数。这个函数会操作esp值,不过最终该函数会ret。

备注:

在汇编通过call调用C代码的时候,cpu会把call指令的下一条指令的地址(返回地址)压入栈中(eip)。在最后执行ret指令时,就会将压入的eip弹出来,以至于执行正常的流程了。

接着上面的过程说,目前的eip已经被设置了,但是返回地址却没有人工干预,所以在执行完函数之后,ret就会弹出esp的最顶端的内容作为eip的值。由于信号处理函数已经执行完毕,很显然需要执行以前的流程(无信号到来的流程),所以需要在堆栈上设置sa_restore,

再根据:sig_restore的定义,故还需要在堆栈上设置信号signr,接着是eax,ecx,edx,因为它们在后面被弹出了,所以必须在这里要压栈。后面还需要压栈eflags,还是因为sig_restore有调用popfl弹出栈的过程。最后就是压入前面的执行过程中的eip,最终就恢复执行原来的流程了。

这么写下来,整个逻辑其实就还挺简单了。

还需要考虑一个问题,那就是signal()并不是可靠的。

原因:

一个进程A调用signal()创建信号与信号函数,另外一个进程B给进程A发送信号,然后执行进程A的信号处理函数,这个时候其实A的信号句柄为NULL(do_signal()中sa->sa_handler=NULL),那么如果有进程C给A发信号,最终do_signal()其实什么也没干就返回了,最终导致信号丢失。

信号的设计思路:

1.signal()用来挂接设置相应的信号处理函数与返回地址。发信号函数(例如sys_kill())用来设置指定的信号位图。最后使用定时器轮询来执行do_signal()。最终实际让整个信号机制工作起来的就是它。

从这个角度再看看看signal()可靠性:signal()设置处理函数,sys_kill()发送信号,之后定时器到来,发现了需要执行信号处理函数,然后就执行了。之后有一个进程发送再次信号,定时器时间又到了,再次执行do_signal(),发现信号处理函数为NULL,最终就导致没有执行信号处理函数。所以,需要保证在执行do_signal()之前,signal()已经重新设置了才能保证可靠性。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。