首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

28.Linux-IIC驱动(详解)

上一节 我们学习了:   IIC接口下的24C02 驱动分析 接下来本节, 学习Linux下如何利用linux下I2C驱动体系结构来操作24C02 1....从设备地址值,并回应ACK } 通过上面的代码和注释,发现主要是写入IIC从设备地址,然后发送起始信号+IIC从设备地址值,并回应ACK 显然IIC总线驱动i2c-s3c2410.c,主要设置适配器adapter...,会通过adapter适配器发送IIC设备地址addr_data,如果收到ACK信号,就调用eeprom_detect()回调函数来注册i2c_client结构体,该结构体对应真实的物理从设备,而i2c_driver.../kernel.h> #include linux/init.h> #include linux/module.h> #include linux/slab.h> #include linux/...jiffies.h> #include linux/i2c.h> #include linux/mutex.h> #include linux/fs.h> #include <asm/uaccess.h

3.1K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux网络】:网络基础(IP地址和MAC地址对应关系,IPv4,IPv6)

    1.IP地址和MAC地址对应关系: 开始我以为只能是一个MAC地址只能对应一个IP地址,一个IP地址能对应多个MAC地址。但是现在好像错了。都可以多对多。...IP地址和MAC地址对应关系是动态的,在有的情况下:一个MAC地址可以对应多个IP地址。 1.1多宿主设备 多宿主设备是指:一个设备连接到多个网络或者网络接口。...在这种情况下,一个MAC地址就可以绑定到多个IP地址。 举例: 一个虚拟机主机为不同的虚拟机提供了不同的ip地址,但是这些IP地址都共用一个MAC地址。...这些不同的IP地址,通过网络地址转换可能就转换到同一个MAC地址了。 1.4IP地址的动态分配 在不同的地方,设备的IP地址会不一样,但是MAC还是一样的。...小结: 上面在服务器例子,路由器例子中,都说明了一个MAC地址可以绑定多个IP地址。但是都会对应到一个MAC地址去。 1.然后ipv6本来就可以有多个IP地址。

    7410

    用户态进程如何得到虚拟地址对应的物理地址?

    一般我们不需要从用户态得到进程虚拟地址对应的物理地址,因为一般来说用户进程是完全不关心物理地址的。 少数应用场景下,用户可能会关心,比如在用户态做DMA的场景(如DPDK之类的)。...从用户态得到虚拟地址对应的物理地址,我们不可能去walk进程的page table,也没有权限。不过还好内核给我们提供了一个接口,叫pagemap,而且,这个接口与硬件的体系架构无关。...在/proc/pid/下面有个文件叫pagemap,它会每个page,生成了一个64bit的描述符,来描述虚拟地址这一页对应的物理页帧号或者SWAP里面的便宜,详见文档: linux/Documentation...下面我们忽略swap的影响(假设关闭了swap或者page一直是pin的状态),从DPDK抄一段虚拟地址转换为物理地址的代码: #define phys_addr_t uint64_t #define...... /* * the pfn (page frame number) are bits 0-54 (see * pagemap.txt in linux

    4K21

    【linux】地址空间

    在Linux地址下,这种地址叫做 虚拟地址 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理 OS必须负责将 虚拟地址 转化成 物理地址 。...虚拟地址不直接对应物理内存中的实际位置,而是通过一系列的映射过程转换成物理地址 页表是实现虚拟地址到物理地址映射的数据结构。...页表项(Page Table Entry, PTE):每个页表项包含对应物理页帧的信息,以及一些状态位(如有效位、修改位、访问位等) 上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址...程序内部使用的地址都是基于虚拟地址空间,页表负责将这些地址实时映射到实际的物理内存地址,为程序的正确执行提供支撑 03.Linux2.6内核进程调度队列 前面提到的nice值范围在[-20,19]...在 Linux 2.6 内核中,进程调度得到了很大的改进,以提高系统的效率、响应性和可扩展性。

    9810

    【Linux】地址空间&&虚拟地址

    在32位和64位下的地址空间大小是不一样的,为了方便这里使用32位来表述。32位从低到高一个有4GB的地址空间范围,实际上这个地址空间当中打印出来的地址,是该空间内对应的地址。...,所以在地址空间的初始化数据中就有它的地址虚拟地址,页表的左侧也有它的虚拟地址,在页表右侧就有它对应的物理地址。...当创建了一个子进程,本质上是系统多了一个进程,它也有自己的task_truct,还有自己的虚拟地址空间,还有它所对应的页表。 每个进程都要有自己的虚拟的地址空间,也要有自己对应的页表。...子进程的地址空间也会有一个虚拟地址,子进程对应的页表也来自父进程,所以页表保存的地址,从而子进程也会指向那个g_val。...所以虚拟地址相同而物理地址不同。 3. 进程调度 Linux中的nice值并不是能任意调度的,而是从-20到19,这40个数字之间变换。

    18510

    Linux编程--地址计算

    // 获取第一个出现`-`位置的字符串 char *first_bar_pos = strchr(maps_line, '-'); // 计算maps中的地址大小...itself*/ +1/* space before privbit*/; // 如果当前内存页不可读,也不可执行的话,也就意味着不是我们要找的ELF文件的内存地址...= 'x') { continue; } } 在计算addr_size的时候,使用的两个(char *)的减进行运算,为何能得到地址的大小?...而first_bar_pos与maps_line则这是上面两个字符串的地址,那么这两个地址相减,就是5da215f000字符串的大小,正好是10个字节。 所以就认为计算出来的地址长度为10。...privbits 相应的,在获取到addr_size的大小之后,通过first_bar_pos+addr_size+1+1,获取到的字符数组首地址指向的就是r-xp这一段文本了。

    1.1K00

    Linux:进程地址空间

    ——>所以当我们创建出一个子进程后,他会拷贝一份和父进程一样的地址空间,然后当子进程想要修改对应的数据时,此时就会发生写时拷贝(由操作系统自动完成),也就是重新开辟空间,在这个过程当中只有页表对应的物理地址发生了变化...——>这个过程就是CPU通过像内存充电的形式告诉内存我需要哪个地址,然后内存就能够通过识别高低电频,形成一个物理数据,将地址对应的数据以同样的方式交给CPU。  ...——>修改对应结构体内部的start和end即可 我们不仅要看到地址空间的范围,我们要知道在范围内连续的空间中,每一个最小单位都可以有地址,这个地址可以被直接使用!! ...这是有Linux的内存模块去管理的,进程并不需要关心。 结论4:其实变量名在定义的时候就已经被转化成一个个虚拟地址了,而我们之所以有a和&a,本质上是为了区分想获取的是变量的值还是地址。...结论5:以前我们所学习的C内存管理,其实本质上是进程地址空间,而内存管理是由Linux替我们完成的,我们上层语言并不需要关心具体的细节,只需要正常去通过对应的线性地址去使用就行了。

    13110

    【Linux】进程地址空间

    下面我们来讨论一下 二、进程地址空间 1、页表 我们在之前讲到的程序地址空间的说法其实是错误的,正确来说应该叫进程地址空间,上面我们所说的地址叫做虚拟地址,也叫做线性地址,既然叫做虚拟地址,那当然就不是真实的物理地址了...在 32 位计算机里,地址总线宽度是 32 位,也就是有 32 条线路,每条线路能通过高低电平的转换来实现0和1的变化,所以这 32 条线路能表示的不同地址组合数量为 2^32个,因为每个内存地址对应一个字节...,很好地阻断了可能出现的一系列崩盘的问题 4、页表的其他内容 页表除了我们上面提到的作用以外,还存在类似读写权限这样的功能,我们在之前学习的时候,我们知道在只读数据段中的数据是只可读不可写的,那么它相对应的映射到物理内存上...其实是页表的某一项属性控制了该变量的读写,分为不可读写、可读不可写、可写不可读、可读可写,在映射的同时将该性质传递回去,就只可读了 其他的还有对应代码和数据是否已经加载到内存等等一系列的其他属性 页表的本质属于进程的硬件上下文...当程序访问一个虚拟地址,而该地址对应的页面不在物理内存中,也就是没有被加载到物理内存的页框里时,就会触发缺页中断,这是一种特殊的中断,它会暂停当前程序的执行,转而去处理页面加载的问题 进程刚开始运行时,

    7910
    领券