对于用户模式应用程序,不正确的页面访问除了应用程序崩溃之外不会造成很多麻烦,并且可以通过异常处理来优雅地完成应用程序崩溃。为什么我们不能对内核崩溃做同样的事情呢?因此,当内核模块尝试访问某些无效地址时,就会出现页面错误并导致内核崩溃。为什么不能像卸载故障模块那样优雅地处理它。
更具体地说,我有兴趣知道这是完全不可能还是可能。我不愿意知道它在使用该系统时可能带来的困难。我知道驱动程序崩溃会导致设备无法使用,我对此表示同意。唯一的问题是是否可以优雅地卸载有故障的驱动程序。
我正在尝试读取我正在工作的模块的配置文件(位于/生成在内核中的特定位置)。
我可以通过使用带有 O_RDONLY 标志(只读)的 filp_open 来读取整个文件,但我想不出一种逐行读取它的方法。
当前代码
f = filp_open("/etc/my_module",O_RDONLY, 0);
if ( f==NULL) {
printk("Error in loading config for birdge.\n");
return 1;
} else {
fs = get_fs();
set_fs(get_ds());
/* read line config here */
f->f_op->read(f, buf, 128, &f->f_pos);
set_fs(fs);
printk("buf:%s\n",buf);
}
Run Code Online (Sandbox Code Playgroud)
Linux 内核版本:3.8.0-29-generic
我想要实现的是将每个(第n)行放入一个缓冲区数组(char *buf[128][128])中,稍后我将使用纯c将参数和值分块。
通过这种方式,配置文件中的变量可以在模块的运行时使用,当然我会进行一些条件检查配置是否正确。
谢谢
我在这里很困惑。他们说linux内核是用C开发的。但据我所知,C库是建立在Linux内核之上的,所以在内核领域,应该还没有C。再说一次,我从 GitHub 上看到的内核代码都是用 C 编写的,并且都带有那些奇怪的包含!对我来说,这就像经典的鸡与蛋的谜题一样。哪一个先存在?
预先感谢您对我的愚蠢问题的耐心。
以下代码:
标题:
// InterruptDescriptorTable.h
#define MAX_IDT_ENTRIES 256
#define MAKELONG(a, b) ((unsigned long) (((unsigned short)(a)) | ((unsigned long) ((unsigned) (b))) << 16 ))
/* SIDT returns IDT in following format */
#pragma pack(1)
typedef struct
{
unsigned short IDTLimit;
unsigned short LowIDTBase;
unsigned short HighIDTBase;
} s_idt_info;
#pragma pack()
/* entry in IDT ( interrupt gate ) */
#pragma pack(1)
typedef struct
{
unsigned short LowOffset;
unsigned short selector;
unsigned char unused_lo;
unsigned char segment_type:4;
unsigned char system_segment_flag:1;
unsigned char DPL:2; …Run Code Online (Sandbox Code Playgroud) 我不确定,我是否完全理解上述差异,所以我想自己解释一下,你可以打断我,因为我弄错了:“内核是创建内核线程。内核线程是由内核管理的进程。用户线程是进程的一部分。如果您有一个单线程进程,那么整个进程本身就是一个用户线程。用户线程进行系统调用这个系统调用由属于调用用户线程的特定内核线程提供服务。因此,对于进行系统调用的每个用户线程,都会创建一个内核线程,并且在内核线程完成其工作后,它将控制权交还给用户线程,然后内核线程被销毁。”
这样可以吗?
谢谢你!
来自德国的许多问候!
powerCommand:
mov si, powerOFF
call printString
;sleep command here
mov ax, 0x1000
mov ax, ss
mov sp, 0xf000
mov ax, 0x5307
mov bx, 0x0001
mov cx, 0x0003
int 0x15
ret
Run Code Online (Sandbox Code Playgroud)
我希望程序等待 1 秒然后继续关闭。目前,它在关闭消息后立即关闭。我在 nasm 制作的自定义操作系统上运行它。
我是 python 的新手。打开 jupyter 笔记本时,我在内核中收到以下错误。我有什么想法可以解决它吗?jupyter 的安装已通过 Anaconda3 完成 - 尝试重新安装和设置环境变量,但到目前为止没有运气。任何帮助将不胜感激。
Traceback (most recent call last):
File "C:\Users\drag88\AppData\Roaming\Python\Python37\site-packages\tornado\web.py", line 1699, in _execute
result = await result
File "C:\Users\drag88\AppData\Roaming\Python\Python37\site-packages\tornado\gen.py", line 742, in run
yielded = self.gen.throw(*exc_info) # type: ignore
File "C:\Users\drag88\AppData\Roaming\Python\Python37\site-packages\notebook\services\sessions\handlers.py", line 72, in post
type=mtype))
File "C:\Users\drag88\AppData\Roaming\Python\Python37\site-packages\tornado\gen.py", line 735, in run
value = future.result()
File "C:\Users\drag88\AppData\Roaming\Python\Python37\site-packages\tornado\gen.py", line 742, in run
yielded = self.gen.throw(*exc_info) # type: ignore
File "C:\Users\drag88\AppData\Roaming\Python\Python37\site-packages\notebook\services\sessions\sessionmanager.py", line 88, in create_session
kernel_id = yield self.start_kernel_for_session(session_id, path, name, type, kernel_name)
File …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 netlink 将结构从用户空间发送到内核空间中的模块,我在用户空间中的结构是:
struct test{
unsigned int length;
char name[MAX_NAME_LENGTH];
};
Run Code Online (Sandbox Code Playgroud)
在内核空间中是:
struct test{
__u32 length;
char name[MAX_NAME_LENGTH];
};
Run Code Online (Sandbox Code Playgroud)
其中MAX_NAME_LENGTH是一个定义为等于 50 的宏。
在用户空间中,我有 main 函数,它使用以下代码将我的结构发送到内核:
int main(){
struct iovec iov[2];
int sock_fd;
struct sockaddr_nl src_add;
struct sockaddr_nl dest_add;
struct nlmsghdr * nl_hdr = NULL;
struct msghdr msg;
struct test message;
memset(&message, 0, sizeof(struct test));
message.length = 18;
strcpy(message.name, "Just a test\0");
sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_USER);
if (sock_fd < 0){
printf("Netlink socket creation failed\n");
return -1;
}
memset(&src_add, …Run Code Online (Sandbox Code Playgroud) 我知道一个进程在用户态和内核态之间切换运行。我很困惑,对于每一行代码,我们都可能需要内核。下面是示例,我能否得到内核在执行以下代码行中的作用的解释。以下是否确实需要内核模式。
如果(a<0)a++