内核如何获得在linux下运行的可执行二进制文件?
这似乎是一个简单的问题,但任何人都可以帮助我深入挖掘?如何将文件加载到内存以及如何启动执行代码?
任何人都可以帮助我,一步一步地告诉我们发生了什么吗?
我对操作系统中的物理/逻辑/虚拟地址这个术语感到有点困惑(我使用的是Linux-open SUSE)
这是我的理解:
物理地址 - 当处理器处于系统模式时,处理器使用的地址是物理地址.
逻辑地址 - 当处理器处于用户模式时,使用的地址是逻辑地址.通过添加带有偏移值的基址寄存器,这些都可以映射到某个物理地址.它在某种程度上提供了一种内存保护.
我遇到过讨论,虚拟和逻辑地址/地址空间是相同的.这是真的吗?
非常感谢任何帮助.
我正在研究组合的分页/分段系统,在我的书中有两种方法:
1.paged segmentation
2.segmented paging
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚两者之间的区别.我认为在分页分段中,分段被分成页面,在分段分页中,页面被分成段,但我不知道我是对还是错.同时在因特网上,仅使用一种方案来描述组合的寻呼/分段.我无法弄清楚为什么在我的课本中有两种方案.任何帮助将深表感谢.
paging operating-system memory-management memory-segmentation
有人可以解释TLB(翻译后备缓冲区)未命中和缓存未命中之间的区别吗?
我相信我发现TLB指的是某种虚拟内存地址,但我并不清楚这实际意味着什么?
我理解当一块内存(缓存行的大小)被加载到(L3?)缓存中并且如果所需的地址没有保存在当前缓存行中时,会导致缓存未命中 - 这是缓存未命中.
我熟悉MIPS架构,它有一个软件管理的TLB.因此,您(操作系统)想要存储页表和页表条目的方式和位置完全取决于您.例如,我做了一个带有单个倒置页表的项目; 我看到其他人在每个进程中使用2级页表.
但x86的故事是什么?据我所知,TLB是硬件管理的.x86告诉你,"嘿,这是你目前使用的页表条目需要去[物理地址范围]"?但是等等,我一直认为x86使用多级页面表,所以它会告诉你在哪里放置第一级别的东西......?我糊涂了.
谢谢你的帮助.
用户内存和内核内存究竟与Linux内核有何区别(在为内核空间提供安全性方面)?
我可以在用户空间的内核地址空间中编写哪些不同的方法?
我知道的一种方法是通过系统调用.我们可以使用多个系统调用,但最后它们都是系统调用.即使在系统调用中,我们也会将数据发送到内核空间,在那里它(驱动程序或各个模块)调用copy_from_user()等函数将数据从用户空间复制到内核空间.在这里,我们完全没有写入地址空间.我们只是传递一个用户指针,其中包含需要复制到内核缓冲区的数据.
我的问题是,我们有什么方法可以访问内核空间中存在的物理地址并对其执行操作?
第二,除了系统调用之外还有其他方法可以从用户应用程序写入内核空间吗?
我从stackoverflow中提到了这个链接.但我认为我的问题没有得到回答,而且是从不同的角度来看.因此,我想问一个不同的问题.
请分享您的知识...谢谢.
我很难理解当翻译旁视缓冲区的前两个级别导致未命中时会发生什么?
我不确定特殊硬件电路中是否出现"页面行走",或者页表是否存储在L2/L3高速缓存中,或者它们是否只存在于主存储器中.
我想将一些值(比如2345)分配给一个内存位置(比如说0X12AED567).可以这样做吗?
换句话说,我该如何实现以下功能?
void AssignValToPointer(uint32_t pointer, int value)
{
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编译自己的glibc.我有一个目录glibc,其中包含glibc我从互联网上下载的源代码.从我输入的目录中输入mkdir ../build-glibc.现在从build-glibc我输入的目录../glibc/configure中执行配置.现在我不知道怎么打电话make.我无法从glibc目录中调用它,因为它没有配置集,也不能从中调用它build-glibc,因为makefile不在该目录中.我该如何解决这个问题?