Posted by jiayi | Posted in 汇编 | Posted on 17-03-2009
Tags: 内核, 汇编
这篇文章是jiayi学习 《intel 80386 programmer’s manual》 的段保护部分时做的笔记,其中翻译有一部分,自己理解的东西有一部分,交叉参考的 IA32 手册也有一部分。这是jiayi写过的最长的一篇文章,当然也是jiayi认为写起来最难的一篇,80386的保护模式的确比较繁琐……
本文提到的段寄存器 selector 断描述符 断描述符表 建议先在此弄明白 。
手册内容感觉比较乱,所以在每个主题开始之前,jiayi尽量用一句提纲挈领的话概括要点,接下来再参考手册描述细节。
段保护 Segment-Level Protection
段转换时如下 5 项保护工作被执行
- 类型检查 Type checking
- 边界限制检查 Limit checking
- 可被寻址区域的约束 Restriction of addressable domain
- 过程进入点的约束 Restriction of procedure entry points
- 指令集的约束 Restriction of instruction set
段是被保护的单元,段描述符中存储着保护………
Posted by jiayi | Posted in 汇编 | Posted on 16-03-2009
Tags: 内核, 汇编
80386的段寄存器是16位的,存储的地址为逻辑地址。不过,这只是段寄存器的可见部分(visibleportion)…没错,正如我们所想的,段寄存器还有不可见部分(invisibleportion)。其中的可见部分其实是个16位的 Selector,可以被程序操纵。而不可见部分只能被处理器操作,处理器自动地从段描述符(segment descriptor)中取出 基地址、段大小容限、描述符类型 等一系列信息,并将其载入寄存器的不可见部分。所以给我们造成了段寄存器只有16位的假象。具体结构看下图

再说说上面提到的 Selector
Selector 是存入 段寄存器 的16位信息,它只是逻辑地址,并不是一些人想象的物理地址。这个 Slector 向CPU提供三种信息
Index: 从描述符表单的8192个描述符中选出一个
Table Indicator: 置0时表示从 全局描述符表单(G………
Posted by jiayi | Posted in 汇编 | Posted on 15-03-2009
Tags: 汇编
假设除数是 2 的 N 次方,及 2^(N) ,32位机上 0 < N < 32,如果被除数是负数,移位操作需要 18 个时钟周期;如果被除数是正数,移位操作只需 12 个时钟周期。如果使用 IDIV 指令,则需要多达 43 个时钟周期。下面演示移位的除法运算

Posted by jiayi | Posted in UNP | Posted on 28-02-2009
Tags: Linux, 网络编程
Linux 中获得本机网卡MAC地址很简单,ioctl()就OK。可如何获得局域网其他主机的MAC地址呢…链路层广播ARP请求,然后接收ARP响应。实现介个功能其实已有现成三方库可用,如libnet。不过想加深对协议的理解和Linux网络编程API的理解,jiayi 还是决定用Linux的PF_PACKET自己实现,改啊改,终于成功~以下是大体思路
1. 为数据报分配空间,创建相应的结构体 req,arp 数据报的帧格式如图

2. 创建 PF_PACKET 原始套接字,发送套接字为 reqfd,接收套接字为 recvfd
3. 填写链路层通用结构体 reqsa
3. get_ifi()获取本机网络接口数据,填写要发送的ARP数据报 req 结构体,sendto()发送
4. 循环recvfrom()接收ARP响应,滤掉经由本地接口的其他ARP数据报
发送ARP请求能做的事不仅仅获取MAC地址吧…其他“有意义”的事也可以尝试一………
Posted by jiayi | Posted in C/C++ | Posted on 16-01-2009
Tags: C, 指针, 结构体
考完最后一科,嘎嘎,终于考完了~这个学期再也不敢懈怠考试了,抓了一段功课,有些效果。。恩,博客恢复更新~
说说C语言的 struct 吧。虽然基本,但有些东西还是挺有意思的。先看看 struct 的地址有哪些有意思的东西吧~
下面有一段代码,其中先给出一个 _student 结构体,声明后付初值。用 struct 的”点(.)”操作符打印其中 name 对象的地址与字符串。然后通过类似 struct 0 地址寻址的方式打,这里给了四句话,其中一句用“毒瘤”注释,说明不可取…最后我们在struct 寻址的基础上截取打印 name 字符串,唔,这里有两句“毒瘤”。
C code
#include<stdio.h>
int main()
{
struct _student {
int sex;
char*name;
}
………
Posted by jiayi | Posted in APUE | Posted on 07-01-2009
Tags: APUE, 作业控制
话说一个支持作业控制的 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 by jiayi | Posted in 生活八卦 | Posted on 04-01-2009
额…怎么说呢…这段时间事确实多,又到期末,自己的博客没怎么看顾。。。
看到JobruSunjian 还在光顾小博,十分感动~谢谢~
这么长时间没管,博客确实出了小问题,大家的留言都成了乱码,开始还以为大家在开玩笑…因为以前都好好的。。。
唉,再三检查,是数据库的编码出了问题…修正后,恢复了大家留言的“本来面目”,在这道歉…
明天期末开考,寒假恢复更新。查了下PR,竟还是3,今后加把劲是不是可以到4呢,呵呵。毕竟是新年嘛,小憧憬一下下~
新年快乐!大家加油,jiayi 加油~………
Posted by jiayi | Posted in shell | Posted on 04-01-2009
Tags: expect, shell, 手册
Expect 手册 中文版
本文由gunman翻译,在此感谢~
EXPECT(1)
名字:
Expect—–能与交互式程序进行“可程序化”会话的脚本语言
大纲:
(命令选项概述)
expect [ -dDinN ] [ -c cmds ] [ -[f|b] ] cmdfile ] [ args ]
概述:
Expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及 什么是正确的应答。它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。另外,还可以在随时需要的时候把控制权交给用户,然后再还给脚 本。
ExpectK是Expect和Tk的混合体。它就按照Expect和Tk的………
Posted by jiayi | Posted in C/C++ | Posted on 15-11-2008
Tags: C, 函数, 指针
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"
………
Posted by jiayi | Posted in Linux | Posted on 15-11-2008
Tags: Linux, qq
LinuxQQ终于出新版了,前两天短不了上腾讯看,今天终于等到了。
说说新功能吧~首先是文件传输,解决了大问题。屏幕截图也很出现了,总算有点正宗qq的感觉。
不过,额…用qq木有声音,这个ms解决起来不是很难吧…期待下一版能得到相应解决~
