我正在尝试理解内存管理是如何在低级别上进行的,并有几个问题。
1)基普·R·欧文写的一本关于汇编语言的书说,在实模式下,前三个段寄存器在程序启动时加载了代码、数据和堆栈段的基地址。这对我来说有点模棱两可。这些值是手动指定的,还是由汇编程序生成指令将这些值写入寄存器?如果它是自动发生的,它如何找出这些数据段的大小?
2)我知道Linux使用扁平线性模型,即以非常有限的方式使用分割。此外,根据Daniel P.Bovet和Marco Cesati的"Understanding the Linux Kernel“,GDT中有四个主要部分:用户数据、用户代码、内核数据和内核代码。所有四个网段的
我有过一些为ARM more m设备以及Linux内核、uBoot和Beaglebone Black (为那些生活在岩石下的人编写更多带有MMU的ARM )应用程序编写裸机代码的经验。对我来说,应该使用arm-none-eabi-gcc (因为没有操作系统)编译cortex m代码是有意义的,而BBB的应用程序代码应该使用arm-linux-gnueabi-gcc (因为有操作系统,可以对其进行系统调用,并且可以使用程序加载器和共享对象)。
我不明白的是为什么uBoot和内核也要用arm-linux-gnueabi-gnueabi编译。在我看来,至少uBoot是一个裸机程序,没有什么花哨的操作
在RedHat Linux上构建了一个共享对象,虽然所有代码都是使用debug编译的,但调试器(gdb)拒绝加载符号并发出错误,如下所示:
...
GNU gdb Fedora (6.8-37.el5)
...
This GDB was configured as "x86_64-redhat-linux-gnu"...
Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module libgrokf.so]
有了这个错误,我无法在任何函数中触发断点,也看不到正确的堆