1、相对地址修正为S + A - P,晕了很长时间。简单总结一下
S没问题,很确定是要调用方法的实际地址。绝对地址。
A没问题,链接之前放的值,也就是常量-4。
P被修正的位置,容易晕。实际上是call指令所在的地址加一,也就是call后的值的地址。
而且,使用常量-4的原因是call指令用的地址是32位的(也就是4个字节)

2、编译器将未初始化的全局变量当作弱符号来处理,所以不在BSS段分配空间。
第三章小结的时候,发现了这个问题,在这一章已经描述了,只在链接时才会分配到bss段。
http://msblog.tk/archives/430

3、最小程序的问题。已经另有一遍blog描述了。
http://msblog.tk/archives/424

GPS在刚开始定位成功时,偏差很大,过一段时间,会慢慢较准。我一直的理解是刚开始参与定位的卫星少,后来多了以后才更精准的。

偶然发现有别的因素。

1、先列官方最简单直接的说明,Selective Availability,摘录如下:http://www.gps.gov/systems/gps/modernization/sa/

Selective Availability

chart GPS accuracy errors before and after deactivation of SA (VIEW MORE DATA)
Selective Availability (SA) was an intentional degradation of public GPS signals implemented for national security reasons.

In May 2000, at the direction of President Bill Clinton, the U.S government discontinued its use of Selective Availability in order to make GPS more responsive to civil and commercial users worldwide.

The United States has no intent to ever use Selective Availability again.
In September 2007, the U.S. government announced its decision to procure the future generation of GPS satellites, known as GPS III, without the SA feature. Doing this will make the policy decision of 2000 permanent and eliminate a source of uncertainty in GPS performance that had been of concern to civil GPS users worldwide.

- 阅读剩余部分 -

1、有一处错误。59页第三行:
[code]
所以.bss段只是为未初始化的全局变量和局部静态变量预留位置而已。
[/code]
并且配了图,全局的未初始化变量int global_uninit_var;用点虚线连到.bss section

实测结果发现是错的。
只有静态的未初始化变量会预留位置。非静态的全局变量不会预留。

测试代码bss.c
[code]
int a;
int main(){
return 0;
}
[/code]
头信息显示,.bss的Size为0
[code]
bss.o: file format elf64-x86-64

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000000b 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 0000000000000000 0000000000000000 0000004c 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 0000000000000000 0000000000000000 0000004c 2**2
ALLOC
3 .comment 0000002d 0000000000000000 0000000000000000 0000004c 2**0
CONTENTS, READONLY
4 .note.GNU-stack 00000000 0000000000000000 0000000000000000 00000079 2**0
CONTENTS, READONLY
5 .eh_frame 00000038 0000000000000000 0000000000000000 00000080 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
[/code]

把全局变量改为全局静态变量时,才会到.bss段
[code]
static int a;
int main(){
return 0;
}
[/code]

头信息显示,.bss的Size为4,一个int的大小,四个字节。
[code]
bss.o: file format elf64-x86-64

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000000b 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 0000000000000000 0000000000000000 0000004c 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 0000000000000000 0000000000000000 0000004c 2**2
ALLOC
3 .comment 0000002d 0000000000000000 0000000000000000 0000004c 2**0
CONTENTS, READONLY
4 .note.GNU-stack 00000000 0000000000000000 0000000000000000 00000079 2**0
CONTENTS, READONLY
5 .eh_frame 00000038 0000000000000000 0000000000000000 00000080 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
[/code]
从书中给的例子也能看出来这个问题,61页的代码里分别有一个未初始化的全局变量和一个未初始化的静态局部变量。按作者的理解,这两个int的大小应该是8。
从62页书中给出的头信息来看,.bss段的大小是4。作者不知道什么原因,没有注意到这个问题。

- 阅读剩余部分 -

摘自http://zh.wikipedia.org/zh-cn/%E5%9B%BD%E9%99%85%E7%94%B5%E8%AF%9D%E5%8C%BA%E5%8F%B7%E5%88%97%E8%A1%A8

这里是一张全球国际电话服务的区号列表。所有的区号都是根据国际电信联盟(ITU)的E.123和E.164标准所分配的。所有的号码都是前缀号,也就是说这些号码是用来“拨到”目的国家的。每一个国家还有一个前缀来“拨出”自所处的国家,这个前缀叫国际冠码。简言之,国际冠码就是下列国际电话区号前的“+”前缀[1]。因此拨打国际电话的一般顺序是:国际冠码-国际电话区号-封闭电话号码;或者:国际冠码-国际电话区号-国内电话区号-开放电话号码。

目录
[code]
区域0 -- 保留
区域1 -- 北美洲
区域2 -- 非洲
区域3 -- 欧洲
区域4 -- 欧洲
区域5 -- 墨西哥及中南美洲
区域6 -- 东南亚及大洋洲
区域7 - 俄罗斯及附近地区 (前苏联)
区域8 -- 东亚及特殊服务
区域9 - 西亚及南亚、中东
[/code]

- 阅读剩余部分 -

用IDE直接把源码生成可执行文件,这个过程叫构建(Build)。
实际上需要分四个步骤:预处理、编译、汇编、链接。

一、预处理。也叫预编译,编译之前的一个步骤。
先把用的示例代码列一下,输出比hello world更简单的:ok.c
[code]
#include <stdio.h>

int main(){
printf("OK!\n");
return 0;
}
[/code]
预编译指令:
[code]
gcc -E ok.c -o ok.i
[/code]
预处理的结果有16K多,非常长,内容我就不贴了。

- 阅读剩余部分 -

1、CPU的分配方式(多道程序、分时系统、多任务系统)之间的区别。
多道程序是CPU闲时启动别的程序,简单来说:程序不用CPU时,被调用程序分配给别人。
分时系统是每个程序一段时间主动让出CPU,给别的程序用。全靠自觉。
多任务系统给每个程序分配指定的时间片,过期后强制程序让出CPU。被动的统一调配。

2、多任务系统运行在受硬件保护的级别,这个硬件指的是什么
目前我能想到的,就是内存分配。MMC是内存访问时的硬件限制机制。可能还有别的。

3、硬盘空间分配时,最小分配单位是扇区。硬盘现在一般用的是逻辑扇区号,硬盘内部的电子设备会自动转成物理的。
扇区是磁盘的最小可寻址单元(不是分配)。最小可分配单元是操作系统决定的,在windows系统里叫簇(clust),Linux中叫块(block),大小是扇区大小的2^n倍。
这里面有个问题,只要申请磁盘空间,哪怕是只有一个字节,也会分配一个块大小(比如:1024字节),有1023个字节无法再分配(浪费掉了)。
另外:windows中磁盘格式化的时候,可以选择“分配单元大小”,就是传说中的簇。
Linux中查看指定磁盘的块大小,可用
[code]
/sbin/tune2fs -l /dev/sda1
[/code]
查看Linux系统默认的块大小可用
[code]
getconf PAGESIZE
[/code]

- 阅读剩余部分 -