当我以Gentoo作为客户运行我的虚拟机时,我发现tick_periodic功能有相当大的开销.(这是在每个定时器中断上运行的函数.)此函数更新导致开销的全局jiffy使用write_seqlocks.
这是HZ我的内核配置文件中的grep 和相关内容.
sharan013@sitmac4:~$ cat /boot/config | egrep 'HZ|TIME'
# CONFIG_RCU_FAST_NO_HZ is not set
CONFIG_NO_HZ=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
# CONFIG_MACHZ_WDT is not set
CONFIG_TIMERFD=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_X86_CYCLONE_TIMER=y
CONFIG_HPET_TIMER=y
Run Code Online (Sandbox Code Playgroud)
显然它已将配置设置为1000,但是当我这样做时sysconf(_SC_CLK_TCK),我得到100作为我的计时器频率.那么我系统的定时器频率是多少?
我想要做的是将频率降低到100,如果可能的话甚至更低.虽然它可能影响poll/ select和调度程序时间片的交互性和精度,但我准备牺牲这些东西以减少定时器中断,因为它会加速VM.
当我试图找出必须完成的工作时,我在某个地方读到你可以通过更改配置文件来实现这一点,否则在那里我读到将bootider = 10添加到boot参数就完成了工作,否则我在那里读到了如果您可以设置CONFIG_HIGH_RES_TIMERS即使不增加定时器频率的触发低延迟定时器也不需要,并且使用无定时系统也是如此CONFIG_NO_HZ.
我对于什么是正确的方法感到非常困惑.
我想要的是将定时器中断降低到尽可能低的程度.
我能知道这样做的正确方法吗?
我ARMv7用作目标机器.我已经2.6.34.13为目标编译了Linux源代码.
Target使用minicom通过串口连接Host(Linux Development machine).
Target加载了新内核,并在命令提示符下启用了KGDB.
$ echo ttyAMA0 > /sys/module/kgdboc/parameters/kgdboc
$ echo g > /proc/sysrq-trigger
Run Code Online (Sandbox Code Playgroud)
显示输入KGDB ...消息并等待命令.
在主机方面,
$arm-none-linux-gnueabi-gdb vmlinux
gdb > set remotebaud 115200
gdb > set debug remote 1
gdb > target remote /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)
在此之后,默认情况下会发生一些命令通信.
qSupported从主机发送到目标.但目标不支持qSuppoted,因此返回$#00.同样?,HC-1发送命令但收到适当的响应.
但qOffsets命令没有收到目标的任何响应.
我怀疑是vmlinux.因为如果我放弃listgdb,它就不会显示10行代码
arch/arm/kernel/head.S : No such file or directory.
Run Code Online (Sandbox Code Playgroud)
注意::在服务器中完成的内核编译.因此在开发机器中没有可用的源.但看起来,arm-gdb正在寻找头部.
我不确定我在做什么错.我需要为整个内核加载符号.在这方面指导我.
据我所知,默认情况下将完成4字节对齐.说
typedef struct
{
int data7;
unsigned char data8;
//3 -bytes will be added here.
}Sample1;
Run Code Online (Sandbox Code Playgroud)
所以sizeof(Sample1)将是8.
但是对于以下结构,为什么没有发生填充?
typedef struct
{
unsigned char data1;
unsigned char data2;
unsigned char data3;
unsigned char data4;
unsigned char data5;
unsigned char data6;
}Sample2;
Run Code Online (Sandbox Code Playgroud)
但sizeof(Sample2)仅为6.Sample2不是4字节对齐的结构?
编辑::
按照Wiki
数据对齐意味着将数据放入存储器偏移量等于字大小的某个倍数,这会因CPU处理内存的方式而提高系统性能.
但Sample2的成员不会以两个的倍数对齐?
谢谢.
int main()
{
char *x = "HelloWorld";
char y[] = "HelloWorld";
x[0] = 'Z';
//y[0] = 'M';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的程序中,HelloWorld将处于只读部分(即字符串表).x将指向该只读部分,因此尝试修改该值将是未定义的行为.
但是y将在堆栈中分配HelloWorld并将被复制到该内存中.所以修改y将正常工作.字符串文字:指针与字符数组
这是我的问题:
在下面的程序中,都char *arr和char arr[]使段错误,如果内容被修改.
void function(char arr[])
//void function(char *arr)
{
arr[0] = 'X';
}
int main()
{
function("MyString");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请分享您的知识.
在这个声明中:
char *a = "string1"
Run Code Online (Sandbox Code Playgroud)
究竟什么是字符串文字?是string1吗?因为这个线程C和C++中字符串文字的类型是什么?说些不同的东西.
据我所知
int main()
{
char *a = "string1"; //is a string- literals allocated memory in read-only section.
char b[] = "string2"; //is a array char where memory will be allocated in stack.
a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults.
b[0] = 'Y'; //Valid.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请添加除上述要点之外的一些细节.谢谢.
调试输出显示错误 a[0] = 'Y';
Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: …Run Code Online (Sandbox Code Playgroud) 我被问到这个面试问题.我不确定它的正确答案是什么(以及答案背后的原因):
sin(x)是一个很好的哈希函数吗?
我想通过串口ttyS0从我的64位suse机器调试MIPS linux驱动程序.使用的gdb通过LAN调试应用程序而不是kgdb over serial.我使用此页面和其他一些内容来启动调试,但没有最终结果.
我的内核使用以下设置编译:
CONFIG_MAGIC_SYSRQ=y
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
# CONFIG_KGDB_TESTS is not set
CONFIG_CMDLINE="kgdboc=ttyS0,115200"
Run Code Online (Sandbox Code Playgroud)
如果我运行gdb:
gdb vmlinux
(gdb) set remotebaud 115200
(gdb) set debug remote 1
(gdb) target remote /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)
我可以观察以下输出:
输出(GDB_TERMINAL):
(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
Sending packet: $qSupported:qRelocInsn+#9a...Ack
Timeout in mid-packet, retrying
Timed out.
Timed out.
Ignoring packet error, continuing...
Packet qSupported (supported-packets) is supported
warning: unrecognized item "qSupported:qRelocIns" in "qSupported" response
Sending packet: $Hg0#df...Nak
Sending packet: $Hg0#df...Ack
Packet received: Hg0
Sending …Run Code Online (Sandbox Code Playgroud) 嗨,任何人都可以告诉这段代码有什么问题吗?
string s=getString(); //return string
if(!strcmp(s,"STRING")){
//Do something
}
Run Code Online (Sandbox Code Playgroud)
编译时我得到的错误就像
error: cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘int strcmp(const char*, const char*)’|
Run Code Online (Sandbox Code Playgroud) 我想将一组数据传递给Linux内核模块.
在内核中:
int a[5];
int count;
module_param_array(a, int, &count, 0);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何从命令行传递值.如果它是一个只是变量,我将使用:
insmod k1.ko a=10
Run Code Online (Sandbox Code Playgroud) c ×7
linux-kernel ×4
linux ×3
kernel ×2
kgdb ×2
arm ×1
arrays ×1
c++ ×1
command-line ×1
gcc ×1
if-statement ×1
padding ×1
structure ×1
ternary ×1
timer ×1
trigonometry ×1