第三个参数创建文件时使用,设置创建文件的读写权限,其它情况可以设为0 该函数返回strcut file*结构指针,供后继函数操作使用,该返回值用IS_ERR()来检验其有效性。...#ifndef _LINUX_ERR_H #define _LINUX_ERR_H #include linux/compiler.h> #include /* * Kernel...must_check PTR_ERR(const void *ptr) { return (long) ptr; } static inline long __must_check IS_ERR...在linux中有很多错误,内核错误可以参考include/asm-generic/errno-base.h。...比如说我们上面的filp_open函数返回值,用IS_ERR函数去检查,如果地址落在0xfffffffffffff000~0xffffffffffffffff范围, 表示filp_open函数失败,IS_ERR
附上验证代码: #include linux/init.h> #include linux/module.h> #include linux/sched.h> #include linux.../delay.h> #include linux/kthread.h> #include linux/rwsem.h> #include linux/mutex.h> MODULE_LICENSE...print_sem(&test_mutex); task = kthread_create(reader, "reader_1", "reader"); if (IS_ERR...} wake_up_process(task); task = kthread_create(writer, "writer_1", "writer1"); if (IS_ERR...wake_up_process(task); msleep(5); task = kthread_create(writer, "writer_2", "writer2"); if (IS_ERR
简介 本文主要来讲讲Linux内核驱动中,EXPORT_SYMBOL()宏定义的用法。 在阅读的Linux内核驱动源码的时候,我们会发现很多的函数带有EXPORT_SYMBOL()宏定义。...d\n", rice_drv.major_number); rice_drv.class = class_create(THIS_MODULE, CLASS_NAME); if (IS_ERR...= device_create(rice_drv.class, NULL, MKDEV(rice_drv.major_number, 0), NULL, DEVICE_NAME); if (IS_ERR...d\n", rice_drv.major_number); rice_drv.class = class_create(THIS_MODULE, CLASS_NAME); if (IS_ERR...= device_create(rice_drv.class, NULL, MKDEV(rice_drv.major_number, 0), NULL, DEVICE_NAME); if (IS_ERR
上篇我们从进程 clone 的角度,结合代码简单分析了 Linux 提供的 6 种 namespace,本篇从源码上进一步分析 Linux namespace,让你对 Docker namespace...我用的是 Linux-4.1.19 的版本,由于 namespace 模块更新都比较少,所以,只要 3.0 以上的版本都是差不多的。...从内核进程描述符 task_struct 开始切入 由于 Linux namespace 是用来做进程资源隔离的,所以在进程描述符中,一定有 namespace 所对应的信息,我们可以从这里开始切入代码...创建新的 namespace 初始化完之后,下面看看如何创建一个新的 namespace,通过前面的文章,我们知道是通过 clone 函数来完成的,在 Linux kernel 中,fork/vfork...IS_ERR(p)) { struct completion vfork; struct pid *pid; trace_sched_process_fork(current, p)
IS_ERR(p)) { struct completion vfork; struct pid *pid;...return -EINVAL; new_ns = create_new_namespaces(flags, tsk, user_ns, tsk->fs); if (IS_ERR...new_nsp->mnt_ns = copy_mnt_ns(flags, tsk->nsproxy->mnt_ns, user_ns, new_fs); if (IS_ERR...; } new_nsp->ipc_ns = copy_ipcs(flags, user_ns, tsk->nsproxy->ipc_ns); if (IS_ERR...} new_nsp->net_ns = copy_net_ns(flags, user_ns, tsk->nsproxy->net_ns); if (IS_ERR
今天阅读的代码主要位于include/linux/perf_event.h和/kernel/events/core.c文件内。本次阅读基于v6.3-rc7版本。...Get the target context (task or percpu): */ ctx = find_get_context(task, event); // L12468 if (IS_ERR...PTR_ERR(ctx); goto err_cred; } pmu_ctx = find_get_pmu_context(pmu, ctx, event); // L 12568 if (IS_ERR...: // L 12602 event_file = anon_inode_getfile("[perf_event]", &perf_fops, event, f_flags); if (IS_ERR.../blob/v6.3-rc7/include/linux/perf_event.h) Perf_IPC以及CPU利用率(https://plantegg.github.io/2021/05/16/Perf_IPC
因为近期用到了Linux内核的相关知识,下面随笔将给出内核模块的编写记录,供大家参考。...63 gslDriverParameters.pslDriverClass = class_create(THIS_MODULE, DEVICE_NAME); 64 65 if(IS_ERR.../init.h> 8 9 #include linux/module.h> 10 11 #include 12 13 #include linux/device.h...> 14 15 #include linux/mm.h> 16 17 #include linux/cdev.h> 18 19 #include linux/slab.h> 20 21...63 gslDriverParameters.pslDriverClass = class_create(THIS_MODULE, DEVICE_NAME); 64 65 if(IS_ERR
/usr/bin/stap %{ #include linux/string.h> #include linux/mm.h> #include linux/fs.h> #include linux.../file.h> #include linux/fs.h> #include #include #include linux/buffer_head.h...IS_ERR(filp)) { // printk("sucess to create file /run/log.txt\r\n"); if(!...IS_ERR(temp)) { len = strlen(temp)+sizeof("\r\n"); if((offset+len) >= PAGE_SIZE) {
gpio.c #include linux/init.h> #include linux/kernel.h> #include linux/module.h> #include linux/gpio.h...linux/delay.h> #include linux/pinctrl/pinctrl.h> #include linux/pinctrl/consumer.h> static int _...pinctrl_state *test_high; struct pinctrl_state *test_low; pctrl = devm_pinctrl_get(&pdev->dev); if(IS_ERR...devm_pinctrl_get error\n"); return ret; } test_high = pinctrl_lookup_state(pctrl,"test_high"); if(IS_ERR...pinctrl_lookup_state test_high error\n"); return ret; } test_low = pinctrl_lookup_state(pctrl,"test_low"); if(IS_ERR
一、ramdisk的制作 out/host/linux-x86/bin/mkbootfs out/target/product//root | out/host/linux-x86/bin/minigzip..."Can't find rootfs type"); mnt = vfs_kern_mount(type, 0, "rootfs", NULL); put_filesystem(type); if (IS_ERR...(mnt)) panic("Can't create rootfs"); ns = create_mnt_ns(mnt); if (IS_ERR(ns)) panic("Can't allocate initial...data, secdata); if (error) goto out_free_secdata; } root = type->mount(type, flags, name, data); if (IS_ERR...*, int)) { int error; struct super_block *s = sget(fs_type, NULL, set_anon_super, flags, NULL); if (IS_ERR
Clkdev.h linux-3.5\include\Linux //它是用来查找 struct clk 结构的。...内核提供了操作时钟相关的 API 函数,这些 API 接口函数是通用的,声明在 Clk.h linux-3.5\include\Linux 。...返回值:IS_ERR(clk_get 返回值) 非 0: 获得失败,这时候应该返回 –ENODEV 错误码 IS_ERR(clk_get 返回值) 0: 获得时钟成功 示例: s3c_ac97.ac97..._clk = clk_get(&pdev->dev, "ac97"); if (IS_ERR(s3c_ac97.ac97_clk)) { dev_err(&pdev->dev, "ac97 failed
IS_ERR(create.result)) { ... } return create.result; } kthread_create参数说明:...> #include linux/init.h> #include linux/kmod.h> #include linux/sched.h> #include linux/delay.h> #...IS_ERR(practice_task_p)) wake_up_process(practice_task_p); return 0; } static...IS_ERR(__k)) \ wake_up_process(__k); \ __k; \ }) 参数说明: threadfn:线程函数地址 data:线程函数形参,没有可以制定为NULL namefmt...//驱动加载函数 { int err; test_task = kthread_create(threadfunc, NULL, "test_task"); if(IS_ERR
OPP library的源代码路径在drivers/base/power/opp.c,头文件路径在include/linux/pm_opp.h中。...数据结构 Linux系统使用struct dev_pm_opp结构表示一个opp描述结构 struct dev_pm_opp { struct list_head node; bool available...Linux系统使用struct device_opp结构表示opp设备。...dev_opp_list_lock); /* Check for existing list for 'dev' */ dev_opp = find_device_opp(dev); if (IS_ERR...&dev_opp->opp_list, node) { if (tmp_opp->rate == freq) { opp = tmp_opp; break; } } if (IS_ERR
Linux VFS的mount过程基本原理如下图所示: ? ...关键数据结构说明 Linux VFS mount所涉及的关键数据结构分析如下。...代码分析基于Linux-3.2版本。...IS_ERR.../* 在内核建立vfsmount对象和superblock对象 */ mnt = do_kern_mount(type, flags, name, data); if (IS_ERR
最后 , 调用了 vm_mmap_pgoff 函数 , 继续向后执行 ; 二、sys_mmap_pgoff 系统调用函数源码 ---- 该 sys_mmap_pgoff 系统调用函数源码 , 定义在 Linux...内核源码的 linux-4.12\mm\mmap.c#1475 位置 ; sys_mmap_pgoff 函数源码如下 : SYSCALL_DEFINE6(mmap_pgoff, unsigned long...VM_NORESERVE, &user, HUGETLB_ANONHUGE_INODE, (flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK); if (IS_ERR...vm_mmap_pgoff(file, addr, len, prot, flags, pgoff); out_fput: if (file) fput(file); return retval; } 源码路径 : linux
前言 今天我们来评测linux内核的高精度定时器。顺便利用通过Tektronix示波器 和 DS100 Mini 数字示波器进行交叉测试。...Linux高精度定时器驱动编写 为了验证高精度定时器的分辨率,我们写一个简单的内核驱动(功能:在设定的周期内反转IO,然后通过示波器测量精度)。...major number is %d\n", major_number); class = class_create(THIS_MODULE, CLASS_NAME); if (IS_ERR...} device = device_create(class, NULL, MKDEV(major_number, 0), NULL, DEVICE_NAME); if (IS_ERR...Linux高精度定时器的评测 周期1ms评测: 修改宏定义:HRTIMER_TEST_CYCL设置周期为1ms.
*bprm; int retval; if (IS_ERR(filename)) return PTR_ERR(filename); ......current->flags &= ~PF_NPROC_EXCEEDED; bprm = alloc_bprm(fd, filename); if (IS_ERR(bprm)) { retval...在此之后,它检查当前进程的标志,表明未超出正在运行的进程的限制: if (IS_ERR(filename)) return PTR_ERR(filename); if ((current->flags...二进制参数准备 struct linux_binprm linux_binprm结构用于保存加载二进制文件时使用的参数。...file = do_open_execat(fd, filename, flags); retval = PTR_ERR(file); if (IS_ERR(file)) goto out_unmark
/types.h> #include linux/kernel.h> #include linux/delay.h> #include linux/ide.h> #include linux.../init.h> #include linux/module.h> #include linux/errno.h> #include linux/gpio.h> #include linux.../cdev.h> #include linux/device.h> #include linux/of.h> #include linux/of_address.h> #include linux...gpioled.devid, GPIOLED_CNT); /* 4、创建类 */ gpioled.class = class_create(THIS_MODULE, GPIOLED_NAME); if (IS_ERR...创建设备 */ gpioled.device = device_create(gpioled.class, NULL, gpioled.devid, NULL, GPIOLED_NAME); if (IS_ERR
清单3.6 通知事件处理函数 #include linux/notifier.h> #include #include linux/netdevice.h> #include...} int my_function(char *userbuffer) { char *buf; /* ... */ buf = collect_data(userbuffer); if (IS_ERR...再来一个例子,我们给清单3.8中的线程创建代码添加错误处理(使用IS_ERR()和PTR_ERR()): my_task = kthread_create(my_thread, NULL, "%s",...IS_ERR(my_task)) { + /* Success */ wake_up_process(my_task); + } else { + /* Failure */ + printk("Error...kthread_should_stop() kernel/kthread.c 内核线程可以使用该函数轮询是否其他的执行单元已经调用kthread_stop()让其停止 IS_ERR
领取专属 10元无门槛券
手把手带您无忧上云