C函数库
写设备驱动时 不能使用C函数库的函数,只能使用内核函数符号.我想问一下,(1)普通的C程序连接时不是把函数实现的汇编代码放到可执行文件里了吗?(这句话不知道对不对 <还是程序只是有个符号,最终要带上函数库才能执行?> )
------解决方案--------------------通过系统调用调用内核函数
------解决方案--------------------Linux中分用户空间和内核空间,驱动属于内核空间,所以只能调用内核函数,同理,用户空间也就是平常写的普通main()只能调用用户空间的函数,如C函数库的函数。
普通的C程序连接时,连接C函数库之前都要先include,这样在编译链接的时候就会把你调用的外部函数需要的函数段include进去生成可执行文件。而并非要带上函数库才能执行。
------解决方案--------------------我觉得外部函数和你自己写的本来就没有区别,
一个是标准库里的用include <> 进来.一个是用户自定义的用include " '进来.效果是一样的...
------解决方案--------------------没区别,提供函数库的目的就是让你少写些代码
------解决方案--------------------C函数库(glibc之类)的函数多数是对系统函数的封装,
在内核下何必绕一圈呢,直接用系统函数多好
------解决方案--------------------A module runs in kernel space, whereas applications run in user space. This concept is at the base of operating systems theory. 一个模块在内核空间运行, 而应用程序在用户空间运行. 这个概念是操作系统理论的基础.
操作系统的角色, 实际上, 是给程序提供一个一致的计算机硬件的视角. 另外, 操作系统必须承担程序的独立操作和保护对于非授权的资源存取. 这一不平凡的任务只有 CPU 增强系统软件对应用程序的保护才有可能.
每种现代处理器都能够加强这种行为. 选中的方法是 CPU 自己实现不同的操作形态(或者级别). 这些级别有不同的角色, 一些操作在低些级别中不允许; 程序代码只能通过有限的几个门从一种级别切换到另一个. Unix 系统设计成利用了这种硬件特性, 使用了两个这样的级别. 所有当今的处理器至少有两个保护级别, 并且某些, 例如 x86 家族, 有更多级别; 当几个级别存在时, 使用最高和最低级别. 在 Unix 下, 内核在最高级运行( 也称之为超级模式 ), 这里任何事情都允许, 而应用程序在最低级运行(所谓的用户模式), 这里处理器控制了对硬件的直接存取以及对内存的非法存取.
我们常常提到运行模式作为内核空间和用户空间. 这些术语不仅包含存在于这两个模式中不同特权级别, 还包含有这样的事实, 即每个模式有它自己的内存映射 -- 它自己的地址空间.
Unix 从用户空间转换执行到内核空间, 无论何时一个应用程序发出一个系统调用或者被硬件中断挂起时. 执行系统调用的内核代码在进程的上下文中工作 -- 它代表调用进程并且可以存取该进程的地址空间. 换句话说, 处理中断的代码对进程来说是异步的, 不和任何特别的进程有关.
模块的角色是扩展内核的功能; 模块化的代码在内核空间运行. 经常地一个驱动进行之前提到的两种任务: 模块中一些的函数作为系统调用的一部分执行, 一些负责中断处理.
------------------------
内核空间和用户空间有他们自己的地址空间,所以你的驱动模块只能用内核函数,不能用非内核空间的C函数库的函数。