- 浏览: 546074 次
- 性别:
- 来自: 上海
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
文章列表
回文算法(递归+从数字串拼凑N进制数)
- 博客分类:
- 数据结构和算法
回文是指正读反读均相同的字符序列,如“abba”,和“abdba”均是回文,但“good”不是回文,试写一个算法判定给定的字符向量是否为回
文。
字符串回文
public static boolean check(String str) {
if (str.length() > 1) {
if (str.charAt(0) != str.charAt(str.length() - 1)) {
return false;
} else {
return check(str.substring(1, str.length() - 1));
...
一、查看内存分布情况
设置“页目录表”和“页表”之前,最好先查看下内存分布情况,根据“OS可用内存的大小”来设置她们;否则可能设置了太大的“页目录表”和“页表”而浪费了宝贵的内存。
如果傻乎乎地设置“页目录表”和“页表”,我们来看看后果:
假设内存的一个物理块是4KB(=4096B)。我们知道,“页目录表”占用一个内存物理块,而“页目录表”中的每项PDE占32bit(4B),因此“页目录表”中最多有4096B/4B=1024个PDE;1024个PDE对应1024个页表,而每个“页表”又占用一个物理内存块。综上,
“页目录表”占用内存 ...
JMP、CALL和RET指令的近转移形式只是在当前代码段中执行程序控制转移,因此不会执行特权级检查。JMP、CALL或RET指令的远转移形式会把控制转移到另外一个代码段中,因此处理器一定会执行特权级检查。
1、jmp指令: ...
下面说明代码段和数据段的访问:
一、代码段间跳转
1、普通(直接)跳转:
JMP Selector:0 或 CALL Selector:0
1)一致代码段(JMP&CALL)
要求:CPL>=DPL,RPL不作检查
特权变化:跳转后程序CPL=跳转前程序CPL
2)非一致代码段(JMP&CALL)
要求:CPL=DPL & RPL<=DPL
特权变化:跳转后程序CPL=目标代码段DPL
2、通过调用门跳转:
偷懒一下,直接用JavaEye上chjavach老兄的文章了,他讲命令模式用了6节不厌其烦地阐述。虽然冗长,但算是详尽,需要看时下载附件中的电子书和代码即可^_^
文中第一个例子“点击按钮开机”非常形象,记清楚以下几点:
1、MainBoardApi,GigaMainBoard(以及MsiMainBoard)是命令接收者接口、命令接收者实现类。好比“主板标准”和“主板”。
他们是真正执行命令的地方,但只提供诸如open()、reset()的方法;
命令实现类OpenCommand将一个命令接收者实现类GigaMainB ...
编写这个功能主要是由于我的汉王电子书不能查看.asm, .java等格式的文件,因此我需要把他们的后缀改成.txt,不过需要看的东西太多了,索性写一个程序解决! 之前用java写了个改后缀和编码的程序,打成jar包,但由于兼容性问题,运行不了。故此,在Linux下,直接写一个shell脚本来做:
#######################################################################
#changeSuffix.sh——改文件后缀名
echo "请输入一个绝对路径,本脚本将把其下和其子目录下的所有后缀为 ...
在此之前,先要熟悉汇编指令“长/短jmp”、“长/短call”、ret、retf.
一、调用门“纯粹”作为入口地址
调用门本质上就是个入口地址,只是增加若干属性而已。例子pmtest5a.asm完全将其作为一个地址使用。
二、使用调用门,在不同特权级间转移
使用调用门分为以下两个阶段,难点无非就是“TSS”和“堆栈的变化”。本质上,TSS就是记录了不同特权级堆栈的SS和ESP;堆栈的变化无非就是无非就是短跳转压入SS&ESP,长跳转再多加CS&EIP,有时候也要压入和弹出参数,并且需要相关的检验。详见书上P55~60,或者这里http: ...
先展示一下效果图:
直接看代码:
注意到这段代码是在P38 “3.2.1海阔凭鱼跃”那段代码基础上加上LDT得到的,新添加的代码会着重标注出来的^_^
; ==========================================
; pmtest3.asm
; 编译方法:nasm pmtest3.asm -o pmtest3.com
; ==========================================
%include "pm.inc" ; 常量, 宏, 以及一些说明
org ...
三、关于保护模式和实模式的跳转和段描述符高速缓冲寄存器(转载)
其实从实模式跳转到保护模式还是很好懂得,主要注意就是跳转指令
jmp dword SelectorCode32:0
//而不能是
jmp SelectorCode32:0
因为这时编译 ...
一、主要功能 在本章最基本代码(P25、chapter3/a/)的基础上实现大地址(超过1M)的读写。在前面程序的基础上新建一个段,这个段以5MB为基址,远远超过1MB的界限。先读出开始处8字节的内容,然后写入一个字符串, ...
一、宏定义和属性常量
(代码段/数据段描述符见P32;门描述符见P51)
下面是对代码段/数据段描述符的宏定义,目的是为了方便编写描述符。
; 描述符
; usage: Descriptor Base, Limit, Attr
; Base: dd -->段基址4字节
; Limit: dd (low 20 bits available) -->段界限20位,放心大胆地用4字节(32位)表示界限,只不过经转换只用到其中20位
; Attr: dw (lower 4 bits of higher byte are a ...
A20地址线困惑我了很久,这篇文章终于揭开了这个谜团。详细阐述之前,我先来总结一把—— 8086/8088和80286地址转换方式一样,寻址范围不一样 。 8086/8088和80286中“逻辑地址-->线性地址”的转换方式是一样的:segment:offset-->segment<<4+offset,而且segment和offset均只有16bit. 只不过因为8086/8088是20位地址总线,而80286是24位地址总线,故地址范围有点不一样: (1)8086/8088寻址范围是0~1M(在8086/8088中1M以上的exten ...
A Classic Example: Image Proxies
以下是最朴素的代理模式实现,其中只有“代理”的思想,但并不是真正的代理。
一个ImageIconProxy proxy实例被封装在JFrame frame中,且他们都是ShowProxy属性。
点击“Load ...
Strategy Pattern
本文总结《Design Pattern in Java
》 Chap23 Strategy.
以为用户推荐一款烟火制品选择采取不同推荐策略为例。先讲解如果不采用策略模式会怎样,然后将这些代码重构为策略模式。
1
、如果不使用策略模式
,Customer::getRecommended()
中封装了复杂的策略选择和策略执行流程。
见图一
关键代码(choice & execution of various strategies)
:
publi ...
(第三章 2)段选择子
- 博客分类:
- 一个操作系统的实现
在实模式下,逻辑地址空间中存储单元的地址由段值和段内偏移两部分组成。在保护模式下,虚拟地址空间(相当于逻辑地址空间)中存储单元的地址由段选择子和段内偏移两部分组成。与实模式相比,段选择子取代了段值 ...