Tag: 操作系统

在Linux中使用四个fork()之后创建了多少个进程?

我在操作系统教科书上看到了一个愚蠢的问题。 问题如下: 假设所有fork系统调用都成功。执行下面显示的程序后。 屏幕上有多少行? 我假设每次fork调用都会使进程加倍,因此结果应该是16进程创建。 但是当我从教科书中输入相同的代码时,我得到了30行。 这是结果和代码: http://imgur.com/zrdOP0X #include #include #include int main(){ fork(); printf(“After fork1\n”); fork(); printf(“After fork2\n”); fork(); printf(“After fork3\n”); fork(); printf(“After fork4\n”); }

如何在rmmod上停止Linux内核线程?

我编写了以下代码来创建内核线程: #include #include #include #include #include struct task_struct *task; int data; int ret; int thread_function(void *data) { int var; var = 10; return var; } static int kernel_init(void) { data = 20; printk(KERN_INFO”——————————————–“); task = kthread_create(&thread_function,(void *)data,”pradeep”); task = kthread_run(&thread_function,(void *)data,”pradeep”); printk(KERN_INFO”Kernel Thread : %s\n”,task->comm); return 0; } static void kernel_exit(void) { ret = kthread_stop(task); […]

为什么CPU在字边界上访问内存?

我听到很多数据应该在内存中正确对齐,以提高访问效率。 CPU访问内存在字边界上。 因此,在以下场景中,CPU必须进行2次内存访问才能获得单个字。 Supposing: 1 word = 4 bytes (“|” stands for word boundary. “o” stands for byte boundary) |—-o—-o—-o—-|—-o—-o—-o—-| (The word boundary in CPU’s eye) —-o—-o—-o—- (What I want to read from memory) 为什么会这样? 什么是CPU的根本原因只能读取字边界? 如果CPU只能访问4字节字边界,则地址线应仅需要30位,而不是32位宽。 因为CPU的眼中最后2位始终为0。 添加1 更重要的是,如果我们承认CPU必须读取字边界,为什么边界不能从我想要读取的地方开始? 似乎边界在CPU眼中是固定的。 添加2 根据AndreyT的说法 ,似乎边界设置是硬连线的,它是由内存访问硬件硬连线的。 就这一点而言,CPU是无辜的。 非常感谢…

我可以在没有任何操作系统平台的情况下执

我用谷歌搜索了一下,我读到了…… 是的你可以。 这种情况发生在嵌入式系统中 我想不,这是不可能的。 任何平台都必须具有操作系统。 否则,您的程序本身必须是一个操作系统。 无论是软接线还是硬接线。 如果没有操作系统,您的组件将无法运行。 我是对的还是任何人都能解释我的答案? (我对嵌入式系统没有任何想法…)

有没有办法让我的程序使用更少的代码?

我为学校作业编写了以下代码 – 它编译并打印所有正确的消息。 但仅仅是出于我自己的好奇心,我想知道我的代码是否可以缩短并且仍然有效。 我试过“信号”而不是“sigaction”,但我听说“sigaction”比“信号”更受欢迎。 此外,此分配需要3个处理程序。 有人可以看看并给我一些提示吗? 谢谢! #define _POSIX_SOURCE #define _BSD_SOURCE #include #include #include #include #include #include #include static void sigHandler_sigusr1(int sig) { printf(“Caught SIGUSR1\n”); //sig contains the signal number that was received } static void sigHandler_sigusr2(int sig) { printf(“Caught SIGUSR2\n”); } static void sigHandler_sigint(int sig) { printf(“Caught SIGINT, Existing\n”); exit(EXIT_SUCCESS); } int main(int […]

将虚拟地址存储在指针而不是物理地址中有什么好处?

我已经通过下面的链接,它说在大多数操作系统上,指针存储虚拟地址而不是物理地址,但我无法获得将虚拟地址存储在指针中的好处。 最后我们可以直接通过指针修改特定内存位置的内容,那么它是虚拟地址还是物理地址的问题是什么? 此外,在代码执行期间,大多数情况下数据段也将保留在内存中,因此我们只处理物理内存位置,以便虚拟地址如何有用? C指针和物理地址

fork调用后的地址空间

当进程执行fork()sys调用时,会从中生成子进程。 fork()调用之后的所有代码都被复制到内存的新物理页面,即帧。 我无法可视化子进程的虚拟内存部分。因为在下面的代码中,char变量的地址在child和parent中是相同的。 #include #include int main(void) { pid_t pid; char y=’Y’; char *ptr; ptr=&y; pid = fork(); if (pid == 0) { y=’Z’; printf(” *** Child process ***\n”); printf(” Address is %p\n”,ptr); printf(” char value is %c\n”,y); sleep(5); } else { sleep(5); printf(“\n ***parent process ***\n”,&y); printf(” Address is %p\n”,ptr); printf(” char value is […]

为什么gcc在返回指向局部变量的指针时抛出警告而不是在返回局部变量时抛出警告?

请参阅下面的代码示例。 函数fun_ret_loc_ptr()的语句return (&i)返回一个警告:“函数返回局部变量的地址”。 另一方面,语句return a函数fun_ret_loc_var()不会这样做。 #include int* fun_ret_loc_ptr() { int i = 10; return (&i); } int fun_ret_loc_var() { int a = 20; return a; } int main() { printf(“val frm local ptr = %d\n”, *fun_ret_loc_ptr()); printf(“val frm local var = %d\n”, fun_ret_loc_var()); } 我理解在第一个函数中返回的地址( return (&i); )被fun_ret_loc_ptr()到一个内存位置,该内存位置是与函数fun_ret_loc_ptr()对应的堆栈帧的一部分。 一旦此函数返回,堆栈帧(激活记录)将被销毁。 同样的事情应该适用于函数fun_ret_loc_var()的变量’a’( return a; fun_ret_loc_var() 。 即使它被返回,当它在main中使用时,对应于’a’的内存也会死亡。 […]

什么是地址空间布局随机化

可能重复: 内存随机化作为应用程序安全增强? 喜 有些人可以解释一下我的地址空间布局随机化是什么以及它是如何实现的。 这种技术如何影响堆栈,堆和静态数据。 此外,我对任何解释地址空间布局随机化的论文感兴趣。 感谢和问候, 像老鼠。

C内核 – 在VM上工作正常但不是真正的计算机吗?

我正在制作一个基本的C内核。 (由汇编程序加载)我正在用Windows的i686-elf交叉编译器编译它。 我的C代码如下: void cls(); void drawhappy(); void main(){ char *vidptr = (char *)0xb8000; cls(); drawhappy(); } void cls(){ char *vidptr = (char *)0xb8000; unsigned int j = 0; while(j < 80*2*25){ vidptr[j] = ' '; vidptr[j+1] = 0x07; j = j+2; } } void drawhappy(){ char *vidptr = (char *)0xb8000; const unsigned int linewidth […]