我试图通过AM3517评估板上的JTAG加载和引导linux内核。我的调试器是BDI3000。我不使用openocd,因为根据调试器的文档,它不是必需的。到目前为止,我认为我能够将vmlinux映像加载到内存中,但是一旦完成,"cont“gdb命令就不会引导linux。我在串行控制台上没有收到任何消息。
我正在遵循这个链接中给出的指示
试图获取链接中提到的log_buffer地址将给出以下输出
(gdb) p (char*) &__log_buf[log_start]
$1 = 0xc04cd460 <Address 0xc04cd460 out of bounds>
我对内核或系统编程非常陌生,
我有几个关于虚拟记忆的问题。主要涉及静态和运行时,即ELF和加载/链接等,特定于Linux86。
我的理解可能完全错误..。
我知道虚拟内存,它是分裂的1G/3G。在用户模式下进程不能访问PAGE_OFFSET以上的地址- PAGE_OFFSET是虚拟地址.
在静态时间ELF定义过程虚拟空间?
如果ELF定义虚拟地址空间,那么ELF是否也定义了内核虚拟地址空间?多么?我假设内核虚拟地址空间在运行时是动态映射的?
如果内核地址空间映射到进程地址空间,那么为什么进程大小(虚拟)也不包括内核大小?
- When and How this kernel a
这里是我的问题:我想从运行在Linux内核空间中的代码中对数据文件的一部分进行内存映射。我想稍后也从Linux内核空间中运行的代码中撤销相同的内存映射。如何执行这些操作?它们与在用户空间中使用mmap(2)/munmap(2)有何不同?
我试图在没有用户进程的内核空间中做到这一点。
我浏览了网络搜索和Linux内核书籍,包括Bovet和Cesati的"Understanding the Linux Kernel“。一本好书,但没有回答我的问题。
关于mm_struct和内核线程,在Linux kernel Development ( Robert Love)一书中提到的一些要点是:
内核线程没有进程地址空间,因此没有相关的内存描述符。因此,内核线程的进程描述符的mm字段为NULL。
“由于内核线程在用户空间中没有任何页面,它们实际上不值得拥有自己的内存描述符和页表(页表将在本章后面讨论)。尽管如此,内核线程仍需要一些数据,例如页表,甚至需要访问内核内存。”
内核线程没有地址空间,并且mm为NULL。因此,当调度内核线程时,内核会注意到mm为NULL,并保持前一个进程的地址空间已加载。然后,内核会更新内核线程的进程描述符中的active