在典型的C程序中,静态变量和全局变量都驻留在数据段上.静态变量的范围仍限于文件.相反,可以从任何地方访问全局变量.为什么会发生这种情况,尽管它们都存在于同一个内存中?
虚拟内存对我来说是一个非常复杂的话题.我想了解它.以下是我对32位系统的理解.示例RAM仅为2GB.我试过阅读很多链接,目前我并不自信.我希望你们有人帮助我清理我的概念.请承认我的观点,也请回答你的错误.在我的观点中,我也有一个困惑的部分.所以,这里开始总结.
每个进程都认为它只是在运行.它可以访问4GB的内存 - 虚拟地址空间.
当进程访问虚拟地址时,它将通过MMU转换为物理地址.该MMU是CPU的一部分 - 硬件.
当MMU无法将地址转换为物理地址时,会引发页面错误.
在页面错误时,会通知内核.内核检查VM区域结构.如果它能找到它 - 可能在磁盘上.它会做一些页面输入/页面输出.并在RAM上获取此内存.
现在MMU将再次尝试并且这次将成功.
如果内核找不到地址,它将发出一个信号.例如,无效访问将引发SIGSEGV.
困惑点.
Page表是否在内核中维护?这个VM区域结构有一个页表?
MMU如何在物理RAM中找不到该地址.让我们说它转换为RAM中的一些错误地址.代码仍将执行,但它将是一个糟糕的地址.MMU如何确保正在读取正确的数据?它是否每次都参考内核VM区域?
Mapping表 - 虚拟到物理是否在MMU内.我读过它是由一个单独的过程维护的.如果它在一个过程中,为什么我看不到它.或者,如果它是MMU,MMU如何生成地址 - 是Segment + 12位移位 - >页面帧编号,然后添加偏移(位-1到10) - >给出物理地址.对于32位架构而言,这是否意味着我的想法.我可以从虚拟地址确定物理地址.
cat/proc/pid_value/maps.这向我展示了vmarea的当前映射.基本上,它读取Vmarea结构并打印它.这意味着这很重要.我无法完整地了解这一部分.执行程序时,会生成vmarea结构.当MMU无法转换地址(即页面错误)时,VMAREA是否仅进入画面?当我打印vmarea时,它显示地址范围,权限并映射到文件描述符和偏移量.我确信这个文件描述符是硬盘中的文件描述符,偏移量是该文件的.
高内存概念是内核无法直接访问大于1 GB(大约)的内存区域.因此,它需要一个页表来间接映射它.因此,它会临时加载一些页表来映射地址.HIGH MEM每次都会进入画面吗?因为Userspace可以通过MMU直接转换地址.在什么情况下,内核真的想要访问高MEM.我相信内核驱动程序主要使用kmalloc.这是直接内存+偏移地址.在这种情况下,实际上不需要映射.因此,问题是内核需要访问High Mem的场景.
处理器是否专门配备了MMU支持.那些没有MMU支持的人无法运行LInux?
我想知道如何在运行的计算机上检查内核是否配置为SMP?当然,我可以查看内核.config文件并进行搜索。但是,问题是,我没有源代码,如何检查SMP配置?是否有任何proc文件要检查?
下面说我没有多核:
#cat /proc/cpuinfo
processor : 1
cpu model : Broadcom BMIPS5000 V1.1 FPU V0.1
BogoMIPS : 651.26
cpu MHz : 1305.018
wait instruction : yes
microsecond timers : yes
tlb_entries : 64
extra interrupt vector : yes
hardware watchpoint : no
ASEs implemented :
shadow register sets : 1
kscratch registers : 0
core : 0
VCED exceptions : not available
VCEI exceptions : not available
Run Code Online (Sandbox Code Playgroud)
输出为uname -a:
Linux 136.170.193.3 3.3.8-2.4 #2 SMP …Run Code Online (Sandbox Code Playgroud) 我想首先在我的电脑上测试 mcheck 功能以检测 malloc 合并错误。这样,我确信这将有助于解决嵌入式 Linux 机器上的类似崩溃问题。不幸的是,崩溃至少需要 3-4 天。因此,我正在寻找一个示例程序,该程序将生成类似的崩溃,如下所示。
Program terminated with signal 6, Aborted.
#0 0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
15 static inline _syscall2(int, __syscall_kill, __kernel_pid_t, pid,
int, sig);
Current language: auto; currently c
#0 0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
__res = 716485696
__err = 16
#1 0x2c73eb5c in kill (pid=900, sig=6) at kill.c:19
No locals.
#2 0x2aafb2e0 in pthread_kill (thread=900, signo=6) at signals.c:73
handle = (pthread_handle) 0x2ab3f2e0
pid = 900
#3 0x2aafbbb8 in raise …Run Code Online (Sandbox Code Playgroud) 这是在Jenkins配置上完成的。我在配置电子邮件时使用以下字段。
E-mail Notification
SMTP server smtp.gmail.com Help for feature: SMTP server
Default user e-mail suffix : @gmail.com
Use SMTP Authentication Help for feature: Use SMTP Authentication
User Name shreyasjoshi12@gmail.com
Password sincity
Use SSL Help for feature: Use SSL
SMTP Port Help for feature: SMTP Port
Reply-To Address
Charset
Test configuration by sending test e-mail
Test e-mail recipient
Run Code Online (Sandbox Code Playgroud)
这就是我遇到的错误。我对Java部分完全不了解。这些错误对我来说毫无意义。请帮助解决这里的问题。
Failed to send out e-mail
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. hi5sm58745870pbb.43 - gsmtp
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2057)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1580)
at …Run Code Online (Sandbox Code Playgroud) 在一个类中,如果函数在不同的说明符中声明为friend,例如private,protected或public,那么是否有任何区别.据我了解,朋友的功能不是会员.因此,它应该无关紧要.但是,如果我看到静态 - 它也不是成员,但访问说明符很重要.所以,我有点困惑.所有这些代码如何工作正常?以下课程有什么不同吗?
/** Private friend function **/
class frienddemoFunction
{
private:
unsigned int m_fanSpeed;
unsigned int m_dutyCycle;
/** This function is not a member of class frienddemo **/
friend void printValues(frienddemoFunction &d);
public:
void setFanSpeed(unsigned int fanSpeed);
unsigned int getFanSpeed();
};
/** Protected -- Friend Function **/
class frienddemoFunction
{
private:
unsigned int m_fanSpeed;
unsigned int m_dutyCycle;
public:
void setFanSpeed(unsigned int fanSpeed);
unsigned int getFanSpeed();
protected:
/** This function is not a member of class frienddemo **/
friend void …Run Code Online (Sandbox Code Playgroud) 我创建了一个错误的程序 - buggy.c - 这是缓冲区t的缓冲区溢出方案.您可以看到我正在编写超过5个索引.它工作正常.它永远不会给我一个错误.我在想,为什么会那样?我甚至试过Valgrind,这也找不到这个问题.你能告诉我这里有什么问题吗?
void buffer_overflow(void)
{
int t[5];
int i = 0;
for(i = 0; i<=7; i++)
{
t[i] = i;
}
/** this will cause buffer overflow **/
printf("Memory_overflow_completed\r\n");
}
int main(int argc, char **argv)
{
buffer_overflow();
return 0;
}
$gcc -g buggy.c -o buggy.out -lefence
$./buggy.out
Run Code Online (Sandbox Code Playgroud)
但是,我没有遇到任何崩溃.这里没有电栅栏的效果.我错过了什么?我看到这里发布的类似问题gcc用电栅栏库没有生效,但似乎还没有答案.我在FC19上运行这个例子.有人有答案吗?即使是valgrind也未能发现问题?还有其他工具可以检测这些问题吗?
根据进一步的评论,我修改了缓冲区溢出函数,以便被Electric Fence检测到.但是,电围栏无法检测到这个问题.这是修改后的功能.
void buffer_overflow(void)
{
#if 0
int t[5];
int i = 0;
for(i = 0; i<=7; i++)
{
t[i] = i;
}
#endif
char *t = …Run Code Online (Sandbox Code Playgroud) 我已经看到,每当我们创建diff时,我们都使用以下命令.
diff -Naur old new > file.patch
Run Code Online (Sandbox Code Playgroud)
我想知道这个-Naur开关是什么.这个名字是如何产生的以及究竟是什么特别的呢?当然,我可以在没有Naur选项的情况下进行diff程序来发现差异.但是,我正在寻找更多有关它的信息.
我正在使用 Atlassian 的源代码树通过 git 存储库调试回归问题。我的问题是如何从 git 中的图形线中找出分支名称?我看到各种颜色,如棕色、蓝色和红色。我的问题是这些相应颜色线的分支名称是什么 -
这是图表——