• 2017-2018-1 20155214 《信息安全系统设计基础》 第8周课下作业


    2017-2018-1 20155214 《信息安全系统设计基础》

    第8周课下作业

    课下练习内容

    完成家庭作业4.47,4.48,4.49
    相应代码反汇编成X86-64汇编
    把上述X86-64汇编翻译成Y86汇编,并给出相应机器码

    把课上练习3的datetime服务器分别用多进程和多线程实现成并发服务器并测试

    家庭作业4.47

    作业要求:
    写一个执行冒泡排序的Y86-64程序
    A:书写并测试一个C版本,用指针引用数组元素,而不是用数组索引。
    B:书写并测试这个函数和测试代码组成的Y86-64程序。

    • 指针版本的冒泡排序
    /*Bubble sorts:Pointer version*/
    void bubble_p(long *data,int count){
    
        long i,last,t;
        for(last = count-1;last > 0; last--){
        
            for(i = 0;i < last; i++){
            
                if(*(data+i+1)<*(data+i)){
                
                    t = *(data+i+1);
                    *(data+i+1) = *(data+i);
                    *(data+i) = t;
                }
            }
        }
    }
    
    • 先使用gcc -O2 -c bubble.c优化编译冒泡排序,这样编译出来的汇编代码量比较少。
    • 使用命令objdump -d bubble.o > bubble_x86-64.txt将反汇编的x86-64汇编代码储存到文本中。
    • 然后我们打开y86-64模拟器,将x86-64代码翻译为y86-64代码

    • bubble.c(Y86代码)
                                   | 
    0x0000:                        | Disassembly of section .text:
                                   | 
    0x0000:                        | 00000000 <bubble_p>:
    0x0000:                        |    0:	56                   	push   %esi
    0x0000:                        |    1:	53                   	push   %ebx
    0x0000:                        |    2:	8b 44 24 10          	mov    0x10(%esp),%eax
    0x0000:                        |    6:	8b 54 24 0c          	mov    0xc(%esp),%edx
    0x0000:                        |    a:	8d 70 ff             	lea    -0x1(%eax),%esi
    0x0000:                        |    d:	85 f6                	test   %esi,%esi
    0x0000:                        |    f:	7e 2d                	jle    3e <bubble_p+0x3e>
    0x0000:                        |   11:	8d b4 26 00 00 00 00 	lea    0x0(%esi,%eiz,1),%esi
    0x0000:                        |   18:	31 c0                	xor    %eax,%eax
    0x0000:                        |   1a:	8d b6 00 00 00 00    	lea    0x0(%esi),%esi
    0x0000:                        |   20:	8b 4c 82 04          	mov    0x4(%edx,%eax,4),%ecx
    0x0000:                        |   24:	8b 1c 82             	mov    (%edx,%eax,4),%ebx
    0x0000:                        |   27:	39 d9                	cmp    %ebx,%ecx
    0x0000:                        |   29:	7d 07                	jge    32 <bubble_p+0x32>
    0x0000:                        |   2b:	89 5c 82 04          	mov    %ebx,0x4(%edx,%eax,4)
    0x0000:                        |   2f:	89 0c 82             	mov    %ecx,(%edx,%eax,4)
    0x0000:                        |   32:	83 c0 01             	add    $0x1,%eax
    0x0000:                        |   35:	39 f0                	cmp    %esi,%eax
    0x0000:                        |   37:	7c e7                	jl     20 <bubble_p+0x20>
    0x0000:                        |   39:	83 ee 01             	sub    $0x1,%esi
    0x0000:                        |   3c:	75 da                	jne    18 <bubble_p+0x18>
    0x0000:                        |   3e:	5b                   	pop    %ebx
    0x0000:                        |   3f:	5e                   	pop    %esi
                                   | 
    0x0000:                        | Disassembly of section .text.startup:
                                   | 
    0x0000:                        | 00000000 <main>:
    0x0000:                        |    0:	31 c0                	xor    %eax,%eax
    

    datetime服务器

    作业要求:
    1.实现多进程的并发服务器
    2.实现多线程的并发服务器

    多进程的并发服务器

    设计思路
    在datetime服务器的基础上,在服务器循环监听中调用fork()生成子进程连接下一个客户端。其中需要用到一个SIGCHLD处理程序回收子进程资源。

    void sigchld_handler(int sig){
    
        pid_t pid;
        int stat;
    
        while((pid = waitpid(-1,&stat,WNOHANG))>0){
            printf("child %d terminated
    ",pid);
        }
        return;
    }
    
    • SIGCHLD的产生条件:
      子进程终止时
      子进程接收到SIGSTOP信号停止时
      子进程处在停止态,接受到SIGCONT后唤醒时
      借助SIGCHLD信号回收子进程

    • signal 的第1个参数signum表示要捕捉的信号,第2个参数是个函数指针,表示要对该信号进行捕捉的函数,该参数也可以是SIG_DEF(表示交由系统缺省处理,相当于白注册了)或SIG_IGN(表示忽略掉该信号而不做任何处理)。signal如果调用成功,返回以前该信号的处理函数的地址,否则返回 SIG_ERR。

    多线程的并发服务器

    设计思路

    • 主线程监听客户端请求,创建对等线程返回时间。
    • 通过指针connfdp传递链接描述符connfd,保证对等线程接收到与主线程通信的客户端。

    在实现服务器代码时一度出现了 free(): invalid pointer:字样的错误

    原因是, 在line:68,错误的将accept()函数返回的地址值赋值给了指针connfdp,而不是指针储存的地址的内容。导致指针connfdp地址值被更改。
    而free()传入的地址不是 malloc 返回的地址,只有 malloc返回的地址才能free(),造成了错误。

    在实现服务器代码时,对于主线程与对等线程,只在line:128关闭了一次连接符?

    原因是不管主线程还是对等线程都运行在同一个进程中,共享相同的描述符表,并且以上代码通过指针传递描述符,并未增加描述符的个数。因此在代码中只需要关闭一次连接描述符即可。

    • 最终运行截图
  • 相关阅读:
    安全管道工具SSF
    Dumpzilla工具第615行bug的解决办法
    火狐浏览器信息提取工具Dumpzilla
    通过构造函数来创建新对象
    利用canvas绘制序列帧动画
    canvas的图片绘制案例
    使用canvas绘制饼状图
    模仿制作京东的侧边提示栏
    使用canvas绘制扇形图
    使用canvas制作简单表格
  • 原文地址:https://www.cnblogs.com/besti155214/p/7815105.html
Copyright © 2020-2023  润新知