我试图了解内存管理如何进入低级别并且有几个问题.
1)由Kip R. Irvine撰写的关于汇编语言的书说,在实模式中,前三个段寄存器在程序启动时加载了代码,数据和堆栈段的基址.这对我来说有点不合时宜.是手动指定这些值还是汇编程序生成将值写入寄存器的指令?如果它自动发生,它如何找出这些段的大小?
2)我知道Linux使用扁平线性模型,即以非常有限的方式使用分段.此外,根据Daniel P. Bovet和Marco Cesati的"理解Linux内核",有四个主要部分:用户数据,用户代码,内核数据和GDT中的内核代码.所有四个段都具有相同的大小和基址.我不明白为什么四个中只有它们的类型和访问权限不同(它们都产生相同的线性地址,对吧?).为什么不只使用其中一个并将其描述符写入所有段寄存器?
3)不使用分段的操作系统如何将程序划分为逻辑段?例如,他们如何在没有段描述符的情况下将堆栈与代码区分开来.我读过分页可以用来处理这些事情,但是不明白怎么做.
我有以下简单的代码,它将文本文件的内容读入字符数组:
const char* name = "test.txt";
std::cout << "Loading file " << name << std::endl;
std::ifstream file;
file.open(name);
file.seekg (0, std::ios::end);
int length = file.tellg();
std::cout << "Size: " << length << " bytes" << std::endl;
file.seekg (0, std::ios::beg);
char* buffer = new char[length];
file.read(buffer,length);
file.close();
std::cout.write(buffer,length);
Run Code Online (Sandbox Code Playgroud)
但是,似乎ifstream从文件读取错误的字符数:每行1个额外的字符.我搜索了网络,看起来在win7文本文件中除了每行末尾的换行符(\n)之外还有回车符号(\ r).但是,流以某种方式看不到这些\ r,但仍然使用文件中的原始符号数,从文件末尾读取额外的字节.有可能以某种方式解决这个问题吗?
如果它有帮助:我使用MinGW编译器和Windows 7 64位.