作为程序员,我应该学习如何编写像微软Windows一样的内核
我知道c和c ++,但是我应该怎么做才能编写内核,因此有必要了解linux内核编程的基础知识
如何成为linux和windows内核编程方面的专家
我正在阅读Linux设备驱动程序,并注意到您可以使用printk打印当前行和文件.这是如何实现的?Linux如何跟踪包含printk语句的行?我还没有在用户空间中编写的"普通C代码"中看到类似的功能.
这是LDD3的一个例子:
printk(KERN_DEBUG "Here I am: %s:%i\n", __FILE__, __LINE__);
Run Code Online (Sandbox Code Playgroud)
编辑:正如piokuc所说,这些实际上是标准的宏.GCC文档在这里描述它们:http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html
__CODE__为每一行设置并由预处理器替换为当前行,__CODE__为每个文件设置.
我有这个示例代码:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(void){
printf("%li\n",sizeof(char));
char mytext[20];
read(1,mytext,3);
printf("%s",mytext);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
第一次运行:
koray@koray-VirtualBox:~$ ./a.out
1
pp
pp
koray@koray-VirtualBox:~$
Run Code Online (Sandbox Code Playgroud)
好吧,我认为这是所有预期的,因为p是ASCII中定义的1字节长字符,我正在读取3个字节.(2 p和换行符)在终端中,我再次看到2个字符.
现在让我们尝试一个2字节长的字符:
koray@koray-VirtualBox:~$ ./a.out
1
?
?
Run Code Online (Sandbox Code Playgroud)
我不明白的是,当我将字符'ğ'发送到mytext变量指向的内存时,16位被写入该区域.由于'ğ'是utf-8中的11000100:10011110,因此写入这些字节.
我的问题是,当打印回标准时,C(或者我应该说内核?)知道它应该读取2个字节并解释为1个字符而不是2个1字节字符?
我正在学习OS开发,我处于初级水平.我创建了一个简单的启动加载器 要访问磁盘上的其他文件(比如HDD或USB驱动器),我应该使用哪种寻址模式?(CHS或LBA或INT 13h扩展).
哪种寻址方式非常有效(手段,可以用于大多数驱动器)?
谢谢
如何通过 bash 查看最新的内核版本?是否有任何命令可以从https://www.kernel.org/检查最新内核?
我正在尝试开发一个简单的操作系统.到目前为止,我开发的所有程序都可以在一个处理器中运行.但是当我通过一个名为多处理系统的概念时,几乎所有的最新系统都基于这个概念,我有很多疑问.
首先,如何创建可在多处理器系统中运行的程序.它是硬件导向还是程序员特定的?
其次,我学习了并行编程语言,这在多处理系统中很有用,其中Java是一个但C不是.那么在C(Windows)中开发的操作系统如何才能实现多处理?
谢谢.
为什么内核代码比用户代码运行得更快?我听说用户代码可以用C语言编写,内核代码也可以用C语言编写,例如Windows。那么在内核模式下更快执行的原因是什么?
我想要做的是:
获取所有运行进程的列表:( processName没有.exe)ProcessFullFilePath ProcessMainWindowTitle类似于:
process1 c:\p1.exe TheprocessTitle
..............
Run Code Online (Sandbox Code Playgroud)
非常重要:
我需要工作代码,不会出现任何异常(try catch)
我的代码:
我曾经TLHelp32获得名称列表:
var handler: THandle;
data: TProcessEntry32;
function GetName: string;
var i:byte;
begin
Result := '';
i := 0;
while data.szExeFile[i] <> '' do
begin
Result := Result + data.szExeFile[i];
Inc(i);
end;
end;
begin
Application.ShowMainForm := False;
handler := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if Process32First(handler, data) then
begin
ShowMessage(GetName());
while Process32Next(handler, data) do
ShowMessage(GetName());
end;
Run Code Online (Sandbox Code Playgroud)
这还不够,
我需要:名称路径标题
kernel ×8
linux ×4
c ×3
assembly ×2
bash ×2
bootloader ×1
delphi ×1
disk-access ×1
io ×1
performance ×1
process ×1
user32 ×1
windows ×1
x86 ×1