jiayi Rss

80386段保护模式 Segment Protection

| Posted in 汇编 |

0

这篇文章是jiayi学习 《intel 80386 programmer’s manual》 的段保护部分时做的笔记,其中翻译有一部分,自己理解的东西有一部分,交叉参考的 IA32 手册也有一部分。这是jiayi写过的最长的一篇文章,当然也是jiayi认为写起来最难的一篇,80386的保护模式的确比较繁琐……

本文提到的段寄存器 selector 断描述符 断描述符表 建议先在此弄明白 。

手册内容感觉比较乱,所以在每个主题开始之前,jiayi尽量用一句提纲挈领的话概括要点,接下来再参考手册描述细节。

段保护 Segment-Level Protection

段转换时如下 5 项保护工作被执行

  1. 类型检查 Type checking
  2. 边界限制检查 Limit checking
  3. 可被寻址区域的约束 Restriction of addressable domain
  4. 过程进入点的约束 Restriction of procedure entry points
  5. 指令集的约束 Restriction of instruction set

段是被保护的单元,段描述符中存储着保护………

80386段转换 Segment Translation

| Posted in 汇编 |

2

80386的段寄存器是16位的,存储的地址为逻辑地址。不过,这只是段寄存器的可见部分(visibleportion)…没错,正如我们所想的,段寄存器还有不可见部分(invisibleportion)。其中的可见部分其实是个16位的 Selector,可以被程序操纵。而不可见部分只能被处理器操作,处理器自动地从段描述符(segment descriptor)中取出 基地址、段大小容限、描述符类型 等一系列信息,并将其载入寄存器的不可见部分。所以给我们造成了段寄存器只有16位的假象。具体结构看下图

再说说上面提到的 Selector
Selector 是存入 段寄存器 的16位信息,它只是逻辑地址,并不是一些人想象的物理地址。这个 Slector 向CPU提供三种信息
        Index:描述符表单的8192个描述符中选出一个
        Table Indicator: 置0时表示从 全局描述符表单(G………

汇编移位作除法

| Posted in 汇编 |

0

假设除数是 2 的 N 次方,及 2^(N) ,32位机上 0 < N < 32,如果被除数是负数,移位操作需要 18 个时钟周期;如果被除数是正数,移位操作只需 12 个时钟周期。如果使用 IDIV 指令,则需要多达 43 个时钟周期。下面演示移位的除法运算

Linux发送arp请求与接收arp响应

| Posted in UNP |

4

Linux 中获得本机网卡MAC地址很简单,ioctl()就OK。可如何获得局域网其他主机的MAC地址呢…链路层广播ARP请求然后接收ARP响应。实现介个功能其实已有现成三方库可用,如libnet。不过想加深对协议的理解和Linux网络编程API的理解,jiayi 还是决定用LinuxPF_PACKET自己实现,改啊改,终于成功~以下是大体思路
1. 为数据报分配空间,创建相应的结构体 req,arp 数据报的帧格式如图
        
2. 创建 PF_PACKET 原始套接字,发送套接字为 reqfd,接收套接字为 recvfd
3. 填写链路层通用结构体 reqsa
3. get_ifi()获取本机网络接口数据,填写要发送的ARP数据报 req 结构体,sendto()发送
4. 循环recvfrom()接收ARP响应,滤掉经由本地接口的其他ARP数据报

发送ARP请求能做的事不仅仅获取MAC地址吧…其他“有意义”的事也可以尝试一………

struct 之 地址寻址与地址转换

| Posted in C/C++ |

7

考完最后一科,嘎嘎,终于考完了~这个学期再也不敢懈怠考试了,抓了一段功课,有些效果。。恩,博客恢复更新~
说说C语言的 struct 吧。虽然基本,但有些东西还是挺有意思的。先看看 struct 的地址有哪些有意思的东西吧~

下面有一段代码,其中先给出一个 _student 结构体,声明后付初值。用 struct 的”点(.)”操作符打印其中 name 对象的地址与字符串。然后通过类似 struct 0 地址寻址的方式打,这里给了四句话,其中一句用“毒瘤”注释,说明不可取…最后我们在struct 寻址的基础上截取打印 name 字符串,唔,这里有两句“毒瘤”。 

C code

#include<stdio.h>
int main()
{
    struct _student {
        int sex;
        char*name;
    }

………

Linux 作业控制

| Posted in APUE |

3

话说一个支持作业控制的 Linux 终端下有 作业1,我们把他放到后台,终端执行 kill %1 ,恩,我们知道它把 作业1 杀掉了。但它只杀掉了 作业1 吗?那可不一定……
首先,作业(job) 指的是 进程组(process group),一个作业就是一个进程组。进程组 是什么,A process group is a collection of one or more processes, usually associated with the same job,that can receive signals from the same terminal。明白了两者各自的定义,很容易看到他们是相通的。把进程组抽象成作业,一个主要目的是便于操控。因此作业控制可以看作进程组控制,只不过更简便了,但作业控制有时却不能按照我们的意愿工作。

下面给出一段程序加以说明
第一个程序命名 job_control.c,第二个程序命名 job_control_1.c

CODE

/* job_control.c */
#include<sys/types.h>
#include&l

………

好长时间没更新鸟…

| Posted in 生活八卦 |

2

额…怎么说呢…这段时间事确实多,又到期末,自己的博客没怎么看顾。。。
看到JobruSunjian 还在光顾小博,十分感动~谢谢~
这么长时间没管,博客确实出了小问题,大家的留言都成了乱码,开始还以为大家在开玩笑…因为以前都好好的。。。
唉,再三检查,是数据库的编码出了问题…修正后,恢复了大家留言的“本来面目”,在这道歉…
明天期末开考,寒假恢复更新。查了下PR,竟还是3,今后加把劲是不是可以到4呢,呵呵。毕竟是新年嘛,小憧憬一下下~
新年快乐!大家加油,jiayi 加油~………

Expect 手册中文版

| Posted in shell |

0

Expect 手册 中文版

本文由gunman翻译,在此感谢~

EXPECT(1)
名字:
Expect—–能与交互式程序进行“可程序化”会话的脚本语言
大纲:
        (命令选项概述)
        expect [ -dDinN ] [ -c cmds ] [ -[f|b] ] cmdfile ] [ args ]
概述:
    Expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及 什么是正确的应答。它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。另外,还可以在随时需要的时候把控制权交给用户,然后再还给脚 本。
    ExpectK是Expect和Tk的混合体。它就按照Expect和Tk的………

有趣的C语言函数指针

| Posted in C/C++ |

19

C语言的函数指针还真是诡异啊,下面四个代码都能正常运行。。C 难得把语法放的这么宽,写下来以示纪念…

C code


#include<stdio.h>

void haha()
{
    printf("haha\n");
}

int main()
{
    void(*func)();
    func = haha;
    func();
}

C code


#include<stdio.h>

void haha()
{
    printf("haha\n");
}

int main()
{
    void(*func)();
    func = haha;
    (*func)();
}

C code


#include<stdio.h>

void haha()
{
    printf("haha\n"

………

新版Linux qq

| Posted in Linux |

10

LinuxQQ终于出新版了,前两天短不了上腾讯看,今天终于等到了。

说说新功能吧~首先是文件传输,解决了大问题。屏幕截图也很出现了,总算有点正宗qq的感觉。

不过,额…用qq木有声音,这个ms解决起来不是很难吧…期待下一版能得到相应解决~