Tag: linux kernel

释放(vfree-ing)指向易失性数据的指针

volatile似乎是每个人永无止境的问题。 我以为我知道一切,但后来我遇到了这个: 所以,我在线程之间共享了一块内存,我将其定义如下: volatile type *name; 如果它让你感觉更好,你可以想象type只是一个int 。 这意味着我有一些指针(不易变)到一些易失的数据。 因此,例如在优化方面,编译器可以缓存name的值而不是name[0] 。 我对吗? 所以,现在我正在使用这个指针(它在Linux内核模块中),它告诉我当我传递volatile type *时, vfree需要const void * volatile type * 。 我理解将volatile type *作为type *传递是多么危险,因为在该函数中, name[i]的值可以被高速缓存(作为优化的结果),这是不可取的。 我不明白为什么,但是, vfree希望我将指针发送到非易失性数据。 那里有什么我想念的吗? 或者只是那些写vfree而不考虑这种情况的人? 我假设我只是将我的指针投射到void *不会造成任何伤害,是吗?

使用可装入内核模块修改framebuffer(/ dev / graphics / fb0)参数

问题:我必须配置Android平台使用的各种LCD显示器。 几乎在所有情况下,没有可用于LCD显示器的电气规格。 但通过经验和逆向工程,可以很好地猜测参数。 我正在尝试使用可加载内核模块来微调显示参数(欢迎任何其他建议)。 请在下面找到相关信息。 HW: Atmel SAMA5D31-EK(ARM 5处理器) SW:来自board-dt.c文件的Andriod Linux(目标),Ubuntu(主机系统),Sourcery CodeBench(交叉编译器)代码片段 static struct fb_videomode at91_tft_vga_modes[] = { ….. .xres =435; .yres =235; …. } static struct fb_monspecs at91fb_default_monspecs = { ……… .modedb = at91_tft_vga_modes, …… } static struct atmel_lcd_fb_info __initdata ek_lcdc_data = { ………. .default_monspecs = & at91fb_default_monspecs; ……… } 我添加了此代码,以便可加载内核模块可以访问lcdc_data结构 extern void set_fb_video(struct […]

如何使用Linux内核模块中的Linux系统调用

从Linux内核模块内部调用系统调用时遇到一些困难。 系统调用已经过测试,并且可以从标准的c用户空间程序中正常工作,但我似乎无法获得内核模块来编译和运行它们。 在我的用户程序中,我包含以下代码,系统调用有效: #include #define __NR_sys_mycall 343 extern long int _syscall(long int_sysno,…)__THROW; //and then a simple call is done as such long value = syscall(__NR_sys_mycall); printf(“The value is %ld\n”,value); 但是当我在我的Linux内核模块中尝试相同的事情时,我得到了一堆错误,或者说错误:隐式声明函数’syscall’(如果我不包括_syscall定义)或一长串关于语法的错误if我这样做…所以我的假设是我需要内核空间版本来调用系统调用。 我是对还是错? //My LKM code #include #include #define __NR_sys_mycall 343 static int start_init(void) { long value = syscall(__NR_sys_mycall); printk(“The value is %ld\n”,value); return 0; } static […]

将小型UDP数据包从Linux内核发送到LOOPBACK

情况:我的代码基本上被黑客入侵了Linux内核的驱动程序。 我想在用户空间中通知一个关于值得注意的原始事件的应用程序,然后才能将它们发送到主系统。 解决方案的步骤:我在这里找到了一个从内核空间发送UDP数据包的好例子: http : //kernelnewbies.org/Simple_UDP_Server 。 他们使用INADDR_LOOPBACK作为目标地址,这正是我想要的。 由于这是中断上下文,我决定使用工作队列来发送数据包(我得到了BUG:在没有它的情况下进行primefaces调度)。 因此,我的发送代码基于kernelnewbies代码,该代码包含在主进程中使用INIT_WORK和schedule_work触发的工作队列结构中。 我没有宣布自己的工作队列。 我没有使用Netpoll API,因为此问题表明无法从localhost发送数据。 “你不能发给自己” 问题:从内核发送并从我的UDP接收器接收的数据很少匹配。 我不知道为什么会这样。 用于测试的虚拟数据的代码,包括工作队列的结构的定义: static struct socket *sock_send; static struct sockaddr_in addr_send; static struct ksocket_workmessage { unsigned char *buf; int len; struct work_struct workmessage; } workmsg; unsigned char testmsg[] = {‘T’, ‘e’, ‘s’, ‘t’, ‘i’, ‘n’, ‘g’, ‘m’, ‘s’, ‘g’, ‘\0’}; workmsg.buf […]

如何在linux中使用DMA处理memcpy

我在我的程序中使用memcpy()。 随着我增加变量的数量,不幸的是CPU使用率增加了。 就像使用for循环迭代运行memcpy一样。 Linux中是否有快速memcpyfunction? 我应该使用补丁并编译内核吗?

有人可以解释exynos ARM中的电源控制寄存器吗?

在Linux内核中,更准确地说是3.9- rc6上的/arch/arm/mach-exynos/cpuidle.c ,这些行读取 static unsigned int g_pwr_ctrl, g_diag_reg; static void save_cpu_arch_register(void) { /*read power control register*/ asm(“mrc p15, 0, %0, c15, c0, 0” : “=r”(g_pwr_ctrl) : : “cc”); /*read diagnostic register*/ asm(“mrc p15, 0, %0, c15, c0, 1” : “=r”(g_diag_reg) : : “cc”); return; } 在研究了这个问题后,这似乎是gcc内联汇编。 考虑到它是一个关键组件, asm正在阅读它 更快,因此更有效率 不适用于C. 我检查了ARM手册中的MCR因为我正在学习汇编,但我可以告诉MCR是一个协处理器,因为它有三个字母长度。 内联asm似乎访问功率控制寄存器并将结果(从寄存器)保存到第一行中的无符号整数(我希望在某个时刻调用)。 关于电源控制寄存器,臂手册列出, 实现Cortex-A9处理器的时钟延迟 动态时钟门控。 […]

Jiffies – 如何计算秒数?

我有一段代码,我想以秒计算时间..虽然我在jiffies有时间,我怎么能在几秒钟内转换它? 这是我的内核代码: #include #include #include #include unsigned long js, je, tet; int netblock_init_module(void){ js = jiffies; printk(“\n[Jiffies start Time : %lu]\nModule Started.\n”, js); return 0; } void netblock_cleanup_module(void) { je = jiffies; printk(“\n[Jiffies End Time : %lu]\nModule Removed.\n”, je); tet = je – js; printk(“\nEnd Time [%lu] – Start Time [%lu]: \nTotlal elapsed Time [%lu]\n”,js,je, […]

未知符号__class_create(错误0)

这可能是一个愚蠢的问题,但我在网上找了几个小时,找不到答案…… 我正在编写一个内核模块,它也可以创建一个字符设备。 它编译没有错误和警告,但当我尝试sudo insmod my_mod.ko我得到: insmod: error inserting ‘my_mod.ko’: -1 Unknown symbol in module 当我试着看看dmesg我看到: my_mod: Unknown symbol __class_create (err 0) my_mod: Unknown symbol device_create_file (err 0) my_mod: Unknown symbol device_create (err 0) 我猜我错过了一个include但是我找不到哪个… 需要包括哪些内容? 我的目前包括: #include #include #include #include #include #include #include

用C读取linux内核版本?

我正在使用Ubuntu,我想阅读其内核的版本。 我在/ proc /中找到了一个名为version的文件,它记录了当前内核的版本。 如果我不想读取文件,还有其他方法,比如C中的内置函数,我可以在C中读取该版本吗? 谢谢

编译内核模块时,“__aeabi_ldivmod”未定义

我正在尝试在raspberry pi上编译一个内核模块(我自己编写)。 我正在目标环境中编译它。 我得到以下输出: make -C /lib/modules/3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708/build M=/home/harmic/horus/ppminput modules make[1]: Entering directory `/usr/src/kernels/3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708′ CC [M] /home/harmic/horus/ppminput/ppminput.o Building modules, stage 2. MODPOST 1 modules WARNING: “__aeabi_ldivmod” [/home/harmic/horus/ppminput/ppminput.ko] undefined! CC /home/harmic/horus/ppminput/ppminput.mod.o LD [M] /home/harmic/horus/ppminput/ppminput.ko make[1]: Leaving directory `/usr/src/kernels/3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708′ 果然,如果我尝试插入模块,我得到: insmod: ERROR: could not insert module ./ppminput.ko: Unknown symbol in module 在syslog中: Sep 2 22:44:26 pidora kernel: [ […]